From a5d58164929af9924031318244579b02c8deccb6 Mon Sep 17 00:00:00 2001 From: akirchhoff-modular Date: Wed, 26 Feb 2025 09:55:53 -0800 Subject: [PATCH 01/44] [Pipelines] Compile multi-model pipelines' models in parallel I observe that pipelines with multiple models (currently mostly vision models) spend a lot of their compilation time pinned to a single core. This is not an efficient use of time. We have two pieces of work, so at least have each one pinned to one core. This slows down each compile from about 70 seconds to 90 seconds, but because those 90 seconds are overlapped, this still saves about 50 seconds overall. MODULAR_ORIG_COMMIT_REV_ID: 9b7b1e12e297132f15c560e9510af673b322f18c --- .clang-format | 2 + .clang-tidy | 57 + .gitattributes | 4 + .github/ISSUE_TEMPLATE/CODEOWNERS | 5 + .github/ISSUE_TEMPLATE/doc_issue.yaml | 5 +- .github/ISSUE_TEMPLATE/max_bug_report.yaml | 55 + .../ISSUE_TEMPLATE/max_builds_bug_report.yaml | 53 + .../ISSUE_TEMPLATE/max_feature_request.yaml | 49 + .gitignore | 149 +- .pre-commit-config.yaml | 26 - CODE_OF_CONDUCT.md | 12 +- LICENSE | 2 +- README.md | 150 +- .../testing => benchmark}/.gitattributes | 0 benchmark/.gitignore | 7 + benchmark/README.md | 163 ++ benchmark/benchmark_serving.py | 1240 ++++++++++ benchmark/pyproject.toml | 32 + benchmark/requirements.txt | 8 + examples/README.md | 65 +- examples/console.py | 179 ++ examples/custom_ops/.gitignore | 1 + examples/custom_ops/README.md | 55 + examples/custom_ops/addition.py | 79 + examples/custom_ops/fused_attention.py | 72 + examples/custom_ops/histogram.py | 77 + examples/custom_ops/kernels/__init__.mojo | 17 + examples/custom_ops/kernels/add_custom.mojo | 82 + .../custom_ops/kernels/fused_attention.mojo | 360 +++ examples/custom_ops/kernels/histogram.mojo | 83 + examples/custom_ops/kernels/mandelbrot.mojo | 92 + .../kernels/matrix_multiplication.mojo | 1007 ++++++++ examples/custom_ops/kernels/top_k.mojo | 229 ++ .../custom_ops/kernels/vector_addition.mojo | 101 + examples/custom_ops/mandelbrot.py | 99 + examples/custom_ops/matrix_multiplication.py | 169 ++ examples/custom_ops/mojoproject.toml | 22 + examples/custom_ops/parametric_addition.py | 82 + examples/custom_ops/top_k.py | 214 ++ examples/custom_ops/vector_addition.py | 92 + examples/gpu_functions/README.md | 50 + examples/gpu_functions/grayscale.mojo | 124 + examples/gpu_functions/mandelbrot.mojo | 129 + examples/gpu_functions/mojoproject.toml | 17 + .../naive_matrix_multiplication.mojo | 110 + examples/gpu_functions/vector_addition.mojo | 93 + examples/graph-api/README.md | 36 + examples/graph-api/basics/README.md | 26 + .../graph-api/basics/basic.\360\237\224\245" | 52 + examples/graph-api/environment.yml | 9 + examples/graph-api/pixi.toml | 15 + examples/graph-api/requirements.txt | 1 + examples/gui/.gitattributes | 2 + examples/gui/.gitignore | 1 + examples/gui/.streamlit/config.toml | 9 + examples/gui/README.md | 13 + examples/gui/home.py | 32 + examples/gui/mojoproject.toml | 39 + examples/gui/pages/bert.py | 151 ++ examples/gui/pages/llama3_1.py | 206 ++ examples/gui/pages/stable-diffusion.py | 136 + examples/gui/pages/yolo.py | 178 ++ examples/gui/ragdata/mojo_functions.txt | 28 + examples/gui/shared.py | 282 +++ examples/inference/README.md | 18 + .../inference/bert-c-torchscript/.gitignore | 7 + .../bert-c-torchscript/CMakeLists.txt | 22 + .../inference/bert-c-torchscript/README.md | 69 + .../bert-c-torchscript/environment.yml | 8 + examples/inference/bert-c-torchscript/main.c | 222 ++ .../inference/bert-c-torchscript/pixi.toml | 25 + .../bert-c-torchscript/post-process.py | 29 + .../bert-c-torchscript/pre-process.py | 63 + examples/inference/bert-c-torchscript/run.sh | 50 + .../inference/bert-mojo-torchscript/README.md | 30 + .../bert-mojo-torchscript/environment.yml | 9 + .../inference/bert-mojo-torchscript/pixi.toml | 24 + .../inference/bert-mojo-torchscript/run.sh | 28 + .../simple_inference.\360\237\224\245" | 127 + .../bert-python-torchscript/.gitignore | 1 + .../bert-python-torchscript/README.md | 47 + .../bert-python-torchscript/environment.yml | 8 + .../bert-python-torchscript/pixi.toml | 24 + .../inference/bert-python-torchscript/run.sh | 28 + .../simple-inference.py | 105 + .../common/bert-torchscript/download-model.py | 91 + .../resnet50-python-torchscript/.gitignore | 1 + .../resnet50-python-torchscript/README.md | 50 + .../download-model.py | 66 + .../environment.yml | 9 + .../input/leatherback_turtle.jpg | Bin 0 -> 364047 bytes .../resnet50-python-torchscript/pixi.toml | 26 + .../resnet50-python-torchscript/run.sh | 28 + .../simple-inference.py | 98 + .../stable-diffusion-mojo-onnx/.gitignore | 1 + .../stable-diffusion-mojo-onnx/README.md | 51 + .../environment.yml | 8 + .../stable-diffusion-mojo-onnx/pixi.toml | 26 + .../python_utils.\360\237\224\245" | 91 + .../stable-diffusion-mojo-onnx/run.sh | 26 + .../scheduler.\360\237\224\245" | 155 ++ .../text_to_image.\360\237\224\245" | 223 ++ .../stable-diffusion-python-onnx/.gitignore | 1 + .../stable-diffusion-python-onnx/README.md | 51 + .../environment.yml | 8 + .../stable-diffusion-python-onnx/pixi.toml | 29 + .../stable-diffusion-python-onnx/run.sh | 27 + .../text_to_image.py | 178 ++ .../inference/yolo-python-onnx/.gitignore | 1 + examples/inference/yolo-python-onnx/README.md | 81 + .../inference/yolo-python-onnx/constants.py | 95 + .../yolo-python-onnx/download-model.py | 51 + .../yolo-python-onnx/environment.yml | 8 + examples/inference/yolo-python-onnx/input.mp4 | Bin 0 -> 1164686 bytes examples/inference/yolo-python-onnx/pixi.toml | 12 + .../yolo-python-onnx/requirements.txt | 8 + examples/inference/yolo-python-onnx/run.sh | 32 + .../inference/yolo-python-onnx/segment.py | 382 +++ examples/lit.cfg.py | 71 - examples/models/README.md | 4 + examples/{ => mojo}/.gitignore | 0 examples/mojo/README.md | 48 + examples/{ => mojo}/check_mod.py | 0 examples/{ => mojo}/deviceinfo.mojo | 0 .../mojo/hello.\360\237\224\245" | 0 examples/{ => mojo}/hello_interop.mojo | 0 examples/{ => mojo}/life/README.md | 0 examples/{ => mojo}/life/benchmark.mojo | 0 examples/{ => mojo}/life/gridv1.mojo | 0 examples/{ => mojo}/life/gridv2.mojo | 0 examples/{ => mojo}/life/lifev1.mojo | 0 examples/{ => mojo}/life/lifev2.mojo | 0 examples/{ => mojo}/life/mojoproject.toml | 0 .../{ => mojo}/life/test/test_gridv1.mojo | 0 .../{ => mojo}/life/test/test_gridv2.mojo | 0 examples/{ => mojo}/mandelbrot.mojo | 0 examples/{ => mojo}/matmul.mojo | 0 examples/{ => mojo}/mojoproject.toml | 0 examples/{ => mojo}/nbody.mojo | 0 examples/{ => mojo}/operators/README.md | 0 examples/{ => mojo}/operators/main.mojo | 0 .../{ => mojo}/operators/mojoproject.toml | 0 examples/{ => mojo}/operators/my_complex.mojo | 0 .../{ => mojo}/operators/test_my_complex.mojo | 0 examples/{ => mojo}/pymatmul.py | 0 examples/{ => mojo}/reduce.mojo | 0 examples/{ => mojo}/simple_interop.py | 0 examples/mojo/testing/.gitattributes | 2 + examples/{ => mojo}/testing/.gitignore | 0 examples/{ => mojo}/testing/README.md | 0 examples/{ => mojo}/testing/mojoproject.toml | 0 examples/{ => mojo}/testing/src/example.mojo | 0 .../testing/src/my_math/__init__.mojo | 0 .../{ => mojo}/testing/src/my_math/utils.mojo | 0 .../testing/test/my_math/test_dec.mojo | 0 .../testing/test/my_math/test_inc.mojo | 0 examples/notebooks/.gitignore | 3 + examples/notebooks/README.md | 68 + examples/notebooks/gemma2b-python-onnx.ipynb | 425 ++++ .../notebooks/mistral7b-python-onnx.ipynb | 404 +++ examples/notebooks/pixi.toml | 13 + .../notebooks/roberta-python-pytorch.ipynb | 389 +++ examples/offline-inference/README.md | 10 + examples/offline-inference/basic.py | 52 + examples/offline-inference/pixi.toml | 14 + magic.lock | 2197 ----------------- {.github => mojo/.github}/CODEOWNERS | 0 mojo/.github/ISSUE_TEMPLATE/doc_issue.yaml | 50 + .../ISSUE_TEMPLATE/mojo_bug_report.yaml | 0 .../ISSUE_TEMPLATE/mojo_feature_request.yaml | 0 .../.github}/PULL_REQUEST_TEMPLATE.md | 0 .../.github}/workflows/check_pr_target.yml | 0 .../.github}/workflows/check_pr_title.yml | 0 .../standard_library_tests_and_examples.yml | 0 .../.github}/workflows/test_pre_commit.yml | 0 mojo/CODE_OF_CONDUCT.md | 71 + CONTRIBUTING.md => mojo/CONTRIBUTING.md | 0 mojo/LICENSE | 235 ++ mojo/README.md | 113 + {docs => mojo/docs}/README.md | 0 {docs => mojo/docs}/changelog-released.md | 0 {docs => mojo/docs}/changelog.md | 0 {docs => mojo/docs}/faq.md | 0 .../docs}/images/dynamic-vector-capacity.png | Bin {docs => mojo/docs}/images/let-to-var.png | Bin {docs => mojo/docs}/images/vectorize-fix.png | Bin {docs => mojo/docs}/lib.mdx | 0 {docs => mojo/docs}/manual/basics.mdx | 0 {docs => mojo/docs}/manual/control-flow.mdx | 0 .../docs}/manual/decorators/always-inline.md | 0 .../docs}/manual/decorators/copy-capture.md | 0 .../docs}/manual/decorators/implicit.md | 0 .../docs}/manual/decorators/index.mdx | 0 .../manual/decorators/nonmaterializable.md | 0 .../docs}/manual/decorators/parameter.md | 0 .../manual/decorators/register-passable.md | 0 .../docs}/manual/decorators/staticmethod.md | 0 .../docs}/manual/decorators/value.md | 0 {docs => mojo/docs}/manual/errors.mdx | 0 {docs => mojo/docs}/manual/functions.mdx | 0 {docs => mojo/docs}/manual/get-started.mdx | 0 .../manual/images/game-of-life-screen.png | Bin .../docs}/manual/images/mojo-vscode.png | Bin .../images/owned-pointer-diagram-dark.png | Bin .../manual/images/owned-pointer-diagram.png | Bin .../manual/images/pointer-diagram-dark.png | Bin .../docs}/manual/images/pointer-diagram.png | Bin .../manual/images/pointer-lifecycle-dark.png | Bin .../docs}/manual/images/pointer-lifecycle.png | Bin .../manual/images/pointer-offset-dark.png | Bin .../docs}/manual/images/pointer-offset.png | Bin .../images/strided-load-storage-dark.png | Bin .../manual/images/strided-load-storage.png | Bin {docs => mojo/docs}/manual/index.md | 0 .../docs}/manual/lifecycle/death.mdx | 0 .../docs}/manual/lifecycle/index.mdx | 0 {docs => mojo/docs}/manual/lifecycle/life.mdx | 0 {docs => mojo/docs}/manual/operators.mdx | 0 {docs => mojo/docs}/manual/packages.md | 0 .../docs}/manual/parameters/index.mdx | 0 {docs => mojo/docs}/manual/pointers/index.mdx | 0 .../docs}/manual/pointers/unsafe-pointers.mdx | 0 {docs => mojo/docs}/manual/python/index.mdx | 0 {docs => mojo/docs}/manual/python/types.mdx | 0 {docs => mojo/docs}/manual/structs.mdx | 0 {docs => mojo/docs}/manual/traits.mdx | 0 {docs => mojo/docs}/manual/types.mdx | 0 {docs => mojo/docs}/manual/values/index.mdx | 0 .../docs}/manual/values/lifetimes.mdx | 0 .../docs}/manual/values/ownership.mdx | 0 .../docs}/manual/values/value-semantics.mdx | 0 {docs => mojo/docs}/manual/variables.mdx | 0 {docs => mojo/docs}/roadmap.md | 0 {docs => mojo/docs}/tools/debugging.mdx | 0 .../docs}/tools/images/break-on-raise.png | Bin .../tools/images/breakpoint-hit-count.png | Bin .../docs}/tools/images/debug-toolbar.png | Bin .../images/debugger-call-stack-nested1.png | Bin .../docs}/tools/images/debugger-variables.png | Bin .../images/launch-configuration-menu.png | Bin .../quick-run-or-debug-button-debug.png | Bin .../images/quick-run-or-debug-button.png | Bin .../tools/images/quick-run-or-debug-menu.png | Bin .../docs}/tools/images/run-and-debug-icon.png | Bin .../docs}/tools/images/run-and-debug-view.png | Bin .../docs}/tools/images/run-start-view.png | Bin {docs => mojo/docs}/tools/testing.mdx | 0 {docs => mojo/docs}/why-mojo.md | 0 pixi.toml => mojo/pixi.toml | 0 {proposals => mojo/proposals}/README.md | 0 .../proposals}/always_inline_builtin.md | 0 .../proposals}/byte-as-uint8.md | 0 .../proposals}/improved-hash-module.md | 0 .../proposals}/inferred-parameters.md | 0 .../proposals}/lifetimes-and-provenance.md | 0 .../proposals}/lifetimes-keyword-renaming.md | 0 .../proposals}/mojo-and-dynamism.md | 0 .../proposals}/opt-in-implicit-conversion.md | 0 .../project-manifest-and-build-tool.md | 0 .../proposals}/ref-convention.md | 0 .../proposals}/remove-let-decls.md | 0 .../proposals}/stdlib-insider-docs.md | 0 .../proposals}/value-ownership.md | 0 {stdlib => mojo/stdlib}/README.md | 0 {stdlib => mojo/stdlib}/benchmarks/README.md | 0 .../algorithm/bench_elementwise.mojo | 0 .../stdlib}/benchmarks/builtin/bench_int.mojo | 0 .../benchmarks/builtin/bench_sort.mojo | 0 .../benchmarks/collections/bench_dict.mojo | 0 .../benchmarks/collections/bench_string.mojo | 0 .../benchmarks/collections/data/README.md | 0 .../collections/data/UN_charter_AR.html | 0 .../collections/data/UN_charter_AR.txt | 0 .../collections/data/UN_charter_EN.html | 0 .../collections/data/UN_charter_EN.txt | 0 .../collections/data/UN_charter_ES.html | 0 .../collections/data/UN_charter_ES.txt | 0 .../collections/data/UN_charter_RU.html | 0 .../collections/data/UN_charter_RU.txt | 0 .../collections/data/UN_charter_zh-CN.html | 0 .../collections/data/UN_charter_zh-CN.txt | 0 .../benchmarks/hashlib/bench_hash.mojo | 0 {stdlib => mojo/stdlib}/benchmarks/lit.cfg.py | 0 .../stdlib}/benchmarks/math/bench_math.mojo | 0 .../benchmarks/utils/bench_formatter.mojo | 0 .../benchmarks/utils/bench_memmem.mojo | 0 {stdlib => mojo/stdlib}/docs/development.md | 0 .../stdlib}/docs/docstring-style-guide.md | 0 {stdlib => mojo/stdlib}/docs/faq.md | 0 .../stdlib}/docs/governance-structure.md | 0 .../stdlib}/docs/images/create-fork.png | Bin .../docs/images/doc-lint-quick-fix.png | Bin .../stdlib}/docs/images/nightly-extension.png | Bin .../stdlib}/docs/internal/README.md | 0 .../stdlib}/docs/internal/compiler.md | 0 {stdlib => mojo/stdlib}/docs/internal/mlir.md | 0 .../stdlib}/docs/internal/runtime.md | 0 {stdlib => mojo/stdlib}/docs/roadmap.md | 0 {stdlib => mojo/stdlib}/docs/style-guide.md | 0 {stdlib => mojo/stdlib}/docs/vision.md | 0 .../stdlib}/scripts/.markdownlint.yaml | 0 .../stdlib}/scripts/build-stdlib.sh | 0 .../stdlib}/scripts/check-docstrings.py | 0 .../stdlib}/scripts/check_licenses.mojo | 0 .../scripts/install-build-tools-linux.sh | 0 .../scripts/install-build-tools-macos.sh | 0 .../stdlib}/scripts/markdownlint.sh | 0 .../stdlib}/scripts/run-benchmarks.sh | 0 {stdlib => mojo/stdlib}/scripts/run-tests.sh | 0 {stdlib => mojo/stdlib}/src/__init__.mojo | 0 .../stdlib}/src/base64/__init__.mojo | 0 .../stdlib}/src/base64/_b64encode.mojo | 0 .../stdlib}/src/base64/base64.mojo | 0 {stdlib => mojo/stdlib}/src/bit/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/bit/bit.mojo | 0 .../stdlib}/src/builtin/__init__.mojo | 0 .../stdlib}/src/builtin/_closure.mojo | 0 .../stdlib}/src/builtin/_format_float.mojo | 0 .../stdlib}/src/builtin/_location.mojo | 0 .../stdlib}/src/builtin/_pybind.mojo | 0 .../stdlib}/src/builtin/_startup.mojo | 0 .../stdlib}/src/builtin/_stubs.mojo | 0 .../stdlib}/src/builtin/anytype.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/bool.mojo | 0 .../stdlib}/src/builtin/breakpoint.mojo | 0 .../stdlib}/src/builtin/builtin_list.mojo | 0 .../stdlib}/src/builtin/builtin_slice.mojo | 0 .../stdlib}/src/builtin/comparable.mojo | 0 .../stdlib}/src/builtin/constrained.mojo | 0 .../stdlib}/src/builtin/coroutine.mojo | 0 .../stdlib}/src/builtin/debug_assert.mojo | 0 .../stdlib}/src/builtin/dtype.mojo | 0 .../src/builtin/equality_comparable.mojo | 0 .../stdlib}/src/builtin/error.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/file.mojo | 0 .../stdlib}/src/builtin/file_descriptor.mojo | 0 .../stdlib}/src/builtin/float_literal.mojo | 0 .../stdlib}/src/builtin/floatable.mojo | 0 .../stdlib}/src/builtin/format_int.mojo | 0 .../stdlib}/src/builtin/identifiable.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/int.mojo | 0 .../stdlib}/src/builtin/int_literal.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/io.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/len.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/math.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/none.mojo | 0 .../stdlib}/src/builtin/object.mojo | 0 .../stdlib}/src/builtin/range.mojo | 0 .../stdlib}/src/builtin/rebind.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/repr.mojo | 0 .../stdlib}/src/builtin/reversed.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/simd.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/sort.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/str.mojo | 0 .../stdlib}/src/builtin/string_literal.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/swap.mojo | 0 .../stdlib}/src/builtin/tuple.mojo | 0 .../stdlib}/src/builtin/type_aliases.mojo | 0 {stdlib => mojo/stdlib}/src/builtin/uint.mojo | 0 .../stdlib}/src/builtin/value.mojo | 0 .../stdlib}/src/collections/__init__.mojo | 0 .../src/collections/_index_normalization.mojo | 0 .../stdlib}/src/collections/counter.mojo | 0 .../stdlib}/src/collections/deque.mojo | 0 .../stdlib}/src/collections/dict.mojo | 0 .../stdlib}/src/collections/inline_array.mojo | 0 .../stdlib}/src/collections/inline_list.mojo | 0 .../stdlib}/src/collections/interval.mojo | 0 .../stdlib}/src/collections/linked_list.mojo | 0 .../stdlib}/src/collections/list.mojo | 0 .../stdlib}/src/collections/optional.mojo | 0 .../stdlib}/src/collections/set.mojo | 0 .../src/collections/string/__init__.mojo | 0 .../src/collections/string/_unicode.mojo | 0 .../collections/string/_unicode_lookups.mojo | 0 .../collections/string/_utf8_validation.mojo | 0 .../src/collections/string/codepoint.mojo | 0 .../src/collections/string/format.mojo | 0 .../src/collections/string/inline_string.mojo | 0 .../src/collections/string/string.mojo | 0 .../src/collections/string/string_slice.mojo | 0 .../stdlib}/src/collections/vector.mojo | 0 .../stdlib}/src/documentation/__init__.mojo | 0 .../src/documentation/documentation.mojo | 0 .../stdlib}/src/hashlib/__init__.mojo | 0 .../stdlib}/src/hashlib/_ahash.mojo | 0 .../stdlib}/src/hashlib/_hasher.mojo | 0 {stdlib => mojo/stdlib}/src/hashlib/hash.mojo | 0 .../stdlib}/src/math/__init__.mojo | 0 .../stdlib}/src/math/constants.mojo | 0 {stdlib => mojo/stdlib}/src/math/math.mojo | 0 .../stdlib}/src/math/polynomial.mojo | 0 .../stdlib}/src/memory/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/memory/arc.mojo | 0 .../src/memory/maybe_uninitialized.mojo | 0 .../stdlib}/src/memory/memory.mojo | 0 .../stdlib}/src/memory/owned_pointer.mojo | 0 .../stdlib}/src/memory/pointer.mojo | 0 {stdlib => mojo/stdlib}/src/memory/span.mojo | 0 .../stdlib}/src/memory/unsafe.mojo | 0 .../stdlib}/src/memory/unsafe_pointer.mojo | 0 {stdlib => mojo/stdlib}/src/os/__init__.mojo | 0 .../stdlib}/src/os/_linux_aarch64.mojo | 0 .../stdlib}/src/os/_linux_x86.mojo | 0 {stdlib => mojo/stdlib}/src/os/_macos.mojo | 0 {stdlib => mojo/stdlib}/src/os/_windows.mojo | 0 {stdlib => mojo/stdlib}/src/os/atomic.mojo | 0 {stdlib => mojo/stdlib}/src/os/env.mojo | 0 {stdlib => mojo/stdlib}/src/os/fstat.mojo | 0 {stdlib => mojo/stdlib}/src/os/os.mojo | 0 .../stdlib}/src/os/path/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/os/path/path.mojo | 0 {stdlib => mojo/stdlib}/src/os/pathlike.mojo | 0 .../stdlib}/src/pathlib/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/pathlib/path.mojo | 0 .../stdlib}/src/prelude/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/pwd/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/pwd/_linux.mojo | 0 {stdlib => mojo/stdlib}/src/pwd/_macos.mojo | 0 {stdlib => mojo/stdlib}/src/pwd/pwd.mojo | 0 .../stdlib}/src/python/__init__.mojo | 0 .../stdlib}/src/python/_bindings.mojo | 0 .../stdlib}/src/python/_cpython.mojo | 0 .../stdlib}/src/python/python.mojo | 0 .../stdlib}/src/python/python_object.mojo | 0 .../stdlib}/src/random/__init__.mojo | 0 .../stdlib}/src/random/random.mojo | 0 .../stdlib}/src/stat/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/stat/stat.mojo | 0 {stdlib => mojo/stdlib}/src/sys/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/sys/_amdgpu.mojo | 0 .../stdlib}/src/sys/_assembly.mojo | 0 {stdlib => mojo/stdlib}/src/sys/_build.mojo | 0 {stdlib => mojo/stdlib}/src/sys/_io.mojo | 0 {stdlib => mojo/stdlib}/src/sys/_libc.mojo | 0 {stdlib => mojo/stdlib}/src/sys/arg.mojo | 0 {stdlib => mojo/stdlib}/src/sys/compile.mojo | 0 {stdlib => mojo/stdlib}/src/sys/debug.mojo | 0 {stdlib => mojo/stdlib}/src/sys/ffi.mojo | 0 {stdlib => mojo/stdlib}/src/sys/info.mojo | 0 .../stdlib}/src/sys/intrinsics.mojo | 0 .../stdlib}/src/sys/param_env.mojo | 0 .../stdlib}/src/sys/terminate.mojo | 0 .../stdlib}/src/tempfile/__init__.mojo | 0 .../stdlib}/src/tempfile/tempfile.mojo | 0 .../stdlib}/src/testing/__init__.mojo | 0 .../stdlib}/src/testing/testing.mojo | 0 .../stdlib}/src/time/__init__.mojo | 0 {stdlib => mojo/stdlib}/src/time/time.mojo | 0 .../stdlib}/src/utils/__init__.mojo | 0 .../stdlib}/src/utils/_select.mojo | 0 .../stdlib}/src/utils/_serialize.mojo | 0 .../stdlib}/src/utils/_visualizers.mojo | 0 {stdlib => mojo/stdlib}/src/utils/index.mojo | 0 {stdlib => mojo/stdlib}/src/utils/lock.mojo | 0 {stdlib => mojo/stdlib}/src/utils/loop.mojo | 0 .../stdlib}/src/utils/numerics.mojo | 0 .../stdlib}/src/utils/static_tuple.mojo | 0 .../stdlib}/src/utils/variant.mojo | 0 {stdlib => mojo/stdlib}/src/utils/write.mojo | 0 .../stdlib}/test/base64/test_base64.mojo | 0 .../stdlib}/test/bit/test_bit.mojo | 0 .../stdlib}/test/builtin/test_any_all.mojo | 0 .../stdlib}/test/builtin/test_bfloat16.mojo | 0 .../stdlib}/test/builtin/test_bool.mojo | 0 .../test/builtin/test_debug_assert.mojo | 0 .../test_debug_assert_default_error.mojo | 0 .../builtin/test_debug_assert_mode_all.mojo | 0 .../test_debug_assert_mode_all_error.mojo | 0 .../builtin/test_debug_assert_mode_none.mojo | 0 .../builtin/test_debug_assert_warning.mojo | 0 .../builtin/test_deprecation_warnings.mojo | 0 .../stdlib}/test/builtin/test_dtype.mojo | 0 .../stdlib}/test/builtin/test_error.mojo | 0 .../stdlib}/test/builtin/test_file.mojo | 0 .../test/builtin/test_file_dummy_input.txt | 0 .../test/builtin/test_float_literal.mojo | 0 .../test/builtin/test_format_float.mojo | 0 .../stdlib}/test/builtin/test_format_int.mojo | 0 .../stdlib}/test/builtin/test_int.mojo | 0 .../test/builtin/test_int_literal.mojo | 0 .../stdlib}/test/builtin/test_issue_1004.mojo | 0 .../stdlib}/test/builtin/test_issue_1505.mojo | 0 .../stdlib}/test/builtin/test_issue_3908.mojo | 0 .../test/builtin/test_list_literal.mojo | 0 .../stdlib}/test/builtin/test_location.mojo | 0 .../stdlib}/test/builtin/test_math.mojo | 0 .../stdlib}/test/builtin/test_none.mojo | 0 .../stdlib}/test/builtin/test_object.mojo | 0 .../stdlib}/test/builtin/test_print.mojo | 0 .../test/builtin/test_print_long_string.mojo | 0 .../test/builtin/test_print_stderr.mojo | 0 .../stdlib}/test/builtin/test_range.mojo | 0 .../builtin/test_range_out_of_bounds.mojo | 0 .../test_range_uint_reverse_range_bad.mojo | 0 .../stdlib}/test/builtin/test_rebind.mojo | 0 .../stdlib}/test/builtin/test_repr.mojo | 0 .../stdlib}/test/builtin/test_reversed.mojo | 0 .../stdlib}/test/builtin/test_simd.mojo | 0 .../stdlib}/test/builtin/test_slice.mojo | 0 .../stdlib}/test/builtin/test_sort.mojo | 0 .../test/builtin/test_sort_issue_1018.mojo | 0 .../stdlib}/test/builtin/test_stdin.mojo | 0 .../stdlib}/test/builtin/test_str.mojo | 0 .../test/builtin/test_string_literal.mojo | 0 .../stdlib}/test/builtin/test_swap.mojo | 0 .../stdlib}/test/builtin/test_tuple.mojo | 0 .../stdlib}/test/builtin/test_uint.mojo | 0 .../stdlib}/test/builtin/test_uint_error.mojo | 0 .../string/test_inlined_string.mojo | 0 .../test/collections/string/test_string.mojo | 0 .../collections/string/test_string_slice.mojo | 0 .../test/collections/string/test_unicode.mojo | 0 .../test/collections/test_codepoint.mojo | 0 .../test/collections/test_counter.mojo | 0 .../stdlib}/test/collections/test_deque.mojo | 0 .../stdlib}/test/collections/test_dict.mojo | 0 .../collections/test_index_normalization.mojo | 0 .../test/collections/test_inline_array.mojo | 0 .../test/collections/test_inline_list.mojo | 0 .../test/collections/test_interval.mojo | 0 .../test/collections/test_linked_list.mojo | 0 .../stdlib}/test/collections/test_list.mojo | 0 .../test_list_getitem_invalid_index.mojo | 0 .../test/collections/test_optional.mojo | 0 .../stdlib}/test/collections/test_set.mojo | 0 .../stdlib}/test/collections/test_vector.mojo | 0 .../stdlib}/test/hashlib/test_ahash.mojo | 0 .../stdlib}/test/hashlib/test_hash.mojo | 0 .../stdlib}/test/hashlib/test_hasher.mojo | 0 {stdlib => mojo/stdlib}/test/lit.cfg.py | 0 .../stdlib}/test/memory/test_arc.mojo | 0 .../stdlib}/test/memory/test_bitcast.mojo | 0 .../test/memory/test_maybe_uninitialized.mojo | 0 .../stdlib}/test/memory/test_memory.mojo | 0 .../test/memory/test_owned_pointer.mojo | 0 .../stdlib}/test/memory/test_reference.mojo | 0 .../stdlib}/test/memory/test_span.mojo | 0 .../test/memory/test_unsafepointer.mojo | 0 .../stdlib}/test/os/path/test_basename.mojo | 0 .../stdlib}/test/os/path/test_dirname.mojo | 0 .../stdlib}/test/os/path/test_exists.mojo | 0 .../stdlib}/test/os/path/test_expanduser.mojo | 0 .../stdlib}/test/os/path/test_expandvars.mojo | 0 .../stdlib}/test/os/path/test_getsize.mojo | 0 .../stdlib}/test/os/path/test_isdir.mojo | 0 .../stdlib}/test/os/path/test_isfile.mojo | 0 .../stdlib}/test/os/path/test_islink.mojo | 0 .../stdlib}/test/os/path/test_join.mojo | 0 .../stdlib}/test/os/path/test_split.mojo | 0 .../stdlib}/test/os/path/test_splitroot.mojo | 0 .../stdlib}/test/os/test_atomic.mojo | 0 {stdlib => mojo/stdlib}/test/os/test_env.mojo | 0 .../stdlib}/test/os/test_listdir.mojo | 0 .../stdlib}/test/os/test_mkdir_and_rmdir.mojo | 0 .../stdlib}/test/os/test_no_trap.mojo | 0 .../stdlib}/test/os/test_remove.mojo | 0 .../stdlib}/test/os/test_stat.mojo | 0 .../stdlib}/test/os/test_trap.mojo | 0 .../stdlib}/test/os/test_trap_stringable.mojo | 0 .../stdlib}/test/pathlib/test_pathlib.mojo | 0 .../stdlib}/test/pwd/test_pwd.mojo | 0 .../stdlib}/test/python/custom_indexable.py | 0 ..._for_test_python_object_dunder_contains.py | 0 .../stdlib}/test/python/my_module.py | 0 .../stdlib}/test/python/test_ownership.mojo | 0 .../test/python/test_python_cpython.mojo | 0 .../python/test_python_error_handling.mojo | 0 .../stdlib}/test/python/test_python_info.mojo | 0 .../test/python/test_python_interop.mojo | 0 .../python/test_python_module_create.mojo | 0 .../test/python/test_python_object.mojo | 0 .../test_python_object_dunder_contains.mojo | 0 .../python/test_python_object_len_raises.mojo | 0 .../test/python/test_python_to_mojo.mojo | 0 .../stdlib}/test/random/test_random.mojo | 0 .../stdlib}/test/sys/test_aarch64_target.mojo | 0 .../test/sys/test_build_info_debug.mojo | 0 .../stdlib}/test/sys/test_c_types.mojo | 0 .../stdlib}/test/sys/test_compile.mojo | 0 .../stdlib}/test/sys/test_compile_debug.mojo | 0 .../stdlib}/test/sys/test_dlhandle.mojo | 0 .../stdlib}/test/sys/test_exit_0.mojo | 0 .../stdlib}/test/sys/test_exit_1.mojo | 0 .../stdlib}/test/sys/test_intrinsics.mojo | 0 .../test/sys/test_invalid_paramenv.mojo | 0 .../stdlib}/test/sys/test_linux_target.mojo | 0 .../stdlib}/test/sys/test_macos_target.mojo | 0 .../stdlib}/test/sys/test_paramenv.mojo | 0 .../stdlib}/test/sys/test_sizeof.mojo | 0 .../stdlib}/test/sys/test_targetinfo.mojo | 0 .../stdlib}/test/sys/test_windows_target.mojo | 0 .../stdlib}/test/tempfile/test_tempfile.mojo | 0 .../stdlib}/test/test_utils/__init__.mojo | 0 .../stdlib}/test/test_utils/test_utils.mojo | 0 .../stdlib}/test/test_utils/types.mojo | 0 .../test/testing/test_assert_raises.mojo | 0 .../stdlib}/test/testing/test_assertion.mojo | 0 .../stdlib}/test/time/test_time.mojo | 0 .../stdlib}/test/utils/issue_13632.mojo | 0 .../stdlib}/test/utils/test_index.mojo | 0 .../stdlib}/test/utils/test_numerics.mojo | 0 .../stdlib}/test/utils/test_select.mojo | 0 .../stdlib}/test/utils/test_static_tuple.mojo | 0 .../stdlib}/test/utils/test_tuple.mojo | 0 .../stdlib}/test/utils/test_unroll.mojo | 0 .../stdlib}/test/utils/test_variant.mojo | 0 .../stdlib}/test/utils/test_write.mojo | 0 .../test/utils/test_write_to_stdout.mojo | 0 pyproject.toml | 14 + src/max/Dockerfile.cpu | 46 + src/max/Dockerfile.cuda-simple | 50 + src/max/Dockerfile.cuda-small | 63 + src/max/README.md | 41 + src/max/entrypoints/cli/__init__.py | 51 + src/max/entrypoints/cli/config.py | 202 ++ src/max/entrypoints/cli/device_options.py | 90 + src/max/entrypoints/cli/encode.py | 97 + src/max/entrypoints/cli/entrypoint.py | 34 + src/max/entrypoints/cli/generate.py | 156 ++ src/max/entrypoints/cli/list.py | 64 + src/max/entrypoints/cli/metrics.py | 225 ++ src/max/entrypoints/cli/serve.py | 115 + src/max/entrypoints/llm.py | 185 ++ src/max/entrypoints/pipelines.py | 274 ++ src/max/pipelines/README.md | 119 + src/max/pipelines/__init__.py | 98 + src/max/pipelines/architectures/__init__.py | 49 + .../deepseekV2/layers/__init__.py | 14 + .../deepseekV2/layers/moe_gate.py | 82 + .../architectures/exaone/__init__.py | 16 + .../pipelines/architectures/exaone/arch.py | 59 + .../architectures/exaone/weight_adapters.py | 56 + .../architectures/granite/__init__.py | 16 + .../pipelines/architectures/granite/arch.py | 55 + .../pipelines/architectures/granite/model.py | 38 + .../pipelines/architectures/llama3/README.md | 134 + .../architectures/llama3/__init__.py | 16 + .../pipelines/architectures/llama3/arch.py | 66 + .../pipelines/architectures/llama3/config.py | 54 + .../pipelines/architectures/llama3/gguf.py | 468 ++++ .../pipelines/architectures/llama3/llama3.py | 198 ++ .../pipelines/architectures/llama3/model.py | 817 ++++++ .../architectures/llama3/naive_llama3.py | 317 +++ .../architectures/llama3/weight_adapters.py | 289 +++ .../architectures/llama_vision/README.md | 138 ++ .../architectures/llama_vision/__init__.py | 16 + .../architectures/llama_vision/arch.py | 36 + .../architectures/llama_vision/attention.py | 107 + .../llama_vision/cross_attention_decoder.py | 173 ++ .../architectures/llama_vision/encoder.py | 105 + .../llama_vision/language_model.py | 468 ++++ .../llama_vision/llama_vision.py | 1184 +++++++++ .../architectures/llama_vision/mlp.py | 36 + .../llama_vision/positional_embedding.py | 131 + .../llama_vision/vision_model.py | 741 ++++++ .../pipelines/architectures/mistral/README.md | 129 + .../architectures/mistral/__init__.py | 19 + .../pipelines/architectures/mistral/arch.py | 36 + .../pipelines/architectures/mistral/graph.py | 253 ++ .../pipelines/architectures/mistral/model.py | 254 ++ .../pipelines/architectures/mpnet/__init__.py | 16 + src/max/pipelines/architectures/mpnet/arch.py | 38 + .../pipelines/architectures/mpnet/graph.py | 493 ++++ .../pipelines/architectures/mpnet/model.py | 200 ++ .../pipelines/architectures/olmo/__init__.py | 16 + src/max/pipelines/architectures/olmo/arch.py | 52 + src/max/pipelines/architectures/olmo/model.py | 32 + .../pipelines/architectures/phi3/__init__.py | 16 + src/max/pipelines/architectures/phi3/arch.py | 52 + src/max/pipelines/architectures/phi3/model.py | 33 + .../pipelines/architectures/pixtral/README.md | 134 + .../architectures/pixtral/__init__.py | 16 + .../pipelines/architectures/pixtral/arch.py | 39 + .../architectures/pixtral/llava/__init__.py | 14 + .../architectures/pixtral/llava/llava.py | 178 ++ .../pixtral/llava/llava_decoder.py | 128 + .../pixtral/llava/llava_projector.py | 34 + .../architectures/pixtral/model/graph.py | 311 +++ .../pixtral/model/mistral_graph.py | 236 ++ .../architectures/pixtral/pixtral.py | 362 +++ .../pixtral/vision_encoder/__init__.py | 14 + .../pixtral/vision_encoder/attention.py | 139 ++ .../pixtral/vision_encoder/attention_utils.py | 125 + .../pixtral/vision_encoder/graph.py | 218 ++ .../vision_encoder/rotary_embedding_2d.py | 200 ++ .../pixtral/vision_encoder/transformer.py | 113 + .../pixtral/vision_encoder/vision_encoder.py | 93 + .../pipelines/architectures/qwen2/README.md | 120 + .../pipelines/architectures/qwen2/__init__.py | 16 + src/max/pipelines/architectures/qwen2/arch.py | 47 + .../pipelines/architectures/qwen2/graph.py | 309 +++ .../pipelines/architectures/qwen2/model.py | 498 ++++ .../pipelines/architectures/replit/README.md | 119 + .../architectures/replit/__init__.py | 16 + .../pipelines/architectures/replit/arch.py | 39 + .../pipelines/architectures/replit/graph.py | 204 ++ .../pipelines/architectures/replit/model.py | 316 +++ .../architectures/whisper/encoder.py | 187 ++ .../pipelines/architectures/whisper/graph.py | 294 +++ .../pipelines/architectures/whisper/model.py | 81 + src/max/pipelines/config.py | 1093 ++++++++ src/max/pipelines/context.py | 294 +++ src/max/pipelines/dataprocessing/__init__.py | 30 + .../dataprocessing/causal_attention_mask.py | 67 + .../causal_attention_mask_with_alibi.py | 68 + .../pipelines/dataprocessing/collate_batch.py | 120 + .../dataprocessing/max_tokens_to_generate.py | 24 + src/max/pipelines/embeddings_pipeline.py | 86 + src/max/pipelines/hf_pipeline.py | 384 +++ src/max/pipelines/hf_utils.py | 56 + src/max/pipelines/interfaces/__init__.py | 42 + .../interfaces/embeddings_generation.py | 39 + .../max/pipelines/interfaces/tasks.py | 16 +- .../pipelines/interfaces/text_generation.py | 277 +++ src/max/pipelines/kv_cache/__init__.py | 183 ++ src/max/pipelines/kv_cache/_utils.py | 33 + src/max/pipelines/kv_cache/cache_params.py | 84 + .../kv_cache/continuous_batching_cache.py | 405 +++ src/max/pipelines/kv_cache/hf.py | 149 ++ src/max/pipelines/kv_cache/manager.py | 542 ++++ src/max/pipelines/kv_cache/naive_cache.py | 216 ++ src/max/pipelines/kv_cache/paged_cache.py | 746 ++++++ .../kv_cache/paged_cache_metadata.py | 171 ++ src/max/pipelines/kv_cache/prefix_cache.py | 369 +++ src/max/pipelines/kv_cache/radix_trie.py | 479 ++++ src/max/pipelines/kv_cache/simple_trie.py | 152 ++ src/max/pipelines/nn/__init__.py | 88 + src/max/pipelines/nn/_identity.py | 71 + src/max/pipelines/nn/attention/__init__.py | 44 + src/max/pipelines/nn/attention/attention.py | 157 ++ .../nn/attention/attention_with_rope.py | 626 +++++ .../nn/attention/attention_without_mask.py | 74 + src/max/pipelines/nn/attention/clamp.py | 22 + src/max/pipelines/nn/attention/interfaces.py | 288 +++ .../nn/attention/naive_attention_with_rope.py | 223 ++ src/max/pipelines/nn/comm/__init__.py | 18 + src/max/pipelines/nn/comm/allreduce.py | 51 + .../pipelines/nn/compute_log_probabilities.py | 101 + src/max/pipelines/nn/conv.py | 177 ++ src/max/pipelines/nn/embedding.py | 255 ++ src/max/pipelines/nn/hooks/__init__.py | 20 + src/max/pipelines/nn/hooks/base_print_hook.py | 159 ++ src/max/pipelines/nn/hooks/identity.py | 71 + src/max/pipelines/nn/hooks/print_hook.py | 91 + .../pipelines/nn/hooks/torch_print_hook.py | 69 + src/max/pipelines/nn/kernels.py | 910 +++++++ src/max/pipelines/nn/layer/__init__.py | 30 + src/max/pipelines/nn/layer/layer.py | 423 ++++ src/max/pipelines/nn/layer/layer_list.py | 77 + src/max/pipelines/nn/linear.py | 555 +++++ src/max/pipelines/nn/norm/__init__.py | 23 + src/max/pipelines/nn/norm/layer_norm.py | 75 + src/max/pipelines/nn/norm/rms_norm.py | 64 + src/max/pipelines/nn/rotary_embedding.py | 156 ++ src/max/pipelines/nn/sequential.py | 20 + src/max/pipelines/nn/transformer/__init__.py | 29 + .../nn/transformer/distributed_transformer.py | 149 ++ .../nn/transformer/naive_transformer.py | 139 ++ .../pipelines/nn/transformer/transformer.py | 162 ++ src/max/pipelines/pipeline.py | 739 ++++++ src/max/pipelines/registry.py | 1045 ++++++++ src/max/pipelines/requirements.txt | 38 + src/max/pipelines/response.py | 102 + src/max/pipelines/sampling.py | 95 + src/max/pipelines/tokenizer.py | 518 ++++ src/max/pixi.toml | 17 + tutorials/README.md | 4 + tutorials/deploy-aws-kubernetes/README.md | 6 + tutorials/deploy-aws-kubernetes/client.py | 63 + .../deploy-cloudformation-sagemaker/README.md | 7 + .../deploy-cloudformation-sagemaker/client.py | 116 + tutorials/hello-magic/.gitattributes | 2 + tutorials/hello-magic/.gitignore | 5 + tutorials/hello-magic/hello.mojo | 16 + tutorials/hello-magic/local/.gitattributes | 2 + tutorials/hello-magic/local/.gitignore | 5 + tutorials/hello-magic/local/__init__.mojo | 14 + tutorials/hello-magic/local/mojoproject.toml | 13 + tutorials/hello-magic/local/zero.mojo | 23 + tutorials/hello-magic/main.py | 47 + tutorials/hello-magic/mojoproject.toml | 30 + tutorials/helm/max-openai-api/.helmignore | 19 + tutorials/helm/max-openai-api/Chart.yaml | 28 + tutorials/helm/max-openai-api/README.md | 193 ++ .../helm/max-openai-api/README.md.gotmpl | 112 + .../helm/max-openai-api/templates/NOTES.txt | 22 + .../max-openai-api/templates/_helpers.tpl | 43 + .../max-openai-api/templates/deployment.yaml | 181 ++ .../helm/max-openai-api/templates/hpa.yaml | 47 + .../max-openai-api/templates/ingress.yaml | 57 + .../max-openai-api/templates/secret-env.yaml | 29 + .../max-openai-api/templates/service.yaml | 34 + .../templates/serviceaccount.yaml | 28 + tutorials/helm/max-openai-api/values.yaml | 239 ++ tutorials/max-graph-api/.gitattributes | 2 + tutorials/max-graph-api/.gitignore | 7 + tutorials/max-graph-api/README.md | 7 + tutorials/max-graph-api/add.mojo | 44 + tutorials/max-graph-api/add.png | Bin 0 -> 16220 bytes tutorials/max-graph-api/matmul.mojo | 50 + tutorials/max-graph-api/matmul.png | Bin 0 -> 15427 bytes tutorials/max-graph-api/mnist.mojo | 158 ++ tutorials/max-graph-api/mnist.png | Bin 0 -> 71811 bytes tutorials/max-graph-api/mnist.py | 123 + tutorials/max-graph-api/mojoproject.toml | 19 + tutorials/max-graph-python/.mypy.ini | 2 + tutorials/max-graph-python/README.md | 60 + tutorials/max-graph-python/pyproject.toml | 33 + .../max-graph-python/src/max_ops/__init__.py | 12 + .../max-graph-python/src/max_ops/addition.py | 51 + tutorials/max-graph-python/tests/__init__.py | 12 + .../aws/max-serve-aws.yaml | 250 ++ .../max-serve-cloud-configs/aws/notify.sh | 106 + .../azure/max-serve-azure.json | 252 ++ .../max-serve-cloud-configs/azure/notify.sh | 113 + .../gcp/max-serve-gcp.jinja | 120 + .../max-serve-cloud-configs/gcp/notify.sh | 103 + .../.gitattributes | 2 + .../run-embeddings-with-max-serve/.gitignore | 6 + .../run-embeddings-with-max-serve/README.md | 16 + .../pyproject.toml | 25 + .../src/embeddings/__init__.py | 12 + .../src/embeddings/kb_system.py | 196 ++ tutorials/run-onnx-with-python/.gitignore | 2 + tutorials/run-onnx-with-python/README.md | 21 + .../run-onnx-with-python/download-model.py | 47 + tutorials/run-onnx-with-python/pyproject.toml | 36 + tutorials/run-onnx-with-python/run.py | 50 + .../src/onnx_tutorial/__init__.py | 12 + .../run-torchscript-with-python/.gitignore | 2 + .../run-torchscript-with-python/README.md | 22 + .../download-model.py | 43 + .../pyproject.toml | 31 + tutorials/run-torchscript-with-python/run.py | 76 + .../src/torchscript_tutorial/__init__.py | 12 + 836 files changed, 43185 insertions(+), 2435 deletions(-) create mode 100644 .clang-format create mode 100644 .clang-tidy create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/max_bug_report.yaml create mode 100644 .github/ISSUE_TEMPLATE/max_builds_bug_report.yaml create mode 100644 .github/ISSUE_TEMPLATE/max_feature_request.yaml delete mode 100644 .pre-commit-config.yaml rename {examples/testing => benchmark}/.gitattributes (100%) create mode 100644 benchmark/.gitignore create mode 100644 benchmark/README.md create mode 100644 benchmark/benchmark_serving.py create mode 100644 benchmark/pyproject.toml create mode 100644 benchmark/requirements.txt create mode 100644 examples/console.py create mode 100644 examples/custom_ops/.gitignore create mode 100644 examples/custom_ops/README.md create mode 100644 examples/custom_ops/addition.py create mode 100644 examples/custom_ops/fused_attention.py create mode 100644 examples/custom_ops/histogram.py create mode 100644 examples/custom_ops/kernels/__init__.mojo create mode 100644 examples/custom_ops/kernels/add_custom.mojo create mode 100644 examples/custom_ops/kernels/fused_attention.mojo create mode 100644 examples/custom_ops/kernels/histogram.mojo create mode 100644 examples/custom_ops/kernels/mandelbrot.mojo create mode 100644 examples/custom_ops/kernels/matrix_multiplication.mojo create mode 100644 examples/custom_ops/kernels/top_k.mojo create mode 100644 examples/custom_ops/kernels/vector_addition.mojo create mode 100644 examples/custom_ops/mandelbrot.py create mode 100644 examples/custom_ops/matrix_multiplication.py create mode 100644 examples/custom_ops/mojoproject.toml create mode 100644 examples/custom_ops/parametric_addition.py create mode 100644 examples/custom_ops/top_k.py create mode 100644 examples/custom_ops/vector_addition.py create mode 100755 examples/gpu_functions/README.md create mode 100755 examples/gpu_functions/grayscale.mojo create mode 100755 examples/gpu_functions/mandelbrot.mojo create mode 100755 examples/gpu_functions/mojoproject.toml create mode 100755 examples/gpu_functions/naive_matrix_multiplication.mojo create mode 100755 examples/gpu_functions/vector_addition.mojo create mode 100644 examples/graph-api/README.md create mode 100644 examples/graph-api/basics/README.md create mode 100644 "examples/graph-api/basics/basic.\360\237\224\245" create mode 100644 examples/graph-api/environment.yml create mode 100644 examples/graph-api/pixi.toml create mode 100644 examples/graph-api/requirements.txt create mode 100644 examples/gui/.gitattributes create mode 100644 examples/gui/.gitignore create mode 100644 examples/gui/.streamlit/config.toml create mode 100644 examples/gui/README.md create mode 100755 examples/gui/home.py create mode 100644 examples/gui/mojoproject.toml create mode 100644 examples/gui/pages/bert.py create mode 100644 examples/gui/pages/llama3_1.py create mode 100644 examples/gui/pages/stable-diffusion.py create mode 100644 examples/gui/pages/yolo.py create mode 100644 examples/gui/ragdata/mojo_functions.txt create mode 100644 examples/gui/shared.py create mode 100644 examples/inference/README.md create mode 100644 examples/inference/bert-c-torchscript/.gitignore create mode 100644 examples/inference/bert-c-torchscript/CMakeLists.txt create mode 100644 examples/inference/bert-c-torchscript/README.md create mode 100644 examples/inference/bert-c-torchscript/environment.yml create mode 100644 examples/inference/bert-c-torchscript/main.c create mode 100644 examples/inference/bert-c-torchscript/pixi.toml create mode 100644 examples/inference/bert-c-torchscript/post-process.py create mode 100644 examples/inference/bert-c-torchscript/pre-process.py create mode 100755 examples/inference/bert-c-torchscript/run.sh create mode 100644 examples/inference/bert-mojo-torchscript/README.md create mode 100644 examples/inference/bert-mojo-torchscript/environment.yml create mode 100644 examples/inference/bert-mojo-torchscript/pixi.toml create mode 100755 examples/inference/bert-mojo-torchscript/run.sh create mode 100755 "examples/inference/bert-mojo-torchscript/simple_inference.\360\237\224\245" create mode 100644 examples/inference/bert-python-torchscript/.gitignore create mode 100644 examples/inference/bert-python-torchscript/README.md create mode 100644 examples/inference/bert-python-torchscript/environment.yml create mode 100644 examples/inference/bert-python-torchscript/pixi.toml create mode 100755 examples/inference/bert-python-torchscript/run.sh create mode 100644 examples/inference/bert-python-torchscript/simple-inference.py create mode 100644 examples/inference/common/bert-torchscript/download-model.py create mode 100644 examples/inference/resnet50-python-torchscript/.gitignore create mode 100644 examples/inference/resnet50-python-torchscript/README.md create mode 100644 examples/inference/resnet50-python-torchscript/download-model.py create mode 100644 examples/inference/resnet50-python-torchscript/environment.yml create mode 100644 examples/inference/resnet50-python-torchscript/input/leatherback_turtle.jpg create mode 100644 examples/inference/resnet50-python-torchscript/pixi.toml create mode 100755 examples/inference/resnet50-python-torchscript/run.sh create mode 100644 examples/inference/resnet50-python-torchscript/simple-inference.py create mode 100644 examples/inference/stable-diffusion-mojo-onnx/.gitignore create mode 100644 examples/inference/stable-diffusion-mojo-onnx/README.md create mode 100644 examples/inference/stable-diffusion-mojo-onnx/environment.yml create mode 100644 examples/inference/stable-diffusion-mojo-onnx/pixi.toml create mode 100644 "examples/inference/stable-diffusion-mojo-onnx/python_utils.\360\237\224\245" create mode 100755 examples/inference/stable-diffusion-mojo-onnx/run.sh create mode 100644 "examples/inference/stable-diffusion-mojo-onnx/scheduler.\360\237\224\245" create mode 100755 "examples/inference/stable-diffusion-mojo-onnx/text_to_image.\360\237\224\245" create mode 100644 examples/inference/stable-diffusion-python-onnx/.gitignore create mode 100644 examples/inference/stable-diffusion-python-onnx/README.md create mode 100644 examples/inference/stable-diffusion-python-onnx/environment.yml create mode 100644 examples/inference/stable-diffusion-python-onnx/pixi.toml create mode 100755 examples/inference/stable-diffusion-python-onnx/run.sh create mode 100755 examples/inference/stable-diffusion-python-onnx/text_to_image.py create mode 100644 examples/inference/yolo-python-onnx/.gitignore create mode 100644 examples/inference/yolo-python-onnx/README.md create mode 100644 examples/inference/yolo-python-onnx/constants.py create mode 100644 examples/inference/yolo-python-onnx/download-model.py create mode 100644 examples/inference/yolo-python-onnx/environment.yml create mode 100644 examples/inference/yolo-python-onnx/input.mp4 create mode 100644 examples/inference/yolo-python-onnx/pixi.toml create mode 100644 examples/inference/yolo-python-onnx/requirements.txt create mode 100755 examples/inference/yolo-python-onnx/run.sh create mode 100755 examples/inference/yolo-python-onnx/segment.py delete mode 100644 examples/lit.cfg.py create mode 100644 examples/models/README.md rename examples/{ => mojo}/.gitignore (100%) create mode 100644 examples/mojo/README.md rename examples/{ => mojo}/check_mod.py (100%) rename examples/{ => mojo}/deviceinfo.mojo (100%) rename "examples/hello.\360\237\224\245" => "examples/mojo/hello.\360\237\224\245" (100%) rename examples/{ => mojo}/hello_interop.mojo (100%) rename examples/{ => mojo}/life/README.md (100%) rename examples/{ => mojo}/life/benchmark.mojo (100%) rename examples/{ => mojo}/life/gridv1.mojo (100%) rename examples/{ => mojo}/life/gridv2.mojo (100%) rename examples/{ => mojo}/life/lifev1.mojo (100%) rename examples/{ => mojo}/life/lifev2.mojo (100%) rename examples/{ => mojo}/life/mojoproject.toml (100%) rename examples/{ => mojo}/life/test/test_gridv1.mojo (100%) rename examples/{ => mojo}/life/test/test_gridv2.mojo (100%) rename examples/{ => mojo}/mandelbrot.mojo (100%) rename examples/{ => mojo}/matmul.mojo (100%) rename examples/{ => mojo}/mojoproject.toml (100%) rename examples/{ => mojo}/nbody.mojo (100%) rename examples/{ => mojo}/operators/README.md (100%) rename examples/{ => mojo}/operators/main.mojo (100%) rename examples/{ => mojo}/operators/mojoproject.toml (100%) rename examples/{ => mojo}/operators/my_complex.mojo (100%) rename examples/{ => mojo}/operators/test_my_complex.mojo (100%) rename examples/{ => mojo}/pymatmul.py (100%) rename examples/{ => mojo}/reduce.mojo (100%) rename examples/{ => mojo}/simple_interop.py (100%) create mode 100644 examples/mojo/testing/.gitattributes rename examples/{ => mojo}/testing/.gitignore (100%) rename examples/{ => mojo}/testing/README.md (100%) rename examples/{ => mojo}/testing/mojoproject.toml (100%) rename examples/{ => mojo}/testing/src/example.mojo (100%) rename examples/{ => mojo}/testing/src/my_math/__init__.mojo (100%) rename examples/{ => mojo}/testing/src/my_math/utils.mojo (100%) rename examples/{ => mojo}/testing/test/my_math/test_dec.mojo (100%) rename examples/{ => mojo}/testing/test/my_math/test_inc.mojo (100%) create mode 100644 examples/notebooks/.gitignore create mode 100644 examples/notebooks/README.md create mode 100644 examples/notebooks/gemma2b-python-onnx.ipynb create mode 100644 examples/notebooks/mistral7b-python-onnx.ipynb create mode 100644 examples/notebooks/pixi.toml create mode 100644 examples/notebooks/roberta-python-pytorch.ipynb create mode 100644 examples/offline-inference/README.md create mode 100644 examples/offline-inference/basic.py create mode 100644 examples/offline-inference/pixi.toml delete mode 100644 magic.lock rename {.github => mojo/.github}/CODEOWNERS (100%) create mode 100644 mojo/.github/ISSUE_TEMPLATE/doc_issue.yaml rename {.github => mojo/.github}/ISSUE_TEMPLATE/mojo_bug_report.yaml (100%) rename {.github => mojo/.github}/ISSUE_TEMPLATE/mojo_feature_request.yaml (100%) rename {.github => mojo/.github}/PULL_REQUEST_TEMPLATE.md (100%) rename {.github => mojo/.github}/workflows/check_pr_target.yml (100%) rename {.github => mojo/.github}/workflows/check_pr_title.yml (100%) rename {.github => mojo/.github}/workflows/standard_library_tests_and_examples.yml (100%) rename {.github => mojo/.github}/workflows/test_pre_commit.yml (100%) create mode 100644 mojo/CODE_OF_CONDUCT.md rename CONTRIBUTING.md => mojo/CONTRIBUTING.md (100%) create mode 100644 mojo/LICENSE create mode 100644 mojo/README.md rename {docs => mojo/docs}/README.md (100%) rename {docs => mojo/docs}/changelog-released.md (100%) rename {docs => mojo/docs}/changelog.md (100%) rename {docs => mojo/docs}/faq.md (100%) rename {docs => mojo/docs}/images/dynamic-vector-capacity.png (100%) rename {docs => mojo/docs}/images/let-to-var.png (100%) rename {docs => mojo/docs}/images/vectorize-fix.png (100%) rename {docs => mojo/docs}/lib.mdx (100%) rename {docs => mojo/docs}/manual/basics.mdx (100%) rename {docs => mojo/docs}/manual/control-flow.mdx (100%) rename {docs => mojo/docs}/manual/decorators/always-inline.md (100%) rename {docs => mojo/docs}/manual/decorators/copy-capture.md (100%) rename {docs => mojo/docs}/manual/decorators/implicit.md (100%) rename {docs => mojo/docs}/manual/decorators/index.mdx (100%) rename {docs => mojo/docs}/manual/decorators/nonmaterializable.md (100%) rename {docs => mojo/docs}/manual/decorators/parameter.md (100%) rename {docs => mojo/docs}/manual/decorators/register-passable.md (100%) rename {docs => mojo/docs}/manual/decorators/staticmethod.md (100%) rename {docs => mojo/docs}/manual/decorators/value.md (100%) rename {docs => mojo/docs}/manual/errors.mdx (100%) rename {docs => mojo/docs}/manual/functions.mdx (100%) rename {docs => mojo/docs}/manual/get-started.mdx (100%) rename {docs => mojo/docs}/manual/images/game-of-life-screen.png (100%) rename {docs => mojo/docs}/manual/images/mojo-vscode.png (100%) rename {docs => mojo/docs}/manual/images/owned-pointer-diagram-dark.png (100%) rename {docs => mojo/docs}/manual/images/owned-pointer-diagram.png (100%) rename {docs => mojo/docs}/manual/images/pointer-diagram-dark.png (100%) rename {docs => mojo/docs}/manual/images/pointer-diagram.png (100%) rename {docs => mojo/docs}/manual/images/pointer-lifecycle-dark.png (100%) rename {docs => mojo/docs}/manual/images/pointer-lifecycle.png (100%) rename {docs => mojo/docs}/manual/images/pointer-offset-dark.png (100%) rename {docs => mojo/docs}/manual/images/pointer-offset.png (100%) rename {docs => mojo/docs}/manual/images/strided-load-storage-dark.png (100%) rename {docs => mojo/docs}/manual/images/strided-load-storage.png (100%) rename {docs => mojo/docs}/manual/index.md (100%) rename {docs => mojo/docs}/manual/lifecycle/death.mdx (100%) rename {docs => mojo/docs}/manual/lifecycle/index.mdx (100%) rename {docs => mojo/docs}/manual/lifecycle/life.mdx (100%) rename {docs => mojo/docs}/manual/operators.mdx (100%) rename {docs => mojo/docs}/manual/packages.md (100%) rename {docs => mojo/docs}/manual/parameters/index.mdx (100%) rename {docs => mojo/docs}/manual/pointers/index.mdx (100%) rename {docs => mojo/docs}/manual/pointers/unsafe-pointers.mdx (100%) rename {docs => mojo/docs}/manual/python/index.mdx (100%) rename {docs => mojo/docs}/manual/python/types.mdx (100%) rename {docs => mojo/docs}/manual/structs.mdx (100%) rename {docs => mojo/docs}/manual/traits.mdx (100%) rename {docs => mojo/docs}/manual/types.mdx (100%) rename {docs => mojo/docs}/manual/values/index.mdx (100%) rename {docs => mojo/docs}/manual/values/lifetimes.mdx (100%) rename {docs => mojo/docs}/manual/values/ownership.mdx (100%) rename {docs => mojo/docs}/manual/values/value-semantics.mdx (100%) rename {docs => mojo/docs}/manual/variables.mdx (100%) rename {docs => mojo/docs}/roadmap.md (100%) rename {docs => mojo/docs}/tools/debugging.mdx (100%) rename {docs => mojo/docs}/tools/images/break-on-raise.png (100%) rename {docs => mojo/docs}/tools/images/breakpoint-hit-count.png (100%) rename {docs => mojo/docs}/tools/images/debug-toolbar.png (100%) rename {docs => mojo/docs}/tools/images/debugger-call-stack-nested1.png (100%) rename {docs => mojo/docs}/tools/images/debugger-variables.png (100%) rename {docs => mojo/docs}/tools/images/launch-configuration-menu.png (100%) rename {docs => mojo/docs}/tools/images/quick-run-or-debug-button-debug.png (100%) rename {docs => mojo/docs}/tools/images/quick-run-or-debug-button.png (100%) rename {docs => mojo/docs}/tools/images/quick-run-or-debug-menu.png (100%) rename {docs => mojo/docs}/tools/images/run-and-debug-icon.png (100%) rename {docs => mojo/docs}/tools/images/run-and-debug-view.png (100%) rename {docs => mojo/docs}/tools/images/run-start-view.png (100%) rename {docs => mojo/docs}/tools/testing.mdx (100%) rename {docs => mojo/docs}/why-mojo.md (100%) rename pixi.toml => mojo/pixi.toml (100%) rename {proposals => mojo/proposals}/README.md (100%) rename {proposals => mojo/proposals}/always_inline_builtin.md (100%) rename {proposals => mojo/proposals}/byte-as-uint8.md (100%) rename {proposals => mojo/proposals}/improved-hash-module.md (100%) rename {proposals => mojo/proposals}/inferred-parameters.md (100%) rename {proposals => mojo/proposals}/lifetimes-and-provenance.md (100%) rename {proposals => mojo/proposals}/lifetimes-keyword-renaming.md (100%) rename {proposals => mojo/proposals}/mojo-and-dynamism.md (100%) rename {proposals => mojo/proposals}/opt-in-implicit-conversion.md (100%) rename {proposals => mojo/proposals}/project-manifest-and-build-tool.md (100%) rename {proposals => mojo/proposals}/ref-convention.md (100%) rename {proposals => mojo/proposals}/remove-let-decls.md (100%) rename {proposals => mojo/proposals}/stdlib-insider-docs.md (100%) rename {proposals => mojo/proposals}/value-ownership.md (100%) rename {stdlib => mojo/stdlib}/README.md (100%) rename {stdlib => mojo/stdlib}/benchmarks/README.md (100%) rename {stdlib => mojo/stdlib}/benchmarks/algorithm/bench_elementwise.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/builtin/bench_int.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/builtin/bench_sort.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/bench_dict.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/bench_string.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/README.md (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_AR.html (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_AR.txt (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_EN.html (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_EN.txt (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_ES.html (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_ES.txt (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_RU.html (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_RU.txt (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_zh-CN.html (100%) rename {stdlib => mojo/stdlib}/benchmarks/collections/data/UN_charter_zh-CN.txt (100%) rename {stdlib => mojo/stdlib}/benchmarks/hashlib/bench_hash.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/lit.cfg.py (100%) rename {stdlib => mojo/stdlib}/benchmarks/math/bench_math.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/utils/bench_formatter.mojo (100%) rename {stdlib => mojo/stdlib}/benchmarks/utils/bench_memmem.mojo (100%) rename {stdlib => mojo/stdlib}/docs/development.md (100%) rename {stdlib => mojo/stdlib}/docs/docstring-style-guide.md (100%) rename {stdlib => mojo/stdlib}/docs/faq.md (100%) rename {stdlib => mojo/stdlib}/docs/governance-structure.md (100%) rename {stdlib => mojo/stdlib}/docs/images/create-fork.png (100%) rename {stdlib => mojo/stdlib}/docs/images/doc-lint-quick-fix.png (100%) rename {stdlib => mojo/stdlib}/docs/images/nightly-extension.png (100%) rename {stdlib => mojo/stdlib}/docs/internal/README.md (100%) rename {stdlib => mojo/stdlib}/docs/internal/compiler.md (100%) rename {stdlib => mojo/stdlib}/docs/internal/mlir.md (100%) rename {stdlib => mojo/stdlib}/docs/internal/runtime.md (100%) rename {stdlib => mojo/stdlib}/docs/roadmap.md (100%) rename {stdlib => mojo/stdlib}/docs/style-guide.md (100%) rename {stdlib => mojo/stdlib}/docs/vision.md (100%) rename {stdlib => mojo/stdlib}/scripts/.markdownlint.yaml (100%) rename {stdlib => mojo/stdlib}/scripts/build-stdlib.sh (100%) rename {stdlib => mojo/stdlib}/scripts/check-docstrings.py (100%) rename {stdlib => mojo/stdlib}/scripts/check_licenses.mojo (100%) rename {stdlib => mojo/stdlib}/scripts/install-build-tools-linux.sh (100%) rename {stdlib => mojo/stdlib}/scripts/install-build-tools-macos.sh (100%) rename {stdlib => mojo/stdlib}/scripts/markdownlint.sh (100%) rename {stdlib => mojo/stdlib}/scripts/run-benchmarks.sh (100%) rename {stdlib => mojo/stdlib}/scripts/run-tests.sh (100%) rename {stdlib => mojo/stdlib}/src/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/base64/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/base64/_b64encode.mojo (100%) rename {stdlib => mojo/stdlib}/src/base64/base64.mojo (100%) rename {stdlib => mojo/stdlib}/src/bit/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/bit/bit.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/_closure.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/_format_float.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/_location.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/_pybind.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/_startup.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/_stubs.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/anytype.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/bool.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/breakpoint.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/builtin_list.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/builtin_slice.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/comparable.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/constrained.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/coroutine.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/debug_assert.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/dtype.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/equality_comparable.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/error.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/file.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/file_descriptor.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/float_literal.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/floatable.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/format_int.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/identifiable.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/int.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/int_literal.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/io.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/len.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/math.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/none.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/object.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/range.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/rebind.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/repr.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/reversed.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/simd.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/sort.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/str.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/string_literal.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/swap.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/tuple.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/type_aliases.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/uint.mojo (100%) rename {stdlib => mojo/stdlib}/src/builtin/value.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/_index_normalization.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/counter.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/deque.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/dict.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/inline_array.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/inline_list.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/interval.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/linked_list.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/list.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/optional.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/set.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/_unicode.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/_unicode_lookups.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/_utf8_validation.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/codepoint.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/format.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/inline_string.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/string.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/string/string_slice.mojo (100%) rename {stdlib => mojo/stdlib}/src/collections/vector.mojo (100%) rename {stdlib => mojo/stdlib}/src/documentation/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/documentation/documentation.mojo (100%) rename {stdlib => mojo/stdlib}/src/hashlib/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/hashlib/_ahash.mojo (100%) rename {stdlib => mojo/stdlib}/src/hashlib/_hasher.mojo (100%) rename {stdlib => mojo/stdlib}/src/hashlib/hash.mojo (100%) rename {stdlib => mojo/stdlib}/src/math/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/math/constants.mojo (100%) rename {stdlib => mojo/stdlib}/src/math/math.mojo (100%) rename {stdlib => mojo/stdlib}/src/math/polynomial.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/arc.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/maybe_uninitialized.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/memory.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/owned_pointer.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/pointer.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/span.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/unsafe.mojo (100%) rename {stdlib => mojo/stdlib}/src/memory/unsafe_pointer.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/_linux_aarch64.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/_linux_x86.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/_macos.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/_windows.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/atomic.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/env.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/fstat.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/os.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/path/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/path/path.mojo (100%) rename {stdlib => mojo/stdlib}/src/os/pathlike.mojo (100%) rename {stdlib => mojo/stdlib}/src/pathlib/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/pathlib/path.mojo (100%) rename {stdlib => mojo/stdlib}/src/prelude/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/pwd/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/pwd/_linux.mojo (100%) rename {stdlib => mojo/stdlib}/src/pwd/_macos.mojo (100%) rename {stdlib => mojo/stdlib}/src/pwd/pwd.mojo (100%) rename {stdlib => mojo/stdlib}/src/python/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/python/_bindings.mojo (100%) rename {stdlib => mojo/stdlib}/src/python/_cpython.mojo (100%) rename {stdlib => mojo/stdlib}/src/python/python.mojo (100%) rename {stdlib => mojo/stdlib}/src/python/python_object.mojo (100%) rename {stdlib => mojo/stdlib}/src/random/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/random/random.mojo (100%) rename {stdlib => mojo/stdlib}/src/stat/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/stat/stat.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/_amdgpu.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/_assembly.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/_build.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/_io.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/_libc.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/arg.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/compile.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/debug.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/ffi.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/info.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/intrinsics.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/param_env.mojo (100%) rename {stdlib => mojo/stdlib}/src/sys/terminate.mojo (100%) rename {stdlib => mojo/stdlib}/src/tempfile/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/tempfile/tempfile.mojo (100%) rename {stdlib => mojo/stdlib}/src/testing/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/testing/testing.mojo (100%) rename {stdlib => mojo/stdlib}/src/time/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/time/time.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/_select.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/_serialize.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/_visualizers.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/index.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/lock.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/loop.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/numerics.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/static_tuple.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/variant.mojo (100%) rename {stdlib => mojo/stdlib}/src/utils/write.mojo (100%) rename {stdlib => mojo/stdlib}/test/base64/test_base64.mojo (100%) rename {stdlib => mojo/stdlib}/test/bit/test_bit.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_any_all.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_bfloat16.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_bool.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_debug_assert.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_debug_assert_default_error.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_debug_assert_mode_all.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_debug_assert_mode_all_error.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_debug_assert_mode_none.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_debug_assert_warning.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_deprecation_warnings.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_dtype.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_error.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_file.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_file_dummy_input.txt (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_float_literal.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_format_float.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_format_int.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_int.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_int_literal.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_issue_1004.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_issue_1505.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_issue_3908.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_list_literal.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_location.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_math.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_none.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_object.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_print.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_print_long_string.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_print_stderr.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_range.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_range_out_of_bounds.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_range_uint_reverse_range_bad.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_rebind.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_repr.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_reversed.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_simd.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_slice.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_sort.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_sort_issue_1018.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_stdin.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_str.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_string_literal.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_swap.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_tuple.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_uint.mojo (100%) rename {stdlib => mojo/stdlib}/test/builtin/test_uint_error.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/string/test_inlined_string.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/string/test_string.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/string/test_string_slice.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/string/test_unicode.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_codepoint.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_counter.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_deque.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_dict.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_index_normalization.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_inline_array.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_inline_list.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_interval.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_linked_list.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_list.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_list_getitem_invalid_index.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_optional.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_set.mojo (100%) rename {stdlib => mojo/stdlib}/test/collections/test_vector.mojo (100%) rename {stdlib => mojo/stdlib}/test/hashlib/test_ahash.mojo (100%) rename {stdlib => mojo/stdlib}/test/hashlib/test_hash.mojo (100%) rename {stdlib => mojo/stdlib}/test/hashlib/test_hasher.mojo (100%) rename {stdlib => mojo/stdlib}/test/lit.cfg.py (100%) rename {stdlib => mojo/stdlib}/test/memory/test_arc.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_bitcast.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_maybe_uninitialized.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_memory.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_owned_pointer.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_reference.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_span.mojo (100%) rename {stdlib => mojo/stdlib}/test/memory/test_unsafepointer.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_basename.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_dirname.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_exists.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_expanduser.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_expandvars.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_getsize.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_isdir.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_isfile.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_islink.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_join.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_split.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/path/test_splitroot.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_atomic.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_env.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_listdir.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_mkdir_and_rmdir.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_no_trap.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_remove.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_stat.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_trap.mojo (100%) rename {stdlib => mojo/stdlib}/test/os/test_trap_stringable.mojo (100%) rename {stdlib => mojo/stdlib}/test/pathlib/test_pathlib.mojo (100%) rename {stdlib => mojo/stdlib}/test/pwd/test_pwd.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/custom_indexable.py (100%) rename {stdlib => mojo/stdlib}/test/python/module_for_test_python_object_dunder_contains.py (100%) rename {stdlib => mojo/stdlib}/test/python/my_module.py (100%) rename {stdlib => mojo/stdlib}/test/python/test_ownership.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_cpython.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_error_handling.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_info.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_interop.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_module_create.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_object.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_object_dunder_contains.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_object_len_raises.mojo (100%) rename {stdlib => mojo/stdlib}/test/python/test_python_to_mojo.mojo (100%) rename {stdlib => mojo/stdlib}/test/random/test_random.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_aarch64_target.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_build_info_debug.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_c_types.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_compile.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_compile_debug.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_dlhandle.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_exit_0.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_exit_1.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_intrinsics.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_invalid_paramenv.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_linux_target.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_macos_target.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_paramenv.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_sizeof.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_targetinfo.mojo (100%) rename {stdlib => mojo/stdlib}/test/sys/test_windows_target.mojo (100%) rename {stdlib => mojo/stdlib}/test/tempfile/test_tempfile.mojo (100%) rename {stdlib => mojo/stdlib}/test/test_utils/__init__.mojo (100%) rename {stdlib => mojo/stdlib}/test/test_utils/test_utils.mojo (100%) rename {stdlib => mojo/stdlib}/test/test_utils/types.mojo (100%) rename {stdlib => mojo/stdlib}/test/testing/test_assert_raises.mojo (100%) rename {stdlib => mojo/stdlib}/test/testing/test_assertion.mojo (100%) rename {stdlib => mojo/stdlib}/test/time/test_time.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/issue_13632.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_index.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_numerics.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_select.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_static_tuple.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_tuple.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_unroll.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_variant.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_write.mojo (100%) rename {stdlib => mojo/stdlib}/test/utils/test_write_to_stdout.mojo (100%) create mode 100644 pyproject.toml create mode 100644 src/max/Dockerfile.cpu create mode 100644 src/max/Dockerfile.cuda-simple create mode 100644 src/max/Dockerfile.cuda-small create mode 100644 src/max/README.md create mode 100644 src/max/entrypoints/cli/__init__.py create mode 100644 src/max/entrypoints/cli/config.py create mode 100644 src/max/entrypoints/cli/device_options.py create mode 100644 src/max/entrypoints/cli/encode.py create mode 100644 src/max/entrypoints/cli/entrypoint.py create mode 100644 src/max/entrypoints/cli/generate.py create mode 100644 src/max/entrypoints/cli/list.py create mode 100644 src/max/entrypoints/cli/metrics.py create mode 100644 src/max/entrypoints/cli/serve.py create mode 100644 src/max/entrypoints/llm.py create mode 100644 src/max/entrypoints/pipelines.py create mode 100644 src/max/pipelines/README.md create mode 100644 src/max/pipelines/__init__.py create mode 100644 src/max/pipelines/architectures/__init__.py create mode 100644 src/max/pipelines/architectures/deepseekV2/layers/__init__.py create mode 100644 src/max/pipelines/architectures/deepseekV2/layers/moe_gate.py create mode 100644 src/max/pipelines/architectures/exaone/__init__.py create mode 100644 src/max/pipelines/architectures/exaone/arch.py create mode 100644 src/max/pipelines/architectures/exaone/weight_adapters.py create mode 100644 src/max/pipelines/architectures/granite/__init__.py create mode 100644 src/max/pipelines/architectures/granite/arch.py create mode 100644 src/max/pipelines/architectures/granite/model.py create mode 100644 src/max/pipelines/architectures/llama3/README.md create mode 100644 src/max/pipelines/architectures/llama3/__init__.py create mode 100644 src/max/pipelines/architectures/llama3/arch.py create mode 100644 src/max/pipelines/architectures/llama3/config.py create mode 100644 src/max/pipelines/architectures/llama3/gguf.py create mode 100644 src/max/pipelines/architectures/llama3/llama3.py create mode 100644 src/max/pipelines/architectures/llama3/model.py create mode 100644 src/max/pipelines/architectures/llama3/naive_llama3.py create mode 100644 src/max/pipelines/architectures/llama3/weight_adapters.py create mode 100644 src/max/pipelines/architectures/llama_vision/README.md create mode 100644 src/max/pipelines/architectures/llama_vision/__init__.py create mode 100644 src/max/pipelines/architectures/llama_vision/arch.py create mode 100644 src/max/pipelines/architectures/llama_vision/attention.py create mode 100644 src/max/pipelines/architectures/llama_vision/cross_attention_decoder.py create mode 100644 src/max/pipelines/architectures/llama_vision/encoder.py create mode 100644 src/max/pipelines/architectures/llama_vision/language_model.py create mode 100644 src/max/pipelines/architectures/llama_vision/llama_vision.py create mode 100644 src/max/pipelines/architectures/llama_vision/mlp.py create mode 100644 src/max/pipelines/architectures/llama_vision/positional_embedding.py create mode 100644 src/max/pipelines/architectures/llama_vision/vision_model.py create mode 100644 src/max/pipelines/architectures/mistral/README.md create mode 100644 src/max/pipelines/architectures/mistral/__init__.py create mode 100644 src/max/pipelines/architectures/mistral/arch.py create mode 100644 src/max/pipelines/architectures/mistral/graph.py create mode 100644 src/max/pipelines/architectures/mistral/model.py create mode 100644 src/max/pipelines/architectures/mpnet/__init__.py create mode 100644 src/max/pipelines/architectures/mpnet/arch.py create mode 100644 src/max/pipelines/architectures/mpnet/graph.py create mode 100644 src/max/pipelines/architectures/mpnet/model.py create mode 100644 src/max/pipelines/architectures/olmo/__init__.py create mode 100644 src/max/pipelines/architectures/olmo/arch.py create mode 100644 src/max/pipelines/architectures/olmo/model.py create mode 100644 src/max/pipelines/architectures/phi3/__init__.py create mode 100644 src/max/pipelines/architectures/phi3/arch.py create mode 100644 src/max/pipelines/architectures/phi3/model.py create mode 100644 src/max/pipelines/architectures/pixtral/README.md create mode 100644 src/max/pipelines/architectures/pixtral/__init__.py create mode 100644 src/max/pipelines/architectures/pixtral/arch.py create mode 100644 src/max/pipelines/architectures/pixtral/llava/__init__.py create mode 100644 src/max/pipelines/architectures/pixtral/llava/llava.py create mode 100644 src/max/pipelines/architectures/pixtral/llava/llava_decoder.py create mode 100644 src/max/pipelines/architectures/pixtral/llava/llava_projector.py create mode 100644 src/max/pipelines/architectures/pixtral/model/graph.py create mode 100644 src/max/pipelines/architectures/pixtral/model/mistral_graph.py create mode 100644 src/max/pipelines/architectures/pixtral/pixtral.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/__init__.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/attention.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/attention_utils.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/graph.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/rotary_embedding_2d.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/transformer.py create mode 100644 src/max/pipelines/architectures/pixtral/vision_encoder/vision_encoder.py create mode 100644 src/max/pipelines/architectures/qwen2/README.md create mode 100644 src/max/pipelines/architectures/qwen2/__init__.py create mode 100644 src/max/pipelines/architectures/qwen2/arch.py create mode 100644 src/max/pipelines/architectures/qwen2/graph.py create mode 100644 src/max/pipelines/architectures/qwen2/model.py create mode 100644 src/max/pipelines/architectures/replit/README.md create mode 100644 src/max/pipelines/architectures/replit/__init__.py create mode 100644 src/max/pipelines/architectures/replit/arch.py create mode 100644 src/max/pipelines/architectures/replit/graph.py create mode 100644 src/max/pipelines/architectures/replit/model.py create mode 100644 src/max/pipelines/architectures/whisper/encoder.py create mode 100644 src/max/pipelines/architectures/whisper/graph.py create mode 100644 src/max/pipelines/architectures/whisper/model.py create mode 100644 src/max/pipelines/config.py create mode 100644 src/max/pipelines/context.py create mode 100644 src/max/pipelines/dataprocessing/__init__.py create mode 100644 src/max/pipelines/dataprocessing/causal_attention_mask.py create mode 100644 src/max/pipelines/dataprocessing/causal_attention_mask_with_alibi.py create mode 100644 src/max/pipelines/dataprocessing/collate_batch.py create mode 100644 src/max/pipelines/dataprocessing/max_tokens_to_generate.py create mode 100644 src/max/pipelines/embeddings_pipeline.py create mode 100644 src/max/pipelines/hf_pipeline.py create mode 100644 src/max/pipelines/hf_utils.py create mode 100644 src/max/pipelines/interfaces/__init__.py create mode 100644 src/max/pipelines/interfaces/embeddings_generation.py rename examples/run-examples.sh => src/max/pipelines/interfaces/tasks.py (62%) mode change 100755 => 100644 create mode 100644 src/max/pipelines/interfaces/text_generation.py create mode 100644 src/max/pipelines/kv_cache/__init__.py create mode 100644 src/max/pipelines/kv_cache/_utils.py create mode 100644 src/max/pipelines/kv_cache/cache_params.py create mode 100644 src/max/pipelines/kv_cache/continuous_batching_cache.py create mode 100644 src/max/pipelines/kv_cache/hf.py create mode 100644 src/max/pipelines/kv_cache/manager.py create mode 100644 src/max/pipelines/kv_cache/naive_cache.py create mode 100644 src/max/pipelines/kv_cache/paged_cache.py create mode 100644 src/max/pipelines/kv_cache/paged_cache_metadata.py create mode 100644 src/max/pipelines/kv_cache/prefix_cache.py create mode 100644 src/max/pipelines/kv_cache/radix_trie.py create mode 100644 src/max/pipelines/kv_cache/simple_trie.py create mode 100644 src/max/pipelines/nn/__init__.py create mode 100644 src/max/pipelines/nn/_identity.py create mode 100644 src/max/pipelines/nn/attention/__init__.py create mode 100644 src/max/pipelines/nn/attention/attention.py create mode 100644 src/max/pipelines/nn/attention/attention_with_rope.py create mode 100644 src/max/pipelines/nn/attention/attention_without_mask.py create mode 100644 src/max/pipelines/nn/attention/clamp.py create mode 100644 src/max/pipelines/nn/attention/interfaces.py create mode 100644 src/max/pipelines/nn/attention/naive_attention_with_rope.py create mode 100644 src/max/pipelines/nn/comm/__init__.py create mode 100644 src/max/pipelines/nn/comm/allreduce.py create mode 100644 src/max/pipelines/nn/compute_log_probabilities.py create mode 100644 src/max/pipelines/nn/conv.py create mode 100644 src/max/pipelines/nn/embedding.py create mode 100644 src/max/pipelines/nn/hooks/__init__.py create mode 100644 src/max/pipelines/nn/hooks/base_print_hook.py create mode 100644 src/max/pipelines/nn/hooks/identity.py create mode 100644 src/max/pipelines/nn/hooks/print_hook.py create mode 100644 src/max/pipelines/nn/hooks/torch_print_hook.py create mode 100644 src/max/pipelines/nn/kernels.py create mode 100644 src/max/pipelines/nn/layer/__init__.py create mode 100644 src/max/pipelines/nn/layer/layer.py create mode 100644 src/max/pipelines/nn/layer/layer_list.py create mode 100644 src/max/pipelines/nn/linear.py create mode 100644 src/max/pipelines/nn/norm/__init__.py create mode 100644 src/max/pipelines/nn/norm/layer_norm.py create mode 100644 src/max/pipelines/nn/norm/rms_norm.py create mode 100644 src/max/pipelines/nn/rotary_embedding.py create mode 100644 src/max/pipelines/nn/sequential.py create mode 100644 src/max/pipelines/nn/transformer/__init__.py create mode 100644 src/max/pipelines/nn/transformer/distributed_transformer.py create mode 100644 src/max/pipelines/nn/transformer/naive_transformer.py create mode 100644 src/max/pipelines/nn/transformer/transformer.py create mode 100644 src/max/pipelines/pipeline.py create mode 100644 src/max/pipelines/registry.py create mode 100644 src/max/pipelines/requirements.txt create mode 100644 src/max/pipelines/response.py create mode 100644 src/max/pipelines/sampling.py create mode 100644 src/max/pipelines/tokenizer.py create mode 100644 src/max/pixi.toml create mode 100644 tutorials/README.md create mode 100644 tutorials/deploy-aws-kubernetes/README.md create mode 100644 tutorials/deploy-aws-kubernetes/client.py create mode 100644 tutorials/deploy-cloudformation-sagemaker/README.md create mode 100644 tutorials/deploy-cloudformation-sagemaker/client.py create mode 100644 tutorials/hello-magic/.gitattributes create mode 100644 tutorials/hello-magic/.gitignore create mode 100644 tutorials/hello-magic/hello.mojo create mode 100644 tutorials/hello-magic/local/.gitattributes create mode 100644 tutorials/hello-magic/local/.gitignore create mode 100644 tutorials/hello-magic/local/__init__.mojo create mode 100644 tutorials/hello-magic/local/mojoproject.toml create mode 100644 tutorials/hello-magic/local/zero.mojo create mode 100644 tutorials/hello-magic/main.py create mode 100644 tutorials/hello-magic/mojoproject.toml create mode 100644 tutorials/helm/max-openai-api/.helmignore create mode 100644 tutorials/helm/max-openai-api/Chart.yaml create mode 100644 tutorials/helm/max-openai-api/README.md create mode 100644 tutorials/helm/max-openai-api/README.md.gotmpl create mode 100644 tutorials/helm/max-openai-api/templates/NOTES.txt create mode 100644 tutorials/helm/max-openai-api/templates/_helpers.tpl create mode 100644 tutorials/helm/max-openai-api/templates/deployment.yaml create mode 100644 tutorials/helm/max-openai-api/templates/hpa.yaml create mode 100644 tutorials/helm/max-openai-api/templates/ingress.yaml create mode 100644 tutorials/helm/max-openai-api/templates/secret-env.yaml create mode 100644 tutorials/helm/max-openai-api/templates/service.yaml create mode 100644 tutorials/helm/max-openai-api/templates/serviceaccount.yaml create mode 100644 tutorials/helm/max-openai-api/values.yaml create mode 100644 tutorials/max-graph-api/.gitattributes create mode 100644 tutorials/max-graph-api/.gitignore create mode 100644 tutorials/max-graph-api/README.md create mode 100644 tutorials/max-graph-api/add.mojo create mode 100644 tutorials/max-graph-api/add.png create mode 100644 tutorials/max-graph-api/matmul.mojo create mode 100644 tutorials/max-graph-api/matmul.png create mode 100644 tutorials/max-graph-api/mnist.mojo create mode 100644 tutorials/max-graph-api/mnist.png create mode 100644 tutorials/max-graph-api/mnist.py create mode 100644 tutorials/max-graph-api/mojoproject.toml create mode 100644 tutorials/max-graph-python/.mypy.ini create mode 100644 tutorials/max-graph-python/README.md create mode 100644 tutorials/max-graph-python/pyproject.toml create mode 100644 tutorials/max-graph-python/src/max_ops/__init__.py create mode 100644 tutorials/max-graph-python/src/max_ops/addition.py create mode 100644 tutorials/max-graph-python/tests/__init__.py create mode 100644 tutorials/max-serve-cloud-configs/aws/max-serve-aws.yaml create mode 100644 tutorials/max-serve-cloud-configs/aws/notify.sh create mode 100644 tutorials/max-serve-cloud-configs/azure/max-serve-azure.json create mode 100644 tutorials/max-serve-cloud-configs/azure/notify.sh create mode 100644 tutorials/max-serve-cloud-configs/gcp/max-serve-gcp.jinja create mode 100644 tutorials/max-serve-cloud-configs/gcp/notify.sh create mode 100644 tutorials/run-embeddings-with-max-serve/.gitattributes create mode 100644 tutorials/run-embeddings-with-max-serve/.gitignore create mode 100644 tutorials/run-embeddings-with-max-serve/README.md create mode 100644 tutorials/run-embeddings-with-max-serve/pyproject.toml create mode 100644 tutorials/run-embeddings-with-max-serve/src/embeddings/__init__.py create mode 100644 tutorials/run-embeddings-with-max-serve/src/embeddings/kb_system.py create mode 100644 tutorials/run-onnx-with-python/.gitignore create mode 100644 tutorials/run-onnx-with-python/README.md create mode 100644 tutorials/run-onnx-with-python/download-model.py create mode 100644 tutorials/run-onnx-with-python/pyproject.toml create mode 100644 tutorials/run-onnx-with-python/run.py create mode 100644 tutorials/run-onnx-with-python/src/onnx_tutorial/__init__.py create mode 100644 tutorials/run-torchscript-with-python/.gitignore create mode 100644 tutorials/run-torchscript-with-python/README.md create mode 100644 tutorials/run-torchscript-with-python/download-model.py create mode 100644 tutorials/run-torchscript-with-python/pyproject.toml create mode 100644 tutorials/run-torchscript-with-python/run.py create mode 100644 tutorials/run-torchscript-with-python/src/torchscript_tutorial/__init__.py diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000..a74fda4b67 --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +BasedOnStyle: LLVM +AlwaysBreakTemplateDeclarations: Yes diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000000..e78abd3994 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,57 @@ +InheritParentConfig: true +Checks: > + bugprone-argument-comment, + bugprone-assert-side-effect, + bugprone-branch-clone, + bugprone-copy-constructor-init, + bugprone-dangling-handle, + bugprone-dynamic-static-initializers, + bugprone-macro-parentheses, + bugprone-macro-repeated-side-effects, + bugprone-misplaced-widening-cast, + bugprone-move-forwarding-reference, + bugprone-multiple-statement-macro, + bugprone-suspicious-semicolon, + bugprone-swapped-arguments, + bugprone-terminating-continue, + bugprone-unused-raii, + bugprone-unused-return-value, + misc-redundant-expression, + misc-static-assert, + misc-unused-using-decls, + modernize-use-bool-literals, + modernize-loop-convert, + modernize-make-unique, + modernize-raw-string-literal, + modernize-use-equals-default, + modernize-use-default-member-init, + modernize-use-emplace, + modernize-use-nullptr, + modernize-use-override, + modernize-use-using, + performance-for-range-copy, + performance-implicit-conversion-in-loop, + performance-inefficient-algorithm, + performance-inefficient-vector-operation, + performance-move-const-arg, + performance-no-automatic-move, + performance-trivially-destructible, + performance-unnecessary-copy-initialization, + performance-unnecessary-value-param, + readability-avoid-const-params-in-decls, + readability-const-return-type, + readability-container-size-empty, + readability-inconsistent-declaration-parameter-name, + readability-misleading-indentation, + readability-redundant-control-flow, + readability-redundant-smartptr-get, + readability-simplify-subscript-expr, + readability-use-anyofallof + +CheckOptions: + - key: readability-identifier-naming.MemberCase + value: camelBack + - key: readability-identifier-naming.ParameterCase + value: camelBack + - key: readability-identifier-naming.VariableCase + value: camelBack diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..e7cbefb6bf --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# Add an override so that .🔥 files are highlighted as Mojo files within github +# since the linguist system does not work with the .🔥 extention. +# See https://github.com/github/linguist/blob/master/docs/overrides.md +*.🔥 linguist-language=Mojo diff --git a/.github/ISSUE_TEMPLATE/CODEOWNERS b/.github/ISSUE_TEMPLATE/CODEOWNERS new file mode 100644 index 0000000000..303c1ec52f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/CODEOWNERS @@ -0,0 +1,5 @@ +# Codeowners for MAX repo. +# Every line is a file pattern that is followed by one or more code owners. +# Order is important; the last matching pattern takes the most precedence. + +* @modularml/max-code-reviewers diff --git a/.github/ISSUE_TEMPLATE/doc_issue.yaml b/.github/ISSUE_TEMPLATE/doc_issue.yaml index daf162cefc..a7781e61a8 100644 --- a/.github/ISSUE_TEMPLATE/doc_issue.yaml +++ b/.github/ISSUE_TEMPLATE/doc_issue.yaml @@ -12,7 +12,7 @@ ##===----------------------------------------------------------------------===## name: Documentation issue -description: Report a problem with the Mojo docs +description: Report a problem with the MAX docs title: "[Docs]" labels: - documentation @@ -20,11 +20,12 @@ body: - type: markdown attributes: value: | - Thank you for helping us improve the Mojo docs! + Thank you for helping us improve the MAX docs! Please add a title above and fill in the following fields so we can understand the problem. - type: input + id: url attributes: label: Where is the problem? description: Provide a link to the problematic page (with a heading anchor). diff --git a/.github/ISSUE_TEMPLATE/max_bug_report.yaml b/.github/ISSUE_TEMPLATE/max_bug_report.yaml new file mode 100644 index 0000000000..573a7069e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/max_bug_report.yaml @@ -0,0 +1,55 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: MAX bug report +description: Create a bug report to help us improve MAX +title: "[BUG]: " +labels: + - bug +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out a bug report! + + Please provide a descriptive title above and fill in the following fields. + + - type: textarea + id: Description + attributes: + label: Bug description + description: Describe the bug you encountered and what you expected to happen. + validations: + required: true + + - type: textarea + id: Steps + attributes: + label: Steps to reproduce + description: Provide the specific steps to reproduce the issue. + value: | + - Include relevant code snippet or link to code that did not work as expected. + - If applicable, add screenshots to help explain the problem. + - Include anything else that might help us debug the issue. + validations: + required: true + + - type: textarea + id: Context + attributes: + label: System information + description: What version of MAX are you using? + value: | + - Provide the system information by running `magic info`. + - Provide version information for MAX (includes Mojo) by pasting the output of `magic list max`. + render: shell diff --git a/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml b/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml new file mode 100644 index 0000000000..0c43f15bac --- /dev/null +++ b/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml @@ -0,0 +1,53 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: MAX Builds model bug report +description: Report a bug with a model +title: "[BUG]: " +labels: + - bug +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out a bug report! + + Please provide a descriptive title above and fill in the following fields. + + - type: input + id: model-variant + attributes: + label: On which model did the bug occur? + description: Provide the model (and variant). + validations: + required: true + + - type: textarea + id: Description + attributes: + label: Bug description + description: Describe the bug you encountered and what you expected to happen. + validations: + required: true + + - type: textarea + id: Steps + attributes: + label: Steps to reproduce + description: Provide the specific steps to reproduce the issue. + value: | + - Include relevant code snippet or link to code that did not work as expected. + - If applicable, add screenshots to help explain the problem. + - Include anything else that might help us debug the issue. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/max_feature_request.yaml b/.github/ISSUE_TEMPLATE/max_feature_request.yaml new file mode 100644 index 0000000000..57e6716fb8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/max_feature_request.yaml @@ -0,0 +1,49 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: MAX feature request +description: Suggest an enhancement for MAX +title: "[Feature Request]" +labels: + - enhancement +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to suggest a MAX enhancement! + + Please enter a concise title above and fill out the following fields. + + - type: textarea + id: Request + attributes: + label: What is your request? + description: Describe how you'd like us to improve MAX. + validations: + required: true + + - type: textarea + id: Motivation + attributes: + label: What is your motivation for this change? + description: Describe the problem that your feature seeks to address (what is the value to the product/user?). + validations: + required: true + + - type: textarea + id: Description + attributes: + label: Any other details? + description: Perhaps some minimum functional attributes the implementation should include, or other context about your feature. + validations: + required: false diff --git a/.gitignore b/.gitignore index 81e5af8ff5..339f9c6cdc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,104 @@ -# Build directory -/build - -# Reference: https://github.com/github/gitignore/blob/main/Python.gitignore - # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + # Environments .env .venv @@ -16,7 +107,51 @@ venv/ ENV/ env.bak/ venv.bak/ -.magic/ -# MacOS + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# numpy +*.npy + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# MacOS stuff .DS_Store + +# VS Code +.vscode + +# Downloaded example models +examples/models/* +!examples/models/README.md + +# Magic cache +.magic diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 9ca3f26be6..0000000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,26 +0,0 @@ -repos: - - repo: local - hooks: - - id: mojo-format - name: mojo-format - entry: mojo format - language: system - files: '\.(mojo|🔥|py)$' - stages: [commit] - - id: check-docstrings - name: check-docstrings - entry: python3 ./stdlib/scripts/check-docstrings.py - language: system - pass_filenames: false - stages: [commit] - - id: check-license - name: check-license - entry: mojo stdlib/scripts/check_licenses.mojo - language: system - files: '\.(mojo|🔥|py)$' - stages: [commit] - - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.40.0 - hooks: - - id: markdownlint - args: ['--config', 'stdlib/scripts/.markdownlint.yaml', '--fix'] diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f4f5ad5a25..d6204fb411 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,4 +1,4 @@ -# Code of conduct +# Code of Conduct In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and @@ -7,7 +7,7 @@ body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. -## Our standards +## Our Standards All community forums and spaces are meant for professional interactions that are friendly, inclusive, helpful, and collaborative. Examples of behavior that @@ -32,7 +32,7 @@ participants include: - Conduct which could reasonably be considered inappropriate for the forum in which it occurs. -## Our responsibilities +## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in @@ -47,14 +47,14 @@ threatening, offensive, or harmful. ## Scope This Code of Conduct applies to all project content and public spaces on the -Mojo GitHub repo, the rest of Modular’s GitHub organization, and all other -official Mojo community spaces and communication mediums, whether offline or +MAX GitHub repo, the rest of Modular’s GitHub organization, and all other +official MAX community spaces and communication mediums, whether offline or online. ## Enforcement Instances of abusive, harassment, or otherwise unacceptable behavior should be -reported to the project team at . All complaints will +reported to the project team at . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further diff --git a/LICENSE b/LICENSE index c1af4075d5..d972b8e80e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ ============================================================================================== -The Mojo repository is licensed under the Apache License v2.0 with LLVM Exceptions: +The MAX repository is licensed under the Apache License v2.0 with LLVM Exceptions: ============================================================================================== Apache License diff --git a/README.md b/README.md index 2a4878c789..92d8013410 100644 --- a/README.md +++ b/README.md @@ -1,113 +1,107 @@ -
- +![Modular Logo](https://modular-assets.s3.amazonaws.com/images/modular_github_logo_bg.png) - [Website][Mojo] | [Getting Started] | [API Documentation] | [Contributing] | [Changelog] -
+# Welcome to MAX -[Mojo]: https://www.modular.com/mojo/ -[Getting Started]: https://docs.modular.com/mojo/manual/get-started/ -[API Documentation]: https://docs.modular.com/mojo/lib -[Contributing]: ./CONTRIBUTING.md -[Changelog]: ./docs/changelog.md +The Modular Accelerated Xecution ([MAX](https://www.modular.com/max)) platform +is an integrated suite of AI libraries, tools, and technologies that unifies +commonly fragmented AI deployment workflows. MAX accelerates time to market +for the latest innovations by giving AI developers a single toolchain that +unlocks full programmability, unparalleled performance, and seamless hardware portability. -# Welcome to Mojo 🔥 +![Modular Architecture Diagram](https://modular-assets.s3.amazonaws.com/images/modular_architecture_diagram_bg.png) -Mojo is a new programming language that bridges the gap between research -and production by combining Python syntax and ecosystem with systems -programming and metaprogramming features. Mojo is still young, but it is -designed to write blazing-fast code for CPUs, GPUs, and more as part of -the [MAX Platform](https://www.modular.com/max). +[See here to get started with MAX](https://docs.modular.com/max/get-started) +and when you want to report issues or request features, +[please create a GitHub issue here](https://github.com/modular/max/issues/new/choose). -This repo includes source code for: +The [Discord](https://discord.gg/modular) community is the best place to share +your experiences and chat with the team and other community members. -- Mojo examples -- Mojo documentation hosted at [modular.com](https://docs.modular.com/mojo/) -- The [Mojo standard library](https://docs.modular.com/mojo/lib) +In the [examples directory](https://github.com/modular/max/tree/main/examples), +you will find code examples and Jupyter notebooks that show how to run inference +with MAX. -This repo has two primary branches: +## Getting Started -- The [`stable`](https://github.com/modular/mojo/tree/stable) branch, which -is in sync with the last stable released version of Mojo. Use the examples -here if you’re using a [release build of Mojo](#latest-released). +MAX is available in both stable and nightly builds. To install either version, +follow the guide to [create a project with +Magic](https://docs.modular.com/max/create-project). -- The [`main`](https://github.com/modular/mojo/tree/main) branch, which -is in sync with the Mojo nightly build and subject to breakage. Use this branch -for [contributions](./CONTRIBUTING.md), or if you're using the latest -[nightly build of Mojo](#latest-nightly). +Then clone this repository: -To learn more about Mojo, see the -[Mojo Manual](https://docs.modular.com/mojo/manual/). +```bash +git clone https://github.com/modular/max.git +``` -## Installing Mojo +If you installed the stable build (v24.6), be sure you switch to the `stable` branch, +because the `main` branch is for nightly releases and might not be compatible +with stable builds: -### Latest Released +```bash +git checkout stable +``` -To install the last released build of Mojo, follow the guide to -[Get started with Mojo](https://docs.modular.com/mojo/manual/get-started). +## Running -### Latest Nightly +### MAX Pipelines -The nightly Mojo builds are subject to breakage and provide an inside -view of how the development of Mojo is progressing. Use at your own risk -and be patient! +To show off the full power of MAX, a +[series of end-to-end pipelines for common AI workloads](./src/max/pipelines/) +(and more) are ready to run. As one example, this includes everything needed to +self-host +[the Llama 3.1 text-generation model](./src/max/pipelines/architectures/llama3/). +All code is provided so that these pipelines can be customized, built upon, or +learned from. -To get nightly builds, see the same instructions to [Get started with -Mojo](https://docs.modular.com/mojo/manual/get-started), but when you create -your project, instead use the following `magic init` command to set the -conda package channel to `max-nightly`: +### Examples -```bash -magic init hello-world-nightly --format mojoproject \ - -c conda-forge -c https://conda.modular.com/max-nightly -``` +In addition to the end-to-end pipelines, there are many [examples](./examples/) +that exercise various aspects of MAX. You can follow the instructions in the +README for each example or notebook you want to run. -Or, if you're [using conda](https://docs.modular.com/magic/conda), add the -`https://conda.modular.com/max-nightly/` channel to your `environment.yaml` -file. For example: +### Notebooks -```yaml -[project] -name = "Mojo nightly example" -channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] -platforms = ["osx-arm64", "linux-aarch64", "linux-64"] +Check out the [notebooks examples](./examples/notebooks/) for using MAX Engine +🏎️ for models such as -[dependencies] -max = "*" -``` +- [Mistral-7B](./examples/notebooks/mistral7b-python-onnx.ipynb) +- [Roberta-pytorch](./examples/notebooks/roberta-python-pytorch.ipynb) -When you clone this repo, you'll be on the `main` branch by default, -which includes code matching the latest nightly build: +### Tutorials -```bash -git clone https://github.com/modular/mojo.git -``` +The [tutorials](./tutorials/) directory contains the "finished" code for +tutorials you can read at +[docs.modular.com/max/tutorials](https://docs.modular.com/max/tutorials). + +### Docker Container + +The MAX container is our official Docker container for convenient MAX deployment. +It includes the latest MAX version with GPU support, several AI libraries, and +integrates with orchestration tools like Kubernetes. -If you want to instead see the source from the most recent stable -release, then you can switch to the `stable` branch. +The MAX container image is available in the +[Modular Docker Hub repository](https://hub.docker.com/r/modular/max-openai-api/). ## Contributing -When you want to report issues or request features, [please create a GitHub -issue here](https://github.com/modular/mojo/issues). -See [here](./CONTRIBUTING.md) for guidelines on filing good bugs. +Thanks for your interest in contributing to this repository! +We are not accepting pull requests yet. -We welcome contributions to this repo on the -[`main`](https://github.com/modular/mojo/tree/main) -branch. If you’d like to contribute to Mojo, please first read our [Contributor -Guide](https://github.com/modular/mojo/blob/main/CONTRIBUTING.md). +However, we welcome your bug reports. If you have a bug, please file an issue +[here](https://github.com/modular/max/issues/new/choose). -For more general questions or to chat with other Mojo developers, check out our -[Discord](https://discord.gg/modular). +If you need support, the [Discord](https://discord.gg/modular) +community is the best place to share your experiences and chat with +the team and other community members. ## License -This repository and its contributions are licensed under the Apache License v2.0 -with LLVM Exceptions (see the LLVM [License](https://llvm.org/LICENSE.txt)). +This repository and its contributions are licensed under the Apache License +v2.0 with LLVM Exceptions (see the LLVM [License](https://llvm.org/LICENSE.txt)). MAX and Mojo usage and distribution are licensed under the [MAX & Mojo Community License](https://www.modular.com/legal/max-mojo-license). -## Thanks to our contributors +### Third Party Licenses - - - +You are entirely responsible for checking and validating the licenses of +third parties (i.e. Huggingface) for related software and libraries that are downloaded. diff --git a/examples/testing/.gitattributes b/benchmark/.gitattributes similarity index 100% rename from examples/testing/.gitattributes rename to benchmark/.gitattributes diff --git a/benchmark/.gitignore b/benchmark/.gitignore new file mode 100644 index 0000000000..5ecf358c31 --- /dev/null +++ b/benchmark/.gitignore @@ -0,0 +1,7 @@ +# pixi environments +.pixi +*.egg-info +# magic environments +.magic +*.json +*.lock diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000000..b4b56ac55e --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,163 @@ +# Benchmark MAX Serve + +This directory contains tools to benchmark +[MAX Serve](https://docs.modular.com/max/serve/) performance. You can also use +these scripts to compare different LLM serving backends such as +[vLLM](https://github.com/vllm-project/vllm) and +[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM) against MAX. The +benchmarking tools measure throughput, latency, and resource utilization +metrics. + +Key features: + +- Tests any OpenAI-compatible HTTP endpoint +- Supports both chat and completion APIs +- Measures detailed latency metrics +- Works with hosted services + +> The `benchmark_serving.py` script is adapted from +> [vLLM](https://github.com/vllm-project/vllm/blob/main/benchmarks), +> licensed under Apache 2.0. We forked this script to ensure consistency with +> vLLM's measurement methodology and extended it with features we found helpful, +> such as client-side GPU metric collection via `nvitop`. + +## Table of contents + +- [Get started](#get-started) +- [Basic usage](#basic-usage) +- [Reference](#reference) +- [Troubleshooting](#troubleshooting) + +## Get started + +If this is your first time benchmarking a MAX Serve endpoint, +we recommend that you follow our [tutorial to benchmark MAX Serve on +a GPU](https://docs.modular.com/max/tutorials/benchmark-max-serve/). + +## Basic usage + +You can benchmark any HTTP endpoint that implements +OpenAI-compatible APIs as follows. + +First enter the local virtual environment: + +```cd +git clone -b stable https://github.com/modular/max.git + +cd max/benchmark + +magic shell +``` + +Then run the benchmark script while specifying your active +MAX Serve endpoint, model, and corresponding dataset to +use for benchmarking (for more detail, see our [benchmarking +tutorial](https://docs.modular.com/max/tutorials/benchmark-max-serve)): + +```bash +python benchmark_serving.py \ + --base-url https://company_url.xyz \ + --endpoint /v1/completions \ + --backend modular \ + --model meta-llama/Meta-Llama-3.1-8B-Instruct \ + --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json \ + --num-prompts 500 +``` + +To exit the virtual environment shell simply run `exit`. + +### Output + +Results are saved in JSON format under the `results/` directory with the +following naming convention: + +```bash +{backend}-{request_rate}qps-{model_name}-{timestamp}.json +``` + +The output should look similar to the following: + +```bash +============ Serving Benchmark Result ============ +Successful requests: 500 +Failed requests: 0 +Benchmark duration (s): 46.27 +Total input tokens: 100895 +Total generated tokens: 106511 +Request throughput (req/s): 10.81 +Input token throughput (tok/s): 2180.51 +Output token throughput (tok/s): 2301.89 +---------------Time to First Token---------------- +Mean TTFT (ms): 15539.31 +Median TTFT (ms): 15068.37 +P99 TTFT (ms): 33034.17 +-----Time per Output Token (excl. 1st token)------ +Mean TPOT (ms): 34.23 +Median TPOT (ms): 28.47 +P99 TPOT (ms): 138.55 +---------------Inter-token Latency---------------- +Mean ITL (ms): 26.76 +Median ITL (ms): 5.42 +P99 ITL (ms): 228.45 +-------------------Token Stats-------------------- +Max input tokens: 933 +Max output tokens: 806 +Max total tokens: 1570 +--------------------GPU Stats--------------------- +GPU Utilization (%): 94.74 +Peak GPU Memory Used (MiB): 37228.12 +GPU Memory Available (MiB): 3216.25 +================================================== +``` + +### Key metrics explained + +- **Request throughput**: Number of complete requests processed per second +- **Input token throughput**: Number of input tokens processed per second +- **Output token throughput**: Number of tokens generated per second +- **TTFT**: Time to first token (TTFT), the time from request start to first +token generation +- **TPOT**: Time per output token (TPOT), the average time taken to generate +each output token +- **ITL**: Inter-token latency (ITL), the average time between consecutive token +or token-chunk generations +- **GPU utilization**: Percentage of time during which at least one GPU kernel +is being executed +- **Peak GPU memory used**: Peak memory usage during benchmark run + +## Reference + +### Command line arguments for `benchmark_serving.py` + +- Backend configuration: + - `--backend`: Choose from `modular` (MAX Serve), `vllm` (vLLM), or`trt-llm` + (TensorRT-LLM) + - `--model`: Hugging Face model ID or local path +- Load generation: + - `--num-prompts`: Number of prompts to process (default: `500`) + - `--request-rate`: Request rate in requests/second (default: `inf`) + - `--seed`: The random seed used to sample the dataset (default: `0`) +- Serving options + - `--base-url`: Base URL of the API service + - `--endpoint`: Specific API endpoint (`/v1/completions` or + `/v1/chat/completions`) + - `--tokenizer`: Hugging Face tokenizer to use (can be different from model) + - `--dataset-name`: (default:`sharegpt`) Real-world conversation data in the + form of variable length prompts and responses. ShareGPT is automatically + downloaded if not already present. +- Additional options + - `--collect-gpu-stats`: Report GPU utilization and memory consumption. + Only works when running `benchmark_serving.py` on the same instance as + the server, and only on NVIDIA GPUs. + +## Troubleshooting + +### Memory issues + +- Reduce batch size +- Check GPU memory availability: `nvidia-smi` + +### Permission issues + +- Verify `HF_TOKEN` is set correctly +- Ensure model access on Hugging Face diff --git a/benchmark/benchmark_serving.py b/benchmark/benchmark_serving.py new file mode 100644 index 0000000000..7d760c7d38 --- /dev/null +++ b/benchmark/benchmark_serving.py @@ -0,0 +1,1240 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Benchmark online serving throughput.""" + +import argparse +import asyncio +import json +import logging +import os +import random +import resource +import sys +import time +import traceback +import warnings +from argparse import ArgumentParser as FlexibleArgumentParser +from dataclasses import dataclass, field +from datetime import datetime +from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple, Union + +import aiohttp +import numpy as np +from tqdm.asyncio import tqdm +from transformers import ( + AutoTokenizer, + PreTrainedTokenizer, + PreTrainedTokenizerBase, + PreTrainedTokenizerFast, +) + +# 10 minute timeout per request session +AIOHTTP_TIMEOUT = aiohttp.ClientTimeout(total=10 * 60) + +logger = logging.getLogger("benchmark_serving") + + +@dataclass +class RequestFuncInput: + prompt: str + api_url: str + prompt_len: int + output_len: int + model: str + + +@dataclass +class RequestFuncOutput: + generated_text: str = "" + success: bool = False + latency: float = 0.0 + ttft: float = 0.0 # Time to first token + itl: List[float] = field( + default_factory=list + ) # List of inter-token latencies + prompt_len: int = 0 + error: str = "" + + +def compute_output_len( + tokenizer: PreTrainedTokenizerBase, output: RequestFuncOutput +) -> int: + return len( + tokenizer( + output.generated_text, + add_special_tokens=False, + ).input_ids + ) + + +async def async_request_trt_llm( + request_func_input: RequestFuncInput, + pbar: Optional[tqdm] = None, +) -> RequestFuncOutput: + api_url = request_func_input.api_url + assert api_url.endswith("generate_stream") + + async with aiohttp.ClientSession(timeout=AIOHTTP_TIMEOUT) as session: + payload = { + "accumulate_tokens": True, + "text_input": request_func_input.prompt, + "temperature": 0.0, + "top_p": 1.0, + "max_tokens": request_func_input.output_len, + "stream": True, + } + output = RequestFuncOutput() + output.prompt_len = request_func_input.prompt_len + + ttft = 0.0 + st = time.perf_counter() + most_recent_timestamp = st + try: + async with session.post(url=api_url, json=payload) as response: + if response.status == 200: + async for chunk_bytes in response.content: + chunk_bytes = chunk_bytes.strip() + if not chunk_bytes: + continue + + chunk = remove_prefix( + chunk_bytes.decode("utf-8"), "data:" + ) + + data = json.loads(chunk) + output.generated_text += data["text_output"] + timestamp = time.perf_counter() + # First token + if ttft == 0.0: + ttft = time.perf_counter() - st + output.ttft = ttft + + # Decoding phase + else: + output.itl.append(timestamp - most_recent_timestamp) + + most_recent_timestamp = timestamp + + output.latency = most_recent_timestamp - st + output.success = True + + else: + output.error = response.reason or "" + output.success = False + except Exception: + output.success = False + exc_info = sys.exc_info() + output.error = "".join(traceback.format_exception(*exc_info)) + + if pbar: + pbar.update(1) + return output + + +async def async_request_openai_completions( + request_func_input: RequestFuncInput, + pbar: Optional[tqdm] = None, +) -> RequestFuncOutput: + api_url = request_func_input.api_url + assert api_url.endswith(("completions", "profile")), ( + "OpenAI Completions API URL must end with 'completions' or 'profile'." + ) + + async with aiohttp.ClientSession(timeout=AIOHTTP_TIMEOUT) as session: + payload = { + "model": request_func_input.model, + "prompt": request_func_input.prompt, + "temperature": 0.0, + "best_of": 1, + "max_tokens": request_func_input.output_len, + "stream": True, + "ignore_eos": True, + } + + headers = { + "Authorization": f"Bearer {os.environ.get('OPENAI_API_KEY')}" + } + + output = RequestFuncOutput() + output.prompt_len = request_func_input.prompt_len + + generated_text = "" + ttft = 0.0 + st = time.perf_counter() + most_recent_timestamp = st + try: + async with session.post( + url=api_url, json=payload, headers=headers + ) as response: + if response.status == 200: + async for chunk_bytes in response.content: + chunk_bytes = chunk_bytes.strip() + if not chunk_bytes: + continue + + chunk = remove_prefix( + chunk_bytes.decode("utf-8"), "data: " + ) + latency = time.perf_counter() - st + if chunk == "[DONE]": + pass + else: + data = json.loads(chunk) + + # NOTE: Some completion API might have a last + # usage summary response without a token so we + # want to check a token was generated + if data["choices"][0]["text"]: + timestamp = time.perf_counter() + # First token + if ttft == 0.0: + ttft = time.perf_counter() - st + output.ttft = ttft + + # Decoding phase + else: + output.itl.append( + timestamp - most_recent_timestamp + ) + + most_recent_timestamp = timestamp + generated_text += data["choices"][0]["text"] + output.generated_text = generated_text + output.success = True + output.latency = latency + else: + output.error = response.reason or "" + output.success = False + except Exception: + output.success = False + exc_info = sys.exc_info() + output.error = "".join(traceback.format_exception(*exc_info)) + if pbar: + pbar.update(1) + return output + + +async def async_request_openai_chat_completions( + request_func_input: RequestFuncInput, + pbar: Optional[tqdm] = None, +) -> RequestFuncOutput: + api_url = request_func_input.api_url + assert api_url.endswith("chat/completions"), ( + "OpenAI Chat Completions API URL must end with 'chat/completions'." + ) + + async with aiohttp.ClientSession(timeout=AIOHTTP_TIMEOUT) as session: + payload = { + "model": request_func_input.model, + "messages": [ + { + "role": "user", + "content": request_func_input.prompt, + }, + ], + "temperature": 0.0, + "max_tokens": request_func_input.output_len, + "stream": True, + } + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {os.environ.get('OPENAI_API_KEY')}", + } + + output = RequestFuncOutput() + output.prompt_len = request_func_input.prompt_len + + generated_text = "" + ttft = 0.0 + st = time.perf_counter() + most_recent_timestamp = st + try: + async with session.post( + url=api_url, json=payload, headers=headers + ) as response: + if response.status == 200: + async for chunk_bytes in response.content: + chunk_bytes = chunk_bytes.strip() + if not chunk_bytes: + continue + + chunk = remove_prefix( + chunk_bytes.decode("utf-8"), "data: " + ) + latency = time.perf_counter() - st + if chunk == "[DONE]": + pass + else: + timestamp = time.perf_counter() + data = json.loads(chunk) + + delta = data["choices"][0]["delta"] + if delta.get("content", None): + # First token + if ttft == 0.0: + ttft = time.perf_counter() - st + output.ttft = ttft + + # Decoding phase + else: + output.itl.append( + timestamp - most_recent_timestamp + ) + + generated_text += delta["content"] + + most_recent_timestamp = timestamp + + output.generated_text = generated_text + output.success = True + output.latency = latency + else: + output.error = response.reason or "" + output.success = False + except Exception: + output.success = False + exc_info = sys.exc_info() + output.error = "".join(traceback.format_exception(*exc_info)) + + if pbar: + pbar.update(1) + return output + + +# Since vllm must support Python 3.8, we can't use str.removeprefix(prefix) +# introduced in Python 3.9 +def remove_prefix(text: str, prefix: str) -> str: + if text.startswith(prefix): + return text[len(prefix) :] + return text + + +def get_tokenizer( + pretrained_model_name_or_path: str, trust_remote_code: bool +) -> Union[PreTrainedTokenizer, PreTrainedTokenizerFast]: + return AutoTokenizer.from_pretrained( + pretrained_model_name_or_path, trust_remote_code=trust_remote_code + ) + + +ASYNC_REQUEST_FUNCS = { + "vllm": async_request_openai_completions, + "trt-llm": async_request_trt_llm, + "modular": async_request_openai_completions, + "modular-chat": async_request_openai_chat_completions, +} + + +# from https://github.com/sgl-project/sglang/blob/v0.4.0/python/sglang/bench_serving.py#L1283 +def set_ulimit(target_soft_limit=65535): + resource_type = resource.RLIMIT_NOFILE + current_soft, current_hard = resource.getrlimit(resource_type) + + if current_soft < target_soft_limit: + try: + resource.setrlimit(resource_type, (target_soft_limit, current_hard)) + except ValueError as e: + print(f"Fail to set RLIMIT_NOFILE: {e}") + + +@dataclass +class BenchmarkMetrics: + completed: int + failures: int + total_input: int + total_output: int + request_throughput: float + input_throughput: float + output_throughput: float + mean_ttft_ms: float + median_ttft_ms: float + std_ttft_ms: float + p99_ttft_ms: float + mean_tpot_ms: float + median_tpot_ms: float + std_tpot_ms: float + p99_tpot_ms: float + mean_itl_ms: float + median_itl_ms: float + std_itl_ms: float + p99_itl_ms: float + max_input: int + max_output: int + max_total: int + peak_gpu_memory_mib: float # 'benchmark/gpu:0/memory_used (MiB)/max' + available_gpu_memory_mib: float # 'benchmark/gpu:0/memory_free (MiB)/min' + gpu_utilization: float # 'benchmark/gpu:0/gpu_utilization (%)/mean' + + +def sample_sharegpt_requests( + dataset_path: str, + num_requests: int, + tokenizer: PreTrainedTokenizerBase, + fixed_output_len: Optional[int] = None, +) -> List[Tuple[str, int, int]]: + if fixed_output_len is not None and fixed_output_len < 4: + raise ValueError("output_len too small") + # Load the dataset. + with open(dataset_path) as f: + dataset = json.load(f) + # Filter out the conversations with less than 2 turns. + dataset = [data for data in dataset if len(data["conversations"]) >= 2] + # Only keep the first two turns of each conversation. + dataset = [ + (data["conversations"][0]["value"], data["conversations"][1]["value"]) + for data in dataset + ] + + # Shuffle the dataset. + random.shuffle(dataset) + + # Filter out sequences that are too long or too short + filtered_dataset: List[Tuple[str, int, int]] = [] + for i in range(len(dataset)): + if len(filtered_dataset) == num_requests: + break + + # Tokenize the prompts and completions. + prompt = dataset[i][0] + prompt_token_ids = tokenizer(prompt).input_ids + completion = dataset[i][1] + completion_token_ids = tokenizer(completion).input_ids + prompt_len = len(prompt_token_ids) + output_len = ( + len(completion_token_ids) + if fixed_output_len is None + else fixed_output_len + ) + if prompt_len < 4 or output_len < 4: + # Prune too short sequences. + continue + if prompt_len > 1024 or prompt_len + output_len > 2048: + # Prune too long sequences. + continue + filtered_dataset.append((prompt, prompt_len, output_len)) + + return filtered_dataset + + +def sample_sonnet_requests( + dataset_path: str, + num_requests: int, + input_len: int, + output_len: int, + prefix_len: int, + tokenizer: PreTrainedTokenizerBase, +) -> List[Tuple[str, str, int, int]]: + assert input_len > prefix_len, ( + "'args.sonnet-input-len' must be greater than 'args.prefix-input-len'." + ) + + # Load the dataset. + with open(dataset_path) as f: + poem_lines = f.readlines() + + # Tokenize the poem lines. + poem_token_ids = tokenizer(poem_lines).input_ids + average_poem_len = sum( + len(token_ids) for token_ids in poem_token_ids + ) / len(poem_token_ids) + + # Base prefix for all requests. + base_prompt = "Pick as many lines as you can from these poem lines:\n" + base_message = [ + { + "role": "user", + "content": base_prompt, + } + ] + base_prompt_formatted = tokenizer.apply_chat_template( + base_message, add_generation_prompt=True, tokenize=False + ) + base_prompt_offset = len(tokenizer(base_prompt_formatted).input_ids) + + assert input_len > base_prompt_offset, ( + f"Please set 'args.sonnet-input-len' higher than {base_prompt_offset}." + ) + num_input_lines = round((input_len - base_prompt_offset) / average_poem_len) + + # First approximately `prefix_len` number of tokens in the + # prompt are fixed poem lines. + assert prefix_len > base_prompt_offset, ( + f"Please set 'args.sonnet-prefix-len' higher than {base_prompt_offset}." + ) + + num_prefix_lines = round( + (prefix_len - base_prompt_offset) / average_poem_len + ) + prefix_lines = poem_lines[:num_prefix_lines] + + # Sample the rest of lines per request. + sampled_requests: List[Tuple[str, str, int, int]] = [] + for _ in range(num_requests): + sampled_lines = "".join( + prefix_lines + + random.sample(poem_lines, num_input_lines - num_prefix_lines) + ) + + prompt = f"{base_prompt}{sampled_lines}" + message = [ + { + "role": "user", + "content": prompt, + }, + ] + prompt_formatted = tokenizer.apply_chat_template( + message, add_generation_prompt=True, tokenize=False + ) + prompt_len = len(tokenizer(prompt_formatted).input_ids) + sampled_requests.append( + (prompt, prompt_formatted, prompt_len, output_len) + ) + + return sampled_requests + + +def sample_random_requests( + input_len: int, + output_len: int, + num_prompts: int, + range_ratio: float, + tokenizer: PreTrainedTokenizerBase, +) -> List[Tuple[str, int, int]]: + input_lens = np.random.randint( + int(input_len * range_ratio), + input_len + 1, + size=num_prompts, + ) + output_lens = np.random.randint( + int(output_len * range_ratio), + output_len + 1, + size=num_prompts, + ) + offsets = np.random.randint(0, tokenizer.vocab_size, size=num_prompts) + input_requests = [] + for i in range(num_prompts): + prompt = tokenizer.decode( + [ + (offsets[i] + i + j) % tokenizer.vocab_size + for j in range(input_lens[i]) + ] + ) + input_requests.append((prompt, int(input_lens[i]), int(output_lens[i]))) + + return input_requests + + +async def get_request( + input_requests: List[Tuple[str, int, int]], + request_rate: float, +) -> AsyncGenerator[Tuple[str, int, int], None]: + for request in input_requests: + yield request + + if request_rate == float("inf"): + # If the request rate is infinity, then we don't need to wait. + continue + + # Sample the request interval from the exponential distribution. + interval = np.random.exponential(1.0 / request_rate) + # The next request will be sent after the interval. + await asyncio.sleep(interval) + + +def calculate_metrics( + input_requests: List[Tuple[str, int, int]], + outputs: List[RequestFuncOutput], + dur_s: float, + tokenizer: PreTrainedTokenizerBase, + gpu_metrics: Dict[str, Any], +) -> Tuple[BenchmarkMetrics, List[int]]: + actual_output_lens: List[int] = [] + total_input = 0 + completed = 0 + max_input = 0 + max_output = 0 + max_total = 0 + failures = 0 + failed_responses = [] + itls: List[float] = [] + tpots: List[float] = [] + ttfts: List[float] = [] + for i in range(len(outputs)): + if outputs[i].success: + # We use the tokenizer to count the number of output tokens for all + # serving backends instead of looking at len(outputs[i].itl) since + # multiple output tokens may be bundled together + # Note : this may inflate the output token count slightly + output_len = compute_output_len(tokenizer, outputs[i]) + actual_output_lens.append(output_len) + total_input += input_requests[i][1] + if output_len > 1: + tpots.append( + (outputs[i].latency - outputs[i].ttft) / (output_len - 1) + ) + itls += outputs[i].itl + ttfts.append(outputs[i].ttft) + completed += 1 + max_input = max(max_input, input_requests[i][1]) + max_output = max(max_output, output_len) + max_total = max(max_total, input_requests[i][1] + output_len) + else: + actual_output_lens.append(0) + failures = failures + 1 + failed_responses.append(outputs[i]) + + if failures != 0: + warnings.warn( + ( + "Some requests failed. The responses returned are displayed " + "below. Please check server logs for more information." + ), + stacklevel=2, + ) + for f in failed_responses: + logger.error(f"Failed :: {f}") + + if completed == 0: + warnings.warn( + ( + "All requests failed. This is likely due to a misconfiguration " + "on the benchmark arguments." + ), + stacklevel=2, + ) + metrics = BenchmarkMetrics( + completed=completed, + failures=failures, + total_input=total_input, + total_output=sum(actual_output_lens), + request_throughput=completed / dur_s, + input_throughput=total_input / dur_s, + output_throughput=sum(actual_output_lens) / dur_s, + mean_ttft_ms=float(np.mean(ttfts or 0)) + * 1000, # ttfts is empty if streaming is not supported by backend + median_ttft_ms=float(np.median(ttfts or 0)) * 1000, + std_ttft_ms=float(np.std(ttfts or 0)) * 1000, + p99_ttft_ms=float(np.percentile(ttfts or 0, 99)) * 1000, + mean_tpot_ms=float(np.mean(tpots or 0)) * 1000, + median_tpot_ms=float(np.median(tpots or 0)) * 1000, + std_tpot_ms=float(np.std(tpots or 0)) * 1000, + p99_tpot_ms=float(np.percentile(tpots or 0, 99)) * 1000, + mean_itl_ms=float(np.mean(itls or 0)) * 1000, + median_itl_ms=float(np.median(itls or 0)) * 1000, + std_itl_ms=float(np.std(itls or 0)) * 1000, + p99_itl_ms=float(np.percentile(itls or 0, 99)) * 1000, + max_input=max_input, + max_output=max_output, + max_total=max_total, + peak_gpu_memory_mib=float( + gpu_metrics.get("benchmark/gpu:0/memory_used (MiB)/max") or 0 + ), + available_gpu_memory_mib=float( + gpu_metrics.get("benchmark/gpu:0/memory_free (MiB)/min") or 0 + ), + gpu_utilization=float( + gpu_metrics.get("benchmark/gpu:0/gpu_utilization (%)/mean") or 0 + ), + ) + + return metrics, actual_output_lens + + +async def benchmark( + backend: str, + api_url: str, + base_url: str, + model_id: str, + tokenizer: PreTrainedTokenizerBase, + input_requests: List[Tuple[str, int, int]], + request_rate: float, + disable_tqdm: bool, + do_test_prompt: bool, + collect_gpu_stats: bool, + print_inputs_and_outputs: bool, +): + if backend in ASYNC_REQUEST_FUNCS: + request_func = ASYNC_REQUEST_FUNCS[backend] + else: + raise ValueError(f"Unknown backend: {backend}") + + if do_test_prompt: + logger.info("Starting initial single prompt test run...") + test_prompt, test_prompt_len, test_output_len = input_requests[0] + test_input = RequestFuncInput( + model=model_id, + prompt=test_prompt, + api_url=api_url, + prompt_len=test_prompt_len, + output_len=test_output_len, + ) + test_output = await request_func( + request_func_input=test_input, + ) + if not test_output.success: + raise ValueError( + "Initial test run failed - Please make sure benchmark" + " arguments are correctly specified. Error:" + f" {test_output.error}" + ) + else: + logger.info( + "Initial test run completed. Starting main benchmark run..." + ) + + logger.info(f"Traffic request rate: {request_rate}") + + pbar = None if disable_tqdm else tqdm(total=len(input_requests)) + if collect_gpu_stats: + from nvitop import ResourceMetricCollector + + collector = ResourceMetricCollector() + collector.start("benchmark") + + benchmark_start_time = time.perf_counter_ns() + tasks: List[asyncio.Task] = [] + async for request in get_request(input_requests, request_rate): + prompt, prompt_len, output_len = request + request_func_input = RequestFuncInput( + model=model_id, + prompt=prompt, + api_url=api_url, + prompt_len=prompt_len, + output_len=output_len, + ) + tasks.append( + asyncio.create_task( + request_func( + request_func_input=request_func_input, + pbar=pbar, + ) + ) + ) + outputs: List[RequestFuncOutput] = await asyncio.gather(*tasks) + + if pbar is not None: + pbar.close() + + benchmark_duration = (time.perf_counter_ns() - benchmark_start_time) / 1e9 + + if print_inputs_and_outputs: + print("Generated output text:") + for req_id, output in enumerate(outputs): + output_len = compute_output_len(tokenizer, output) + print( + { + "req_id": req_id, + "output_len": output_len, + "output": output.generated_text, + } + ) + + if collect_gpu_stats: + gpu_metrics = collector.collect() + collector.stop() + else: + gpu_metrics = {} + + metrics, actual_output_lens = calculate_metrics( + input_requests=input_requests, + outputs=outputs, + dur_s=benchmark_duration, + tokenizer=tokenizer, + gpu_metrics=gpu_metrics, + ) + + print("{s:{c}^{n}}".format(s=" Serving Benchmark Result ", n=50, c="=")) + print("{:<40} {:<10}".format("Successful requests:", metrics.completed)) + print("{:<40} {:<10}".format("Failed requests:", metrics.failures)) + print( + "{:<40} {:<10.2f}".format("Benchmark duration (s):", benchmark_duration) + ) + print("{:<40} {:<10}".format("Total input tokens:", metrics.total_input)) + print( + "{:<40} {:<10}".format("Total generated tokens:", metrics.total_output) + ) + print( + "{:<40} {:<10.2f}".format( + "Request throughput (req/s):", metrics.request_throughput + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Input token throughput (tok/s):", metrics.input_throughput + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Output token throughput (tok/s):", metrics.output_throughput + ) + ) + print("{s:{c}^{n}}".format(s="Time to First Token", n=50, c="-")) + print("{:<40} {:<10.2f}".format("Mean TTFT (ms):", metrics.mean_ttft_ms)) + print( + "{:<40} {:<10.2f}".format("Median TTFT (ms):", metrics.median_ttft_ms) + ) + print("{:<40} {:<10.2f}".format("P99 TTFT (ms):", metrics.p99_ttft_ms)) + print( + "{s:{c}^{n}}".format( + s="Time per Output Token (excl. 1st token)", n=50, c="-" + ) + ) + print("{:<40} {:<10.2f}".format("Mean TPOT (ms):", metrics.mean_tpot_ms)) + print( + "{:<40} {:<10.2f}".format("Median TPOT (ms):", metrics.median_tpot_ms) + ) + print("{:<40} {:<10.2f}".format("P99 TPOT (ms):", metrics.p99_tpot_ms)) + print("{s:{c}^{n}}".format(s="Inter-token Latency", n=50, c="-")) + print("{:<40} {:<10.2f}".format("Mean ITL (ms):", metrics.mean_itl_ms)) + print("{:<40} {:<10.2f}".format("Median ITL (ms):", metrics.median_itl_ms)) + print("{:<40} {:<10.2f}".format("P99 ITL (ms):", metrics.p99_itl_ms)) + print("{s:{c}^{n}}".format(s="Token Stats", n=50, c="-")) + print("{:<40} {:<10}".format("Max input tokens:", metrics.max_input)) + print("{:<40} {:<10}".format("Max output tokens:", metrics.max_output)) + print("{:<40} {:<10}".format("Max total tokens:", metrics.max_total)) + if collect_gpu_stats: + print("{s:{c}^{n}}".format(s="GPU Stats", n=50, c="-")) + print( + "{:<40} {:<10.2f}".format( + "GPU Utilization (%):", metrics.gpu_utilization + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Peak GPU Memory Used (MiB):", metrics.peak_gpu_memory_mib + ) + ) + print( + "{:<40} {:<10.2f}".format( + "GPU Memory Available (MiB):", metrics.available_gpu_memory_mib + ) + ) + + print("=" * 50) + + result = { + "duration": benchmark_duration, + "completed": metrics.completed, + "total_input_tokens": metrics.total_input, + "total_output_tokens": metrics.total_output, + "request_throughput": metrics.request_throughput, + "input_throughput": metrics.input_throughput, + "output_throughput": metrics.output_throughput, + "mean_ttft_ms": metrics.mean_ttft_ms, + "median_ttft_ms": metrics.median_ttft_ms, + "std_ttft_ms": metrics.std_ttft_ms, + "p99_ttft_ms": metrics.p99_ttft_ms, + "mean_tpot_ms": metrics.mean_tpot_ms, + "median_tpot_ms": metrics.median_tpot_ms, + "std_tpot_ms": metrics.std_tpot_ms, + "p99_tpot_ms": metrics.p99_tpot_ms, + "mean_itl_ms": metrics.mean_itl_ms, + "median_itl_ms": metrics.median_itl_ms, + "std_itl_ms": metrics.std_itl_ms, + "p99_itl_ms": metrics.p99_itl_ms, + "input_lens": [output.prompt_len for output in outputs], + "output_lens": actual_output_lens, + "ttfts": [output.ttft for output in outputs], + "itls": [output.itl for output in outputs], + "generated_texts": [output.generated_text for output in outputs], + "errors": [output.error for output in outputs], + "peak_gpu_memory_mib": metrics.peak_gpu_memory_mib, + "available_gpu_memory_mib": metrics.available_gpu_memory_mib, + "gpu_utilization": metrics.gpu_utilization, + } + return result + + +def main(args: argparse.Namespace): + logging.basicConfig( + format="%(asctime)s.%(msecs)03d %(levelname)s: %(name)s: %(message)s", + datefmt="%H:%M:%S", + level=logging.INFO, + ) + + logger.info(args) + random.seed(args.seed) + np.random.seed(args.seed) + # benchmarks can create a large number of concurrent in-flight requests + # so bump the file limit to make room for them + set_ulimit() + + backend = args.backend + model_id = args.model + tokenizer_id = args.tokenizer if args.tokenizer is not None else args.model + + if args.base_url is not None: + api_url = f"{args.base_url}{args.endpoint}" + base_url = f"{args.base_url}" + else: + api_url = f"http://{args.host}:{args.port}{args.endpoint}" + base_url = f"http://{args.host}:{args.port}" + + logger.info(f"getting tokenizer. api url: {api_url}, base_url: {base_url}") + tokenizer = get_tokenizer( + tokenizer_id, trust_remote_code=args.trust_remote_code + ) + + logger.info("sampling requests") + if args.dataset is not None: + warnings.warn( + ( + "The '--dataset' argument will be deprecated in the next " + "release. Please use '--dataset-name' and " + "'--dataset-path' in the future runs." + ), + stacklevel=2, + ) + input_requests = sample_sharegpt_requests( + dataset_path=args.dataset, + num_requests=args.num_prompts, + tokenizer=tokenizer, + fixed_output_len=args.sharegpt_output_len, + ) + + elif args.dataset_name == "sharegpt": + input_requests = sample_sharegpt_requests( + dataset_path=args.dataset_path, + num_requests=args.num_prompts, + tokenizer=tokenizer, + fixed_output_len=args.sharegpt_output_len, + ) + + elif args.dataset_name == "sonnet": + # Sample sonnet requests with common parameters + sonnet_requests = sample_sonnet_requests( + dataset_path=args.dataset_path, + num_requests=args.num_prompts, + input_len=args.sonnet_input_len, + output_len=args.sonnet_output_len, + prefix_len=args.sonnet_prefix_len, + tokenizer=tokenizer, + ) + + # Do not format the prompt, pass to message directly + if args.backend == "openai-chat": + # For chat API, use raw prompt without formatting + input_requests = [ + (prompt, prompt_len, output_len) + for prompt, _, prompt_len, output_len in sonnet_requests + ] + else: + # For non-chat API, ensure model has chat template and use formatted prompt + assert tokenizer.chat_template or tokenizer.default_chat_template, ( + "Tokenizer/model must have chat template for sonnet dataset." + ) + input_requests = [ + (prompt_formatted, prompt_len, output_len) + for _, prompt_formatted, prompt_len, output_len in sonnet_requests + ] + + elif args.dataset_name == "random": + input_requests = sample_random_requests( + input_len=args.random_input_len, + output_len=args.random_output_len, + num_prompts=args.num_prompts, + range_ratio=args.random_range_ratio, + tokenizer=tokenizer, + ) + + else: + raise ValueError(f"Unknown dataset: {args.dataset_name}") + + if args.print_inputs_and_outputs: + print("Input prompts:") + for req_id, (prompt_formatted, prompt_len, output_len) in enumerate( + input_requests + ): + print( + { + "req_id": req_id, + "output_len": output_len, + "prompt_len": prompt_len, + "prompt": prompt_formatted, + } + ) + + logger.info("starting benchmark run") + benchmark_result = asyncio.run( + benchmark( + backend=backend, + api_url=api_url, + base_url=base_url, + model_id=model_id, + tokenizer=tokenizer, + input_requests=input_requests, + request_rate=args.request_rate, + disable_tqdm=args.disable_tqdm, + do_test_prompt=not args.skip_test_prompt, + collect_gpu_stats=args.collect_gpu_stats, + print_inputs_and_outputs=args.print_inputs_and_outputs, + ) + ) + + # Benchmark run failed if any failed requests + if args.num_prompts != benchmark_result["completed"]: + logger.info("finished benchmark run: Failed.") + sys.exit(1) + + # Save config and results to json + if args.save_result: + logger.info("saving results") + result_json: Dict[str, Any] = {} + + # Setup + current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + result_json["date"] = current_dt + result_json["backend"] = backend + result_json["model_id"] = model_id + result_json["tokenizer_id"] = tokenizer_id + result_json["num_prompts"] = args.num_prompts + result_json["server_args"] = args.server_args + result_json["dataset_name"] = args.dataset_name + + # Metadata + if args.metadata: + for item in args.metadata: + if "=" in item: + kvstring = item.split("=") + result_json[kvstring[0].strip()] = kvstring[1].strip() + else: + raise ValueError( + "Invalid metadata format. Please use KEY=VALUE format." + ) + + # Traffic + result_json["request_rate"] = ( + args.request_rate if args.request_rate < float("inf") else "inf" + ) + + # Merge with benchmark result + result_json = {**result_json, **benchmark_result} + + # Save to file + base_model_id = model_id.split("/")[-1] + file_name = f"{backend}-{args.request_rate}qps-{base_model_id}-{current_dt}.json" # noqa + if args.result_filename: + file_name = args.result_filename + if args.result_dir: + file_name = os.path.join(args.result_dir, file_name) + with open(file_name, "w") as outfile: + json.dump(result_json, outfile) + + logger.info("finished benchmark run: Success.") + + +if __name__ == "__main__": + parser = FlexibleArgumentParser( + description="Benchmark the online serving throughput." + ) + parser.add_argument( + "--backend", + type=str, + default="modular", + choices=list(ASYNC_REQUEST_FUNCS.keys()), + ) + parser.add_argument( + "--base-url", + type=str, + default=None, + help="Server or API base url if not using http host and port.", + ) + parser.add_argument("--host", type=str, default="localhost") + parser.add_argument("--port", type=int, default=8000) + parser.add_argument( + "--endpoint", + type=str, + default="/v1/completions", + help="API endpoint.", + ) + parser.add_argument( + "--dataset", + type=str, + default=None, + help=( + "Path to the ShareGPT dataset, will be deprecated in the " + "next release." + ), + ) + parser.add_argument( + "--dataset-name", + type=str, + default="sharegpt", + choices=["sharegpt", "sonnet", "random"], + help="Name of the dataset to benchmark on.", + ) + parser.add_argument( + "--dataset-path", type=str, default=None, help="Path to the dataset." + ) + parser.add_argument( + "--model", + type=str, + required=True, + help="Name of the model.", + ) + parser.add_argument( + "--tokenizer", + type=str, + help=( # noqa: E501 + "Name or path of the tokenizer, if not using the default tokenizer." + ), + ) + parser.add_argument( + "--num-prompts", + type=int, + default=1000, + help="Number of prompts to process.", + ) + parser.add_argument( + "--sharegpt-output-len", + type=int, + default=None, + help=( + "Output length for each request. Overrides the output length " + "from the ShareGPT dataset." + ), + ) + parser.add_argument( + "--sonnet-input-len", + type=int, + default=550, + help=( + "Number of input tokens per request, used only for sonnet dataset." + ), + ) + parser.add_argument( + "--sonnet-output-len", + type=int, + default=150, + help=( + "Number of output tokens per request, used only for sonnet dataset." + ), + ) + parser.add_argument( + "--sonnet-prefix-len", + type=int, + default=200, + help=( + "Number of prefix tokens per request, used only for sonnet dataset." + ), + ) + parser.add_argument( + "--random-input-len", + type=int, + default=1024, + help=( + "Number of input tokens per request, used only for random sampling." + ), + ) + parser.add_argument( + "--random-output-len", + type=int, + default=128, + help=( + "Number of output tokens per request, used only for random" + " sampling." + ), + ) + parser.add_argument( + "--random-range-ratio", + type=float, + default=1.0, + help=( + "Range of sampled ratio of input/output length, " + "used only for random sampling." + ), + ) + parser.add_argument( + "--request-rate", + type=float, + default=float("inf"), + help=( + "Number of requests per second. If this is inf, " + "then all the requests are sent at time 0. " + "Otherwise, we use Poisson process to synthesize " + "the request arrival times." + ), + ) + parser.add_argument("--seed", type=int, default=0) + parser.add_argument( + "--trust-remote-code", + action="store_true", + help="Trust remote code from huggingface", + ) + parser.add_argument( + "--disable-tqdm", + action="store_true", + help="Specify to disable tqdm progress bar.", + ) + parser.add_argument( + "--skip-test-prompt", + action="store_true", + help="Skip the test prompt. Useful when doing external profiling.", + ) + parser.add_argument( + "--collect-gpu-stats", + action="store_true", + help="Collect GPU stats with NVML (NVIDIA only).", + ) + parser.add_argument( + "--save-result", + action="store_true", + help="Specify to save benchmark results to a json file", + ) + parser.add_argument( + "--metadata", + metavar="KEY=VALUE", + nargs="*", + help=( + "Key-value pairs (e.g, --metadata version=0.3.3 tp=1) " + "for metadata of this run to be saved in the result JSON file " + "for record keeping purposes." + ), + ) + parser.add_argument( + "--result-dir", + type=str, + default=None, + help=( + "Specify directory to save benchmark json results." + "If not specified, results are saved in the current directory." + ), + ) + parser.add_argument( + "--result-filename", + type=str, + default=None, + help=( + "Specify the filename to save benchmark json results." + "If not specified, results will be saved in " + "{backend}-{args.request_rate}qps-{base_model_id}-{current_dt}.json" + " format." + ), + ) + parser.add_argument( + "--print-inputs-and-outputs", + action="store_true", + help="Print all input and outputs to console.", + ) + + parser.add_argument( + "--server-args", + type=str, + default="", + help="Server args", + ) + + args = parser.parse_args() + main(args) diff --git a/benchmark/pyproject.toml b/benchmark/pyproject.toml new file mode 100644 index 0000000000..af102c505f --- /dev/null +++ b/benchmark/pyproject.toml @@ -0,0 +1,32 @@ +[project] +authors = [{ name = "Modular", email = "hello@modular.com" }] +dependencies = [ + "aiohttp>=3.11.10,<4", + "huggingface-hub>=0.26.5,<0.27", + "hf-transfer>=0.1.8,<0.2", + "numpy>=2.2.0,<3", + "tqdm>=4.67.1,<5", + "transformers>=4.47.0,<5", + "nvitop>=1.3.2,<2", + "jinja2>=3.1.4,<4", +] +description = "MAX Serve benchmarking tools" +name = "benchmarking" +requires-python = ">=3.9,<3.13" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.hatch.build.targets.wheel] +packages = ["."] + +[tool.pixi.project] +channels = ["conda-forge", "https://conda.modular.com/max"] +platforms = ["osx-arm64", "linux-64", "linux-aarch64"] + +[tool.pixi.pypi-dependencies] +benchmarking = { path = ".", editable = true } + +[tool.pixi.tasks] diff --git a/benchmark/requirements.txt b/benchmark/requirements.txt new file mode 100644 index 0000000000..8f2b35964d --- /dev/null +++ b/benchmark/requirements.txt @@ -0,0 +1,8 @@ +aiohttp +huggingface_hub[hf_transfer] +huggingface_hub +numpy +tqdm +transformers +nvitop +Jinja2 diff --git a/examples/README.md b/examples/README.md index 6c651cd92d..0722ca6ec4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,48 +1,39 @@ -# Mojo code examples +# MAX examples -A collection of sample programs written in the -[Mojo](https://docs.modular.com/mojo/manual/) programming language. +These examples demonstrate the power and flexibility of +[MAX](https://docs.modular.com/max/). They include: -## Getting Started +## [Custom GPU and CPU operations in Mojo](custom_ops/) -The easiest way to get started with Mojo is to install the Magic package and -virtual environment manager. By following the instructions in [Get started with -Magic](https://docs.modular.com/magic/), you can quickly install Magic and use -it to create a virtual environment for Mojo programming. Alternatively, you can -follow the instructions for how to [Add MAX/Mojo to a conda -project](https://docs.modular.com/magic/conda). +The [MAX Graph API](https://docs.modular.com/max/graph/) provides a powerful +framework for staging computational graphs to be run on GPUs, CPUs, and more. +Each operation in one of these graphs is defined in +[Mojo](https://docs.modular.com/mojo/), an easy-to-use language for writing +high-performance code. -After you have set up a Mojo programming environment, you can then use `git` to -clone this repository of Mojo samples using the command below: +The examples here illustrate how to construct custom graph operations in Mojo +that run on GPUs and CPUs, as well as how to build computational graphs that +contain and run them on different hardware architectures. -```bash -git clone https://github.com/modular/mojo.git -``` +## [Compiling and running Mojo functions on a GPU](gpu_functions/) -## Running +In addition to placing custom Mojo functions within a computational graph, the +MAX Driver API can handle direct compilation of GPU functions written in Mojo +and can dispatch them onto the GPU. This is a programming model that may be +familiar to those who have worked with CUDA or similar GPGPU frameworks. -If you're using [`magic`](https://docs.modular.com/magic), navigate into -the `examples` directory and use `magic run` to invoke `mojo` and run the basic -example programs. For example: +These examples show how to compile and run Mojo functions, from simple to +complex, on an available GPU. Note that +[a MAX-compatible GPU](https://docs.modular.com/max/faq/#gpu-requirements) will +be necessary to build and run these. -```bash -magic run mojo matmul.mojo -``` +## [PyTorch and ONNX inference on MAX](inference/) -You'll also find several complete Mojo projects as subdirectories of the -`examples` directory. +MAX has the power to accelerate existing PyTorch and ONNX models directly, and +provides Python, Mojo, and C APIs for this. These examples showcase common +models from these frameworks and how to run them even faster via MAX. -## License +## [Jupyter notebooks](notebooks/) -The Mojo examples in this repository are licensed under the Apache License v2.0 -with LLVM Exceptions (see the LLVM [License](https://llvm.org/LICENSE.txt)). - -## Contributing - -As a contributor, your efforts and expertise are invaluable in driving the -evolution of the Mojo programming language. The [Mojo contributor -guide](../CONTRIBUTING.md) provides all the information necessary to make -meaningful contributions—from understanding the submission process to -adhering to best practices: - -- [Mojo contributor guide](../CONTRIBUTING.md) +Jupyter notebooks that showcase PyTorch and ONNX models being accelerated +through MAX. diff --git a/examples/console.py b/examples/console.py new file mode 100644 index 0000000000..be8b77485a --- /dev/null +++ b/examples/console.py @@ -0,0 +1,179 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +import subprocess +from enum import Enum +from pathlib import Path +from typing import List, Optional, Tuple + +try: + from rich.console import Console + from rich.prompt import Confirm + from rich.table import Table + +except ImportError: + print("rich not found. Installing rich...") + subprocess.run(["python3", "-m", "pip", "install", "rich"]) + from rich.console import Console + from rich.prompt import Confirm + from rich.table import Table + +ROOT = Path(os.path.dirname(__file__)) +RETRIES = 10 +EXCEEDED_RETRY_ERROR = ( + "Exceeded the number of retries. Please re-run the console again and follow" + " the prompt." +) + + +def list_repositories() -> List[Tuple[str, str]]: + repos = [] + for top_repo in os.listdir(ROOT): + # Skip notebook folder and files + if "notebook" in top_repo or not os.path.isdir(top_repo): + continue + + repo = os.path.join(ROOT, top_repo) + for r in os.listdir(repo): + full_path = os.path.join(repo, r) + if os.path.isdir(full_path) and os.path.exists( + os.path.join(full_path, "run.sh") + ): + repos.append((os.path.join(top_repo, r), full_path)) + + repos = sorted(repos, key=lambda x: x[0]) + return repos + + +class InputState(Enum): + PROMPT_INPUT = 0 + VALIDATE_INPUT = 1 + CHECK_RANGE = 2 + + +def prompt_validation( + console: Console, retries: int, repos: List[Tuple[str, str]] +) -> Optional[Tuple[str, str]]: + state = InputState.PROMPT_INPUT + selected_index = None + n_repos = len(repos) + while retries > 0: + if state == InputState.PROMPT_INPUT: + selected_index = console.input( + "Enter the index of an example to run: " + ) + state = InputState.VALIDATE_INPUT + elif state == InputState.VALIDATE_INPUT: + if not selected_index.strip(): + selected_index = console.input( + f"Please enter an index between {0}-{n_repos - 1}: " + ) + retries -= 1 + if retries <= 0: + console.print(EXCEEDED_RETRY_ERROR, style="red") + return None + else: + continue + + try: + selected_index = int(selected_index) + state = InputState.CHECK_RANGE + except ValueError: + selected_index = console.input( + f"The index must be an integer between {0}-{n_repos - 1}: " + ) + retries -= 1 + if retries <= 0: + console.print(EXCEEDED_RETRY_ERROR, style="red") + return None + else: + state = InputState.VALIDATE_INPUT + continue + + elif state == InputState.CHECK_RANGE: + if 0 <= selected_index < n_repos: + return repos[selected_index] + else: + selected_index = console.input( + f"Please enter an index between {0}-{n_repos - 1}: " + ) + retries -= 1 + if retries <= 0: + console.print(EXCEEDED_RETRY_ERROR, style="red") + return None + else: + state = InputState.VALIDATE_INPUT + continue + + console.print(EXCEEDED_RETRY_ERROR) + return None + + +def select_repository( + console: Console, + repos: List[Tuple[str, str]], +) -> Optional[Tuple[str, str]]: + table = Table(title="Select the Example to Run", highlight=True) + table.add_column("Index", style="cyan", justify="center") + table.add_column( + "MAX Engine 🏎️ Examples 🔥", style="magenta", justify="left" + ) + for index, (name, _) in enumerate(repos): + table.add_row(str(index), name) + + console.print(table) + selected_repo = prompt_validation(console, RETRIES, repos) + if selected_repo is None: + return + + return selected_repo + + +def run_repository(repo_name: str) -> None: + repo_path = os.path.join(ROOT, repo_name) + run_script_path = (Path(repo_path) / "run.sh").resolve() + subprocess.run(["magic", "run", "bash", run_script_path], cwd=repo_path) + return + + +def main(): + repos = list_repositories() + console = Console() + if not repos: + console.print("No repositories found. Exiting!", style="red") + return + + exit_ = False + while not exit_: + console.print("\n") + selected = select_repository(console, repos) + if selected is None: + return + + _, selected_repo = selected + console.print(f"Running {selected_repo} ...") + run_repository(selected_repo) + another = Confirm.ask("Would you like to run another example?") + if not another: + exit_ = True + console.print( + "Thanks for trying the examples! Bye 👋", style="green" + ) + break + else: + console.print("Here is the example table again \n", style="green") + + +if __name__ == "__main__": + main() diff --git a/examples/custom_ops/.gitignore b/examples/custom_ops/.gitignore new file mode 100644 index 0000000000..aff686d201 --- /dev/null +++ b/examples/custom_ops/.gitignore @@ -0,0 +1 @@ +kernels.mojopkg diff --git a/examples/custom_ops/README.md b/examples/custom_ops/README.md new file mode 100644 index 0000000000..31825508ca --- /dev/null +++ b/examples/custom_ops/README.md @@ -0,0 +1,55 @@ +# Writing custom CPU or GPU graph operations using Mojo + +> [!NOTE] +> This is a preview of an interface for writing custom operations in Mojo, +> and may be subject to change before the next stable release. + +Graphs in MAX can be extended to use custom operations written in Mojo. The +following examples are shown here: + +- **addition**: Adding 1 to every element of an input tensor. +- **mandelbrot**: Calculating the Mandelbrot set. +- **vector_addition**: Performing vector addition using a manual GPU function. +- **top_k**: A top-K token sampler, a complex operation that shows a real-world + use case for a custom operation used today within a large language model + processing pipeline. +- **matrix_multiplication**: Various matrix multiplication algorithms, using a + memory layout abstraction. +- **fused_attention**: A fused attention operation, which leverages many of the + available MAX GPU programming features to show how to address an important + use case in AI models. + +Custom kernels have been written in Mojo to carry out these calculations. For +each example, a simple graph containing a single operation is constructed +in Python. This graph is compiled and dispatched onto a supported GPU if one is +available, or the CPU if not. Input tensors, if there are any, are moved from +the host to the device on which the graph is running. The graph then runs and +the results are copied back to the host for display. + +One thing to note is that this same Mojo code runs on CPU as well as GPU. In +the construction of the graph, it runs on a supported accelerator if one is +available or falls back to the CPU if not. No code changes for either path. +The `vector_addition` example shows how this works under the hood for common +MAX abstractions, where compile-time specialization lets MAX choose the optimal +code path for a given hardware architecture. + +The `kernels/` directory contains the custom kernel implementations, and the +graph construction occurs in the Python files in the base directory. These +examples are designed to stand on their own, so that they can be used as +templates for experimentation. + +A single Magic command runs each of the examples: + +```sh +magic run addition +magic run mandelbrot +magic run vector_addition +magic run top_k +magic run matrix_multiplication +magic run fused_attention +``` + +The execution has two phases: first a `kernels.mojopkg` is compiled from the +custom Mojo kernel, and then the graph is constructed and run in Python. The +inference session is pointed to the `kernels.mojopkg` in order to load the +custom operations. diff --git a/examples/custom_ops/addition.py b/examples/custom_ops/addition.py new file mode 100644 index 0000000000..aa1301f812 --- /dev/null +++ b/examples/custom_ops/addition.py @@ -0,0 +1,79 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import numpy as np +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops + +if __name__ == "__main__": + # This is necessary only in specific build environments. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + rows = 5 + columns = 10 + dtype = DType.float32 + + # Configure our simple one-operation graph. + graph = Graph( + "addition", + # The custom Mojo operation is referenced by its string name, and we + # need to provide inputs as a list as well as expected output types. + forward=lambda x: ops.custom( + name="add_one_custom", + values=[x], + out_types=[TensorType(dtype=x.dtype, shape=x.tensor.shape)], + )[0].tensor, + input_types=[ + TensorType(dtype, shape=[rows, columns]), + ], + ) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession( + devices=[device], + custom_extensions=path, + ) + + # Compile the graph. + model = session.load(graph) + + # Fill an input matrix with random values. + x_values = np.random.uniform(size=(rows, columns)).astype(np.float32) + + # Create a driver tensor from this, and move it to the accelerator. + x = Tensor.from_numpy(x_values).to(device) + + # Perform the calculation on the target device. + result = model.execute(x)[0] + + # Copy values back to the CPU to be read. + assert isinstance(result, Tensor) + result = result.to(CPU()) + + print("Graph result:") + print(result.to_numpy()) + print() + + print("Expected result:") + print(x_values + 1) diff --git a/examples/custom_ops/fused_attention.py b/examples/custom_ops/fused_attention.py new file mode 100644 index 0000000000..03d1367148 --- /dev/null +++ b/examples/custom_ops/fused_attention.py @@ -0,0 +1,72 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import numpy as np +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine.api import InferenceSession +from max.graph import Graph, TensorType, ops + + +def main(): + # This is necessary only for Modular internal CI. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + dtype = DType.float32 + N = 8 + D = 8 + BD = 4 + BN = 4 + with Graph( + "fused_attention", + input_types=[ + TensorType(dtype, shape=[N, D]), + TensorType(dtype, shape=[N, D]), + TensorType(dtype, shape=[N, D]), + ], + ) as graph: + q, k, v, *_ = graph.inputs + results = ops.custom( + name="fused_attention_custom", + parameters={"N": N, "D": D, "BD": BD, "BN": BN}, + values=[q, k, v], + out_types=[TensorType(dtype, shape=[N, D])], + ) + graph.output(*results) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession(devices=[device], custom_extensions=path) + + # Compile the graph. + model = session.load(graph) + + np.random.seed(123) + Q = Tensor.from_numpy(np.random.randn(N, D).astype("f")).to(device) + K = Tensor.from_numpy(np.random.randn(N, D).astype("f")).to(device) + V = Tensor.from_numpy(np.random.randn(N, D).astype("f")).to(device) + + output = model.execute(Q, K, V) + print(output) + + +if __name__ == "__main__": + main() diff --git a/examples/custom_ops/histogram.py b/examples/custom_ops/histogram.py new file mode 100644 index 0000000000..4ebcbe2bfe --- /dev/null +++ b/examples/custom_ops/histogram.py @@ -0,0 +1,77 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import numpy as np +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops + +if __name__ == "__main__": + # This is necessary only in specific build environments. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + n = 2**20 + + # Configure our simple one-operation graph. + graph = Graph( + "histogram", + # The custom Mojo operation is referenced by its string name, and we + # need to provide inputs as a list as well as expected output types. + forward=lambda x: ops.custom( + name="histogram", + values=[x], + out_types=[TensorType(dtype=DType.int64, shape=[256])], + )[0].tensor, + input_types=[ + TensorType(DType.uint8, shape=[n]), + ], + ) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession(devices=[device], custom_extensions=path) + + # Compile the graph. + model = session.load(graph) + + # Fill an input with random values. + x_values = np.random.randint(0, 256, size=n, dtype=np.uint8) + + # Create a driver tensor from this, and move it to the accelerator. + x = Tensor.from_numpy(x_values).to(device) + + # Perform the calculation on the target device. + model_result = model.execute(x)[0] + + # Copy values back to the CPU to be read. + assert isinstance(model_result, Tensor) + + print("Graph result:") + result = model_result.to_numpy() + print(result) + print() + + print("Expected result:") + expected = np.histogram(x_values, bins=256, range=(0, 256))[0] + print(expected) + + assert all(result == expected), "Result does not match expected" diff --git a/examples/custom_ops/kernels/__init__.mojo b/examples/custom_ops/kernels/__init__.mojo new file mode 100644 index 0000000000..23a1a193df --- /dev/null +++ b/examples/custom_ops/kernels/__init__.mojo @@ -0,0 +1,17 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .add_custom import * +from .mandelbrot import * +from .top_k import * +from .vector_addition import * diff --git a/examples/custom_ops/kernels/add_custom.mojo b/examples/custom_ops/kernels/add_custom.mojo new file mode 100644 index 0000000000..411ea7061e --- /dev/null +++ b/examples/custom_ops/kernels/add_custom.mojo @@ -0,0 +1,82 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import compiler +from max.tensor import ManagedTensorSlice, foreach +from runtime.asyncrt import DeviceContextPtr + +from utils.index import IndexList + + +@compiler.register("add_constant_custom", num_dps_outputs=1) +struct AddConstantCustom[value: Int]: + @staticmethod + fn execute[ + # e.g. "CUDA" or "CPU" + target: StringLiteral, + ]( + # as num_dps_outputs=1, the first argument is the "output" + out: ManagedTensorSlice, + # starting here are the list of inputs + x: ManagedTensorSlice[type = out.type, rank = out.rank], + # the context is needed for some GPU calls + ctx: DeviceContextPtr, + ): + @parameter + @always_inline + fn add_constant[ + width: Int + ](idx: IndexList[x.rank]) -> SIMD[x.type, width]: + return x.load[width](idx) + value + + foreach[add_constant, target=target](out, ctx) + + # You only need to implement this if you do not manually annotate + # output shapes in the graph. + @staticmethod + fn shape( + x: ManagedTensorSlice, + ) raises -> IndexList[x.rank]: + raise "NotImplemented" + + +@compiler.register("add_one_custom", num_dps_outputs=1) +struct AddOneCustom: + @staticmethod + fn execute[ + # The kind of device this will be run on: "cpu" or "gpu" + target: StringLiteral, + ]( + # as num_dps_outputs=1, the first argument is the "output" + out: ManagedTensorSlice, + # starting here are the list of inputs + x: ManagedTensorSlice[type = out.type, rank = out.rank], + # the context is needed for some GPU calls + ctx: DeviceContextPtr, + ): + @parameter + @always_inline + fn elementwise_add_one[ + width: Int + ](idx: IndexList[x.rank]) -> SIMD[x.type, width]: + return x.load[width](idx) + 1 + + foreach[elementwise_add_one, target=target](out, ctx) + + # You only need to implement this if you do not manually annotate + # output shapes in the graph. + @staticmethod + fn shape( + x: ManagedTensorSlice, + ) raises -> IndexList[x.rank]: + raise "NotImplemented" diff --git a/examples/custom_ops/kernels/fused_attention.mojo b/examples/custom_ops/kernels/fused_attention.mojo new file mode 100644 index 0000000000..28a53120b4 --- /dev/null +++ b/examples/custom_ops/kernels/fused_attention.mojo @@ -0,0 +1,360 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +""" +The code below computes the attention score for a tile of size BN x BD. +It follows the exact arithmetic as described in the FlashAttention-2 paper +(https://arxiv.org/pdf/2307.08691). The variable names in this program +reflect the variable names in the algorithms from the paper. + +Here, the following tensors are Q for the query, +K for the key, V for the value, and O for the output. + + Q K V + +----D----+ +----D----+ +--+--BD--+---+ + | | |.........| | |......| | + | | |.........| | |......| | + +---------+ |.........| | |......| | + |.........| |.........| | |......| | + BN........| N.........| N |......| | + |.........| |.........| | |......| | + +---------+ |.........| | |......| | + | | |.........| | |......| | + | | |.........| | |......| | + | | |.........| | |......| | + +---------+ +---------+ +--+------+---+ + +The main trick is in the softmax computation. +As the paper says, S and P are intermediate values. + +Let S = Q * K^T ∈ R^{N, D} + P = Softmax(S) ∈ R^{N, D} +The attention score is O = P * V ∈ R^{N, D}. + +One way to think about this is to consider what happens if we +split the dimensions N in K, and Q into two tiles: K_1 and K_2, V_1 and V_2. +Then we can incrementally compute the output as follows: + S_1 = Q * K_1, S_2 = Q * K_2 + O_i = O_{i-1} * renormalization_factor + softmax(S_i) * V_i + +This allows for the incremental computation of softmax(S_i) * V_i, +leading to the final output. +""" + + +from algorithm import parallelize_over_rows +from compiler import register +from utils.index import IndexList +from layout import Layout, LayoutTensor, RuntimeLayout, RuntimeTuple +from layout.tensor_core import TensorCore +from layout.math import exp, sum, max +from gpu.host import DeviceContext +from gpu.id import block_idx, thread_idx +from gpu.sync import barrier +from gpu.memory import AddressSpace +from utils import Index + +from tensor import ManagedTensorSlice + + +@register("fused_attention_custom", num_dps_outputs=1) +struct FusedAttention: + """Registers the `fused_attention_custom` op, allowing python to use it from the `max` + package. + """ + + @staticmethod + fn execute[ + dtype: DType, + rank: Int, + //, # Forces the previous two params to be inferred from the args + N: Int, # Input length + D: Int, # Head dimension + BN: Int, # Dimension of blocks to split Q into + BD: Int, # Dimension of blocks to split K, V into + target: StringLiteral, # "cpu" or "gpu" + ]( + output: ManagedTensorSlice[type=dtype, rank=rank], + key: ManagedTensorSlice[type=dtype, rank=rank], + query: ManagedTensorSlice[type=dtype, rank=rank], + value: ManagedTensorSlice[type=dtype, rank=rank], + ctx: DeviceContextPtr, + ) raises: + constrained[rank == 2, "rank must be 2"]() + + # Key tensor + K = key.to_layout_tensor() + # Query tensor + Q = query.to_layout_tensor() + # Value tensor + V = value.to_layout_tensor() + # Attention output tensor + O = output.to_layout_tensor() + + @parameter + if target == "cpu": + print("Running on CPU") + fused_attention_cpu[BN, BD](K, Q, V, O) + else: + dev_ctx = ctx.get_device_context() + print("Running on GPU") + fused_attention_gpu[BN, BD](dev_ctx, K, Q, V, O) + + +@always_inline +fn matmul_b_transpose( + lhs: LayoutTensor, + rhs: LayoutTensor, + out res: LayoutTensor[ + lhs.dtype, Layout.row_major(lhs.shape[0](), rhs.shape[0]()) + ], +): + res = __type_of(res).stack_allocation() + + @parameter + for m in range(lhs.shape[0]()): + + @parameter + for n in range(rhs.shape[0]()): + res[m, n] = 0.0 + + @parameter + for k in range(lhs.shape[1]()): + res[m, n] += rebind[res.element_type]( + lhs[m, k].cast[res.dtype]() + ) * rebind[res.element_type](rhs[n, k].cast[res.dtype]()) + + +""" +The bulk of the code below implements what the papers calls +an "online softmax", which is local to each block. +The algorithm is described as: + +$$$ +m_1 = rowmax(S_1) +l_1 = rowsum(e^(S_1-m_1)) +P_1 = diag(l_1)^-1 * e^(S_1-m_1) +O_1 = P_1*V_1 = diag(l_1)^-1 * e^(S_1-m_1) * V_1 +m_2 = max(m_1, rowmax(S_2)) = m +l_2 = e^(m_1-m_2) * l_1 _ rowsum(e^(S_2-m_2)) + = rowsum(e^(S_1-m)) + rowsum(e^(S_2-m)) = ls +P_2 = diag(l_2)^-1 * e^(S_2-m_2) +O_2 = diag(l_1/l_2)^-1 * O_1 + (P_2 * V_2) + = diag(l_2)^-1 * e^(S_2-m) * V +$$$ +""" + + +@always_inline +fn fused_attention_cpu[ + BN: Int, BD: Int +](Q: LayoutTensor, K: LayoutTensor, V: LayoutTensor, mut O: LayoutTensor): + alias N = K.shape[0]() + alias D = K.shape[1]() + + @parameter + for tile_n in range(N // BN): + Q_tile = Q.tile[BN, D](tile_n, 0) + + @parameter + for tile_d in range(D // BD): + m_1 = ( + LayoutTensor[Q_tile.dtype, Layout(BN, 1)] + .stack_allocation() + .fill(Scalar[Q_tile.dtype].MIN) + ) + + l_1 = ( + LayoutTensor[Q_tile.dtype, Layout(BN, 1)] + .stack_allocation() + .fill(0) + ) + + O_i = ( + LayoutTensor[Q_tile.dtype, Layout.row_major(BN, BD)] + .stack_allocation() + .fill(0) + ) + + @parameter + for tile_n_idx in range(N // BN): + K_tile = K.tile[BN, D](tile_n_idx, 0) + V_tile = V.tile[BN, BD](tile_n_idx, tile_d) + + S = matmul_b_transpose(Q_tile, K_tile) + m_2 = max(m_1, rebind[__type_of(m_1)](max[axis=1](S))) + l_2 = exp(m_1 - m_2) * l_1 + sum[axis=1](exp(S - m_2)) + + P = exp(S - m_2) / l_2 + O_i = O_i * (l_1 / l_2) * exp(m_1 - m_2) + matmul["cpu"]( + P, V_tile + ) + m_1 = m_2 + l_1 = rebind[__type_of(l_1)](l_2) + + O.tile[BN, BD](tile_n, tile_d).copy_from(O_i) + + +@always_inline +fn matmul[ + target: StringLiteral, + transpose_b: Bool = False, +]( + lhs: LayoutTensor, + rhs: LayoutTensor, + out res: LayoutTensor[ + lhs.dtype, + Layout.row_major(lhs.shape[0](), rhs.shape[0]()), + address_space = lhs.address_space, + element_layout = lhs.element_layout, + layout_bitwidth = lhs.layout_bitwidth, + ], +): + res = __type_of(res).stack_allocation() + + @parameter + if target == "cpu": + + @parameter + for m in range(lhs.shape[0]()): + + @parameter + for n in range(rhs.shape[1]()): + res[m, n] = 0.0 + + @parameter + for k in range(lhs.shape[1]()): + res[m, n] += rebind[res.element_type]( + lhs[m, k].cast[res.dtype]() + ) * rebind[res.element_type](rhs[k, n].cast[res.dtype]()) + else: + alias M = res.shape[0]() + alias N = res.shape[1]() + alias K = lhs.shape[1]() + + out_sram = LayoutTensor[ + res.dtype, + Layout.row_major(M, N), + address_space = AddressSpace.SHARED, + ].stack_allocation() + + alias BK = 8 + + constrained[K % 8 == 0, "K needs to be a multiple of 8"]() + + mma_b_t = TensorCore[ + lhs.dtype, res.dtype, Index(M, N, BK), transpose_b + ]() + + c_reg = mma_b_t.c_reg_tile_type.stack_allocation().fill(0) + + @parameter + for k_i in range(K // BK): + a_reg = mma_b_t.load_a(lhs.tile[M, BK](0, k_i)) + + b_reg = mma_b_t.load_b(rhs.tile[BK, N](k_i, 0)) + + @parameter + if transpose_b: + b_reg = rebind[__type_of(b_reg)]( + mma_b_t.load_b(rhs.tile[N, BK](0, k_i)) + ) + + d_reg = mma_b_t.mma_op(a_reg, b_reg, c_reg) + c_reg.copy_from(d_reg) + mma_b_t.store_d(out_sram, c_reg) + + barrier() + res.copy_from(out_sram) + + +fn fused_attention_kenel[ + q_dtype: DType, + q_layout: Layout, + k_dtype: DType, + k_layout: Layout, + v_dtype: DType, + v_layout: Layout, + o_dtype: DType, + o_layout: Layout, + BN: Int, + BD: Int, +]( + Q: LayoutTensor[q_dtype, q_layout], + K: LayoutTensor[k_dtype, k_layout], + V: LayoutTensor[v_dtype, v_layout], + O: LayoutTensor[o_dtype, o_layout], +): + alias N = Q.shape[0]() + alias D = Q.shape[1]() + + Q_tile = Q.tile[BN, D](block_idx.y, 0) + + m_1 = ( + LayoutTensor[q_dtype, Layout(BN, 1)] + .stack_allocation() + .fill(Scalar[q_dtype].MIN) + ) + l_1 = LayoutTensor[q_dtype, Layout(BN, 1)].stack_allocation().fill(0) + O_i = ( + LayoutTensor[q_dtype, Layout.row_major(BN, BD)] + .stack_allocation() + .fill(0) + ) + + alias BN_1 = 8 + + @parameter + for tile_n_idx in range(N // BN_1): + K_tile = K.tile[BN_1, D](tile_n_idx, 0) + V_tile = V.tile[BN_1, BD](tile_n_idx, block_idx.x) + S = matmul["gpu", transpose_b=True](Q_tile, K_tile) + m_2 = max(m_1, rebind[__type_of(m_1)](max[axis=1](S))) + l_2 = exp(m_1 - m_2) * l_1 + sum[axis=1](exp(S - m_2)) + P = exp(S - m_2) / l_2 + O_i = O_i * (l_1 / l_2) * exp(m_1 - m_2) + matmul["gpu"](P, V_tile) + m_1 = m_2 + l_1 = rebind[__type_of(l_1)](l_2) + O.tile[BN, BD](block_idx.y, block_idx.x).copy_from(O_i) + + +def fused_attention_gpu[ + BN: Int, + BD: Int, +]( + ctx: DeviceContext, + Q: LayoutTensor, + K: LayoutTensor, + V: LayoutTensor, + mut O: LayoutTensor, +): + alias kernel_func = fused_attention_kenel[ + Q.dtype, + Q.layout, + K.dtype, + K.layout, + V.dtype, + V.layout, + O.dtype, + O.layout, + BN, + BD, + ] + ctx.enqueue_function[kernel_func]( + Q, + K, + V, + O, + grid_dim=(Q.shape[1]() // BD, Q.shape[0]() // BN), + block_dim=(32), + ) diff --git a/examples/custom_ops/kernels/histogram.mojo b/examples/custom_ops/kernels/histogram.mojo new file mode 100644 index 0000000000..01e2237ed1 --- /dev/null +++ b/examples/custom_ops/kernels/histogram.mojo @@ -0,0 +1,83 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from math import ceildiv + +from gpu import block_dim, block_idx, thread_idx, global_idx +from gpu.host import DeviceContext +from runtime.asyncrt import DeviceContextPtr +from tensor import ManagedTensorSlice +from algorithm import vectorize, sync_parallelize +from algorithm.functional import _get_num_workers +from memory import memset +from sys import simdwidthof, sizeof +from os import Atomic + +from utils.index import IndexList +from gpu.host.info import Info, is_cpu, is_gpu + +from memory import UnsafePointer + +alias bin_width = Int(UInt8.MAX) + + +fn _histogram_cpu(out: ManagedTensorSlice, input: ManagedTensorSlice): + for i in range(input.dim_size(0)): + out[Int(input[i])] += 1 + + +fn _histogram_gpu( + output: ManagedTensorSlice, + input: ManagedTensorSlice, + ctx_ptr: DeviceContextPtr, +) raises: + alias block_dim = 1024 + + fn kernel( + output: UnsafePointer[Int64], input: UnsafePointer[UInt8], n: Int + ): + var tid = global_idx.x + + if tid >= n: + return + + _ = Atomic._fetch_add(output + Int(input[tid]), 1) + + var n = input.dim_size(0) + + var grid_dim = ceildiv(n, block_dim) + + var ctx = ctx_ptr.get_device_context() + + ctx.enqueue_function[kernel]( + output.unsafe_ptr(), + input.unsafe_ptr(), + n, + block_dim=block_dim, + grid_dim=grid_dim, + ) + + +@compiler.register("histogram", num_dps_outputs=1) +struct Histogram: + @staticmethod + fn execute[ + target: StringLiteral + ]( + out: ManagedTensorSlice[type = DType.int64, rank=1], + input: ManagedTensorSlice[type = DType.uint8, rank=1], + ctx: DeviceContextPtr, + ) raises: + _histogram_cpu(out, input) if is_cpu[target]() else _histogram_gpu( + out, input, ctx + ) diff --git a/examples/custom_ops/kernels/mandelbrot.mojo b/examples/custom_ops/kernels/mandelbrot.mojo new file mode 100644 index 0000000000..bf190e21c8 --- /dev/null +++ b/examples/custom_ops/kernels/mandelbrot.mojo @@ -0,0 +1,92 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from math import iota + +import compiler +from complex import ComplexSIMD +from max.tensor import ManagedTensorSlice, foreach +from runtime.asyncrt import DeviceContextPtr + +from utils.index import IndexList + + +@always_inline +fn mandelbrot_inner_simd[ + float_type: DType, int_type: DType, simd_width: Int +]( + c: ComplexSIMD[float_type, simd_width], max_iterations: SIMD[int_type, 1] +) -> SIMD[int_type, simd_width]: + """A vectorized implementation of the inner Mandelbrot computation.""" + var z = ComplexSIMD[float_type, simd_width](0, 0) + var iters = SIMD[int_type, simd_width](0) + + var in_set_mask: SIMD[DType.bool, simd_width] = True + for _ in range(max_iterations): + if not any(in_set_mask): + break + in_set_mask = z.squared_norm() <= 4 + iters = in_set_mask.select(iters + 1, iters) + z = z.squared_add(c) + + return iters + + +alias float_dtype = DType.float32 + + +@compiler.register("mandelbrot", num_dps_outputs=1) +struct Mandelbrot: + @staticmethod + fn execute[ + # The kind of device this will be run on: "cpu" or "gpu" + target: StringLiteral, + ]( + # as num_dps_outputs=1, the first argument is the "output" + out: ManagedTensorSlice, + # starting here are the list of inputs + min_x: Float32, + min_y: Float32, + scale_x: Float32, + scale_y: Float32, + max_iterations: Int32, + # the context is needed for some GPU calls + ctx: DeviceContextPtr, + ): + @parameter + @always_inline + fn elementwise_mandelbrot[ + width: Int + ](idx: IndexList[out.rank]) -> SIMD[out.type, width]: + var row = idx[0] + var col = idx[1] + var cx = min_x.cast[float_dtype]() + ( + col + iota[float_dtype, width]() + ) * scale_x.cast[float_dtype]() + var cy = min_y.cast[float_dtype]() + row * SIMD[float_dtype, width]( + scale_y.cast[float_dtype]() + ) + var c = ComplexSIMD[float_dtype, width](cx, cy) + return mandelbrot_inner_simd[cx.type, out.type, width]( + c, max_iterations.cast[out.type]() + ) + + foreach[elementwise_mandelbrot, target=target](out, ctx) + + # You only need to implement this if you do not manually annotate + # output shapes in the graph. + @staticmethod + fn shape( + x: ManagedTensorSlice, + ) raises -> IndexList[x.rank]: + raise "NotImplemented" diff --git a/examples/custom_ops/kernels/matrix_multiplication.mojo b/examples/custom_ops/kernels/matrix_multiplication.mojo new file mode 100644 index 0000000000..afc810b25a --- /dev/null +++ b/examples/custom_ops/kernels/matrix_multiplication.mojo @@ -0,0 +1,1007 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from gpu import WARP_SIZE, block_dim, block_idx, thread_idx +from gpu.host import DeviceBuffer, DeviceContext +from gpu.memory import async_copy_wait_all +from layout.layout_tensor import ( + Layout, + LayoutTensor, + copy_dram_to_sram, + copy_dram_to_sram_async, +) +from layout.math import outer_product_acc +from layout.tensor_builder import LayoutTensorBuild as tb +from layout.tensor_core import TensorCore +from math import ceildiv +from memory import UnsafePointer +from runtime.asyncrt import DeviceContextPtr +from sys.info import simdwidthof +from tensor import ManagedTensorSlice, foreach +from utils.index import Index + +# ===-----------------------------------------------------------------------===# +# Naive matrix multiplication (CPU) +# ===-----------------------------------------------------------------------===# + + +fn naive_matrix_multiplication_cpu( + out: ManagedTensorSlice, + a: ManagedTensorSlice[type = out.type, rank = out.rank], + b: ManagedTensorSlice[type = out.type, rank = out.rank], +): + """A naive matrix multiplication used as a fallback on CPU hardware.""" + var M = a.shape()[0] + var N = b.shape()[1] + var K = b.shape()[0] + + for row in range(M): + for col in range(N): + for k in range(K): + out[row, col] = out[row, col] + a[row, k] * b[k, col] + + +# ===-----------------------------------------------------------------------===# +# Naive matrix multiplication (GPU) +# ===-----------------------------------------------------------------------===# + + +fn naive_matrix_multiplication[ + dtype: DType, + a_layout: Layout, + b_layout: Layout, + c_layout: Layout, + BM: Int, + BN: Int, +]( + a: LayoutTensor[dtype, a_layout], + b: LayoutTensor[dtype, b_layout], + c: LayoutTensor[dtype, c_layout], +): + """ + Tiled GEMM kernel that performs matrix multiplication C = A * B. + + Parameters: + dtype: The data type of the input and output tensors. + a_layout: The layout of the input tensor A. + b_layout: The layout of the input tensor B. + c_layout: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + + Args: + a: The input tensor A. + b: The input tensor B. + c: The output tensor C. + + This kernel uses a simple nested loop structure to compute the matrix + multiplication. Each thread computes a single element of the output matrix + C by accumulating the dot product of the corresponding row of A and column + of B. + + The kernel assumes that the input matrices A and B are compatible for + matrix multiplication, i.e., the number of columns in A equals the number + of rows in B. + """ + # Calculate the column and row indices for each thread. + var col = thread_idx.y + var row = thread_idx.x + var bidx = block_idx.x + var bidy = block_idx.y + + # Get the tile of the output matrix C that this thread is + # responsible for computing. + var dst = c.tile[BM, BN](bidy, bidx) + + # Initialize a register to accumulate the result for this thread. + var dst_reg: c.element_type = 0 + + # Iterate over the K dimension to compute the dot product. + for k in range(b.dim(0)): + # Get the corresponding tiles from matrices A and B. + var a_tile = a.tile[BM, 1](bidy, k) + var b_tile = b.tile[1, BN](k, bidx) + + # Multiply the elements and accumulate the result. + dst_reg += a_tile[row, 0] * b_tile[0, col] + + # Write the final accumulated result to the output matrix. + dst[row, col] += dst_reg + + +# ===-----------------------------------------------------------------------===# +# Matrix multiplication with tiling +# ===-----------------------------------------------------------------------===# + + +fn coalescing_matrix_multiplication[ + dtype: DType, + a_layout: Layout, + b_layout: Layout, + c_layout: Layout, + BM: Int, + BN: Int, +]( + a: LayoutTensor[dtype, a_layout], + b: LayoutTensor[dtype, b_layout], + c: LayoutTensor[dtype, c_layout], +): + """ + GEMM kernel that performs matrix multiplication C = A * B with + memory coalescing optimizations. + + Parameters: + dtype: The data type of the input and output tensors. + a_layout: The layout of the input tensor A. + b_layout: The layout of the input tensor B. + c_layout: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + + Args: + a: The input tensor A. + b: The input tensor B. + c: The output tensor C. + + This kernel optimizes memory access patterns by ensuring that + threads within a warp access contiguous memory locations. It + tiles the input matrices A and B and computes the matrix + multiplication using register tiling. + + Each thread computes a single element of the output matrix C by + accumulating the partial results in a register. The final result + is then stored back to the output matrix. + """ + + var col = thread_idx.x + var row = thread_idx.y + var bidx = block_idx.x + var bidy = block_idx.y + + # Get the tile of the output matrix C + var dst = c.tile[BM, BN](bidy, bidx) + + # Initialize the register to accumulate the result + var dst_reg: c.element_type = 0 + + # Iterate over the K dimension + for k in range(b.dim(0)): + # Get the tiles of input matrices A and B + var a_tile = a.tile[BM, 1](bidy, k) + var b_tile = b.tile[1, BN](k, bidx) + + # Compute the partial result and accumulate it in the register + dst_reg += a_tile[row, 0] * b_tile[0, col] + + # Store the final result back to the output matrix + dst[row, col] += dst_reg + + +# ===-----------------------------------------------------------------------===# +# Matrix multiplication with shared memory tiling +# ===-----------------------------------------------------------------------===# + + +fn tiled_matrix_multiplication[ + dtype: DType, + a_layout: Layout, + b_layout: Layout, + c_layout: Layout, + BM: Int, + BN: Int, + BK: Int, + NUM_THREADS: Int, +]( + a: LayoutTensor[dtype, a_layout], + b: LayoutTensor[dtype, b_layout], + c: LayoutTensor[dtype, c_layout], +): + """ + Tiled GEMM kernel that performs matrix multiplication C = A * B using + shared memory to improve performance. + + Parameters: + dtype: The data type of the input and output tensors. + a_layout: The layout of the input tensor A. + b_layout: The layout of the input tensor B. + c_layout: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + BK: The block size in the K dimension. + NUM_THREADS: The total number of threads per block. + + Args: + a: The input tensor A. + b: The input tensor B. + c: The output tensor C. + + This kernel uses a tiling strategy to compute the matrix multiplication. + Each thread block computes a BM x BN tile of the output matrix C. The + input matrices A and B are loaded into shared memory in tiles of size + BM x BK and BK x BN, respectively. + + The kernel assumes that the input matrices A and B are compatible for + matrix multiplication, i.e., the number of columns in A equals the + number of rows in B. + """ + # Calculate the column and row indices for each thread + var col = thread_idx.x % BN + var row = thread_idx.x // BN + + # Get the tile of the output matrix C that this thread block is responsible for + var dst = c.tile[BM, BN](block_idx.y, block_idx.x) + + # Allocate shared memory for tiles of input matrices A and B + var a_smem = tb[dtype]().row_major[BM, BK]().shared().alloc() + var b_smem = tb[dtype]().row_major[BK, BN]().shared().alloc() + + # Initialize the register to accumulate the result + var dst_reg: c.element_type = 0 + + # Iterate over tiles of input matrices A and B + for block in range(b.dim(0) // BK): + # Define the layout for loading tiles of A and B into shared memory + alias load_a_layout = Layout.row_major(NUM_THREADS // BK, BK) + alias load_b_layout = Layout.row_major(BK, NUM_THREADS // BK) + + # Get the tiles of A and B for the current iteration + var a_tile = a.tile[BM, BK](block_idx.y, block) + var b_tile = b.tile[BK, BN](block, block_idx.x) + + # Asynchronously copy tiles of A and B from global memory to shared memory + copy_dram_to_sram_async[thread_layout=load_a_layout](a_smem, a_tile) + copy_dram_to_sram_async[thread_layout=load_b_layout](b_smem, b_tile) + + # Wait for all asynchronous copies to complete + async_copy_wait_all() + + # Synchronize threads to ensure shared memory is populated + barrier() + + # Perform matrix multiplication on the tiles in shared memory + @parameter + for k in range(BK): + dst_reg += a_smem[row, k] * b_smem[k, col] + + # Synchronize threads before loading the next tiles + barrier() + + # Write the result to the output matrix + dst[row, col] += dst_reg + + +# ===-----------------------------------------------------------------------===# +# Matrix multiplication with shared memory tiling and register tiling +# ===-----------------------------------------------------------------------===# + + +fn tiled_register_matrix_multiplication[ + dtype: DType, + a_layout: Layout, + b_layout: Layout, + c_layout: Layout, + BM: Int, + BN: Int, + BK: Int, + TM: Int, + NUM_THREADS: Int, +]( + a: LayoutTensor[dtype, a_layout], + b: LayoutTensor[dtype, b_layout], + c: LayoutTensor[dtype, c_layout], +): + """ + Tiled GEMM kernel that performs matrix multiplication C = A * B using + shared memory. + + Parameters: + dtype: The data type of the input and output tensors. + a_layout: The layout of the input tensor A. + b_layout: The layout of the input tensor B. + c_layout: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + BK: The block size in the K dimension. + TM: The tile size in the M dimension. + NUM_THREADS: The number of threads per block. + + Args: + a: The input tensor A. + b: The input tensor B. + c: The output tensor C. + + This kernel uses a tiled approach to compute the matrix multiplication. It + loads tiles of matrices A and B into shared memory, and then each thread + computes a partial result using the tiles in shared memory. The partial + results are accumulated in registers and finally stored back to the output + matrix C. + + The kernel assumes that the input matrices A and B are compatible for + matrix multiplication, i.e., the number of columns in A equals the number + of rows in B. + """ + # Calculate the column and row indices for each thread. + var col = thread_idx.x % BN + var row = thread_idx.x // BN + var bidx = block_idx.x + var bidy = block_idx.y + + # Get the tile of the output matrix C that this thread is + # responsible for computing. + var dst = c.tile[BM, BN](bidy, bidx).tile[TM, 1](row, col) + + # Allocate shared memory for tiles of A and B. + var a_smem = tb[dtype]().row_major[BM, BK]().shared().alloc() + var b_smem = tb[dtype]().row_major[BK, BN]().shared().alloc() + + # Allocate a register tile to store the partial results. + var dst_reg = tb[dtype]().layout[TM]().local().alloc() + dst_reg.copy_from(dst) + + # Iterate over the tiles of A and B in the K dimension. + for block in range(b.dim(0) // BK): + # Define the layout for loading tiles of A and B into shared + # memory. + alias load_a_layout = Layout.row_major(NUM_THREADS // BK, BK) + alias load_b_layout = Layout.row_major(BK, NUM_THREADS // BK) + + # Get the tiles of A and B for the current block. + var a_tile = a.tile[BM, BK](block_idx.y, block) + var b_tile = b.tile[BK, BN](block, block_idx.x) + + # Load the tiles of A and B into shared memory asynchronously. + copy_dram_to_sram_async[thread_layout=load_a_layout](a_smem, a_tile) + copy_dram_to_sram_async[thread_layout=load_b_layout](b_smem, b_tile) + + # Wait for all asynchronous copies to complete. + async_copy_wait_all() + barrier() + + # Iterate over the elements in the K dimension within the tiles. + @parameter + for k in range(BK): + # Get the corresponding tiles from shared memory. + var a_tile = a_smem.tile[TM, 1](row, k) + var b_tile = b_smem.tile[1, BN](k, 0) + var b_val = b_tile[0, col] + + # Multiply the elements and accumulate the partial results. + @parameter + for t in range(TM): + dst_reg[t] += a_tile[t, 0] * b_val + + # Synchronize all threads before loading the next tiles. + barrier() + + # Write the final accumulated results to the output matrix. + dst.copy_from(dst_reg) + + +# ===-----------------------------------------------------------------------===# +# Matrix multiplication with block tiling +# ===-----------------------------------------------------------------------===# + + +fn block_tiled_matrix_multiplication[ + dtype: DType, + a_layout: Layout, + b_layout: Layout, + c_layout: Layout, + BM: Int, + BN: Int, + BK: Int, + TM: Int, + TN: Int, + NUM_THREADS: Int, +]( + a: LayoutTensor[dtype, a_layout], + b: LayoutTensor[dtype, b_layout], + c: LayoutTensor[dtype, c_layout], +): + """ + Tiled GEMM kernel that performs matrix multiplication C = A * B. + + Parameters: + dtype: The data type of the input and output tensors. + a_layout: The layout of the input tensor A. + b_layout: The layout of the input tensor B. + c_layout: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + BK: The block size in the K dimension. + TM: The tile size in the M dimension. + TN: The tile size in the N dimension. + NUM_THREADS: The total number of threads per block. + + Args: + a: The input tensor A. + b: The input tensor B. + c: The output tensor C. + + This kernel uses a 2D block tiling strategy to compute the matrix + multiplication. Each thread block computes a BM x BN tile of the output + matrix C. Within each thread block, threads are further divided into + TM x TN tiles to enable thread-level parallelism. + + The kernel loads tiles of A and B into shared memory to reduce global + memory accesses. It then performs the matrix multiplication using + register-level tiling and accumulates the results in registers. + + The kernel assumes that the input matrices A and B are compatible for + matrix multiplication, i.e., the number of columns in A equals the number + of rows in B. + """ + var partition_col = thread_idx.x % (BN // TN) + var partition_row = thread_idx.x // (BN // TN) + var bidx = block_idx.x + var bidy = block_idx.y + + var dst = c.tile[BM, BN](bidy, bidx).tile[TM, TN]( + partition_row, partition_col + ) + + var a_smem = tb[dtype]().row_major[BM, BK]().shared().alloc() + var b_smem = tb[dtype]().row_major[BK, BN]().shared().alloc() + + var dst_reg = tb[dtype]().row_major[TM, TN]().local().alloc() + dst_reg.copy_from(dst) + var a_reg = tb[dtype]().layout[TM]().local().alloc() + var b_reg = tb[dtype]().layout[TN]().local().alloc() + + var ntiles = b.dim(0) // BK + + for block in range(ntiles): + alias load_a_layout = Layout.row_major(NUM_THREADS // BK, BK) + alias load_b_layout = Layout.row_major(BK, NUM_THREADS // BK) + var a_tile = a.tile[BM, BK](block_idx.y, block) + var b_tile = b.tile[BK, BN](block, block_idx.x) + copy_dram_to_sram_async[thread_layout=load_a_layout](a_smem, a_tile) + copy_dram_to_sram_async[thread_layout=load_b_layout](b_smem, b_tile) + + async_copy_wait_all() + barrier() + + @parameter + for k in range(BK): + var a_tile = a_smem.tile[TM, 1](partition_row, k) + var b_tile = b_smem.tile[1, TN](k, partition_col) + a_reg.copy_from(a_tile) + b_reg.copy_from(b_tile) + outer_product_acc(dst_reg, a_reg, b_reg) + barrier() + + dst.copy_from(dst_reg) + + +# ===-----------------------------------------------------------------------===# +# Matrix multiplication with vectorized memory access +# ===-----------------------------------------------------------------------===# + + +fn block_tiled_vectorized_matrix_multiplication[ + dtype: DType, + a_layout: Layout, + b_layout: Layout, + c_layout: Layout, + BM: Int, + BN: Int, + BK: Int, + TM: Int, + TN: Int, + NUM_THREADS: Int, +]( + a: LayoutTensor[dtype, a_layout], + b: LayoutTensor[dtype, b_layout], + c: LayoutTensor[dtype, c_layout], +): + """ + Tiled GEMM kernel that performs matrix multiplication C = A * B with + vectorized memory access. + + Parameters: + dtype: The data type of the input and output tensors. + a_layout: The layout of the input tensor A. + b_layout: The layout of the input tensor B. + c_layout: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + BK: The block size in the K dimension. + TM: The tile size in the M dimension. + TN: The tile size in the N dimension. + NUM_THREADS: The total number of threads per block. + + Args: + a: The input tensor A. + b: The input tensor B. + c: The output tensor C. + + This kernel uses a 2D block tiling strategy to compute the matrix + multiplication. Each thread block computes a BM x BN tile of the output + matrix C. Within each thread block, threads are further divided into TM x + TN tiles to enable thread-level parallelism. + + The kernel loads tiles of A and B into shared memory using vectorized + memory access to improve memory bandwidth utilization. It then performs the + matrix multiplication using register-level tiling and accumulates the + results in registers. + + The kernel assumes that the input matrices A and B are compatible for + matrix multiplication, i.e., the number of columns in A equals the number + of rows in B. + """ + + alias simd_width = simdwidthof[dtype]() + var partition_col = thread_idx.x % (BN // TN) + var partition_row = thread_idx.x // (BN // TN) + var bidx = block_idx.x + var bidy = block_idx.y + + # Get the tile of the output matrix C that this thread is responsible + # for computing. + var dst = c.tile[BM, BN](bidy, bidx).tile[TM, TN]( + partition_row, partition_col + ) + var dst_vec = dst.vectorize[1, simd_width]() + + # Allocate shared memory for tiles of A and B. + # Use column-major layout for A to get the transpose. + var a_smem = tb[dtype]().col_major[BM, BK]().shared().alloc() + var b_smem = tb[dtype]().row_major[BK, BN]().shared().alloc() + + # Allocate register tiles to store the partial results and operands. + var dst_reg = tb[dtype]().row_major[TM, TN]().local().alloc() + var dst_reg_vec = dst_reg.vectorize[1, simd_width]() + dst_reg_vec.copy_from(dst_vec) + + var a_reg = tb[dtype]().layout[TM]().local().alloc() + var b_reg = tb[dtype]().layout[TN]().local().alloc() + + var ntiles = b.dim(0) // BK + + # Iterate over the tiles of A and B in the K dimension. + for block in range(ntiles): + alias load_a_layout = Layout.row_major(NUM_THREADS // BK, BK) + alias load_b_layout = Layout.row_major(BK, NUM_THREADS // BK) + var a_tile = a.tile[BM, BK](block_idx.y, block) + var b_tile = b.tile[BK, BN](block, block_idx.x) + + # Load the tiles of A and B into shared memory using vectorized + # memory access. + copy_dram_to_sram_async[thread_layout=load_a_layout]( + a_smem.vectorize[simd_width, 1](), a_tile.vectorize[simd_width, 1]() + ) + copy_dram_to_sram_async[thread_layout=load_b_layout]( + b_smem.vectorize[1, simd_width](), b_tile.vectorize[1, simd_width]() + ) + + async_copy_wait_all() + barrier() + + # Iterate over the elements in the K dimension within the tiles. + @parameter + for k in range(BK): + # Load the corresponding tiles from shared memory into registers. + var a_tile = a_smem.tile[TM, 1](partition_row, k) + var b_tile = b_smem.tile[1, TN](k, partition_col) + a_reg.copy_from(a_tile) + b_reg.copy_from(b_tile) + + # Perform outer product and accumulate the partial results. + outer_product_acc(dst_reg, a_reg, b_reg) + + barrier() + + # Write the final accumulated results to the output matrix. + dst_vec.copy_from(dst_reg_vec) + + +# ===-----------------------------------------------------------------------===# +# Matrix multiplication using Tensor Cores +# ===-----------------------------------------------------------------------===# + + +fn tensor_core_matrix_multiplication[ + dtype: DType, + layout_a: Layout, + layout_b: Layout, + layout_c: Layout, + BM: Int, + BN: Int, + BK: Int, + WM: Int, + WN: Int, + MMA_M: Int, + MMA_N: Int, + MMA_K: Int, +]( + A: LayoutTensor[dtype, layout_a], + B: LayoutTensor[dtype, layout_b], + C: LayoutTensor[dtype, layout_c], +): + """ + Tiled GEMM kernel that performs matrix multiplication C = A * B using + tensor cores. + + Parameters: + dtype: The data type of the input and output tensors. + layout_a: The layout of the input tensor A. + layout_b: The layout of the input tensor B. + layout_c: The layout of the output tensor C. + BM: The block size in the M dimension. + BN: The block size in the N dimension. + BK: The block size in the K dimension. + WM: The warp tile size in the M dimension. + WN: The warp tile size in the N dimension. + MMA_M: Tensor core instruction shape in M dimension. + MMA_N: Tensor core instruction shape in N dimension. + MMA_K: Tensor core instruction shape in K dimension. + + Args: + A: The input tensor A. + B: The input tensor B. + C: The output tensor C. + + This kernel uses a tiled approach with tensor cores to compute the matrix + multiplication. It loads tiles of matrices A and B into shared memory, and + then each warp computes a partial result using tensor cores. The partial + results are accumulated in registers and finally stored back to the output + matrix C. + + The kernel assumes that the input matrices A and B are compatible for + matrix multiplication, i.e., the number of columns in A equals the number + of rows in B. + """ + alias M = C.shape[0]() # Number of rows in matrix C + alias N = C.shape[1]() # Number of columns in matrix C + alias K = A.shape[1]() # Number of columns in matrix A + + var warp_id = thread_idx.x // WARP_SIZE # Warp ID within the block + + # Calculate warp tile coordinates within the block + warp_y = warp_id // (BN // WN) + warp_x = warp_id % (BN // WN) + + # Get the warp tile of the output matrix C + C_warp_tile = C.tile[BM, BN](block_idx.y, block_idx.x).tile[WM, WN]( + warp_y, warp_x + ) + + # Ensure warp tile dimensions are multiples of instruction shape + constrained[ + WM % MMA_M == 0 and WN % MMA_N == 0 and K % MMA_K == 0, + "Warp tile should be an integer multiple of instruction shape", + ]() + + # Create tensor core operation object + mma_op = TensorCore[A.dtype, C.dtype, Index(MMA_M, MMA_N, MMA_K)]() + + # Allocate shared memory for tiles of A and B + A_sram_tile = tb[A.dtype]().row_major[BM, BK]().shared().alloc() + B_sram_tile = tb[B.dtype]().row_major[BK, BN]().shared().alloc() + + # Allocate register tile for accumulating partial results + c_reg = ( + tb[C.dtype]() + .row_major[WM // MMA_M, (WN * 4) // MMA_N]() + .local() + .alloc() + .fill(0) + ) + + # Iterate over tiles of A and B in the K dimension + for k_i in range(K // BK): + barrier() # Synchronize before loading new tiles + + # Get the tiles of A and B for the current iteration + A_dram_tile = A.tile[BM, BK](block_idx.y, k_i) + B_dram_tile = B.tile[BK, BN](k_i, block_idx.x) + + # Load tiles of A and B into shared memory asynchronously + copy_dram_to_sram_async[thread_layout = Layout.row_major(4, 8)]( + A_sram_tile.vectorize[1, 4](), A_dram_tile.vectorize[1, 4]() + ) + copy_dram_to_sram_async[thread_layout = Layout.row_major(4, 8)]( + B_sram_tile.vectorize[1, 4](), B_dram_tile.vectorize[1, 4]() + ) + + async_copy_wait_all() # Wait for async copies to complete + barrier() # Synchronize after loading tiles + + # Get the warp tiles of A and B from shared memory + A_warp_tile = A_sram_tile.tile[WM, BK](warp_y, 0) + B_warp_tile = B_sram_tile.tile[BK, WN](0, warp_x) + + # Iterate over the elements in the K dimension within the tiles + @parameter + for mma_k in range(BK // MMA_K): + + @parameter + for mma_m in range(WM // MMA_M): + + @parameter + for mma_n in range(WN // MMA_N): + # Get the register tile for the current MMA operation + c_reg_m_n = c_reg.tile[1, 4](mma_m, mma_n) + + # Get the MMA tiles of A and B + A_mma_tile = A_warp_tile.tile[MMA_M, MMA_K](mma_m, mma_k) + B_mma_tile = B_warp_tile.tile[MMA_K, MMA_N](mma_k, mma_n) + + # Load fragments of A and B into registers + a_reg = mma_op.load_a(A_mma_tile) + b_reg = mma_op.load_b(B_mma_tile) + + # Perform MMA operation and accumulate the result + var d_reg_m_n = mma_op.mma_op( + a_reg, + b_reg, + c_reg_m_n, + ) + + # Store the accumulated result back to the register tile + c_reg_m_n.copy_from(d_reg_m_n) + + # Write the final accumulated results to the output matrix + @parameter + for mma_m in range(WM // MMA_M): + + @parameter + for mma_n in range(WN // MMA_N): + var C_mma_tile = C_warp_tile.tile[MMA_M, MMA_N](mma_m, mma_n) + var c_reg_m_n = c_reg.tile[1, 4](mma_m, mma_n) + mma_op.store_d(C_mma_tile, c_reg_m_n) + + +# ===-----------------------------------------------------------------------===# +# The matrix multiplication graph operation +# ===-----------------------------------------------------------------------===# + + +@compiler.register("matrix_multiplication", num_dps_outputs=1) +struct MatrixMultiplication[algorithm: StringLiteral]: + """ + The central custom operation that dispatches to multiple different + matrix multiplication implementations, depending on target hardware and + selected algorithm. + """ + + @staticmethod + fn execute[ + # The kind of device this will be run on: "cpu" or "gpu" + target: StringLiteral, + ]( + # as num_dps_outputs=1, the first argument is the "output" + out: ManagedTensorSlice[rank=2], + # starting here are the list of inputs + a: ManagedTensorSlice[type = out.type, rank = out.rank], + b: ManagedTensorSlice[type = out.type, rank = out.rank], + # the context is needed for some GPU calls + ctx: DeviceContextPtr, + ) raises: + # At graph compilation time, we will know what device we are compiling + # this operation for, so we can specialize it for the target hardware. + @parameter + if target == "gpu": + a_layout = a.to_layout_tensor() + b_layout = b.to_layout_tensor() + out_layout = out.to_layout_tensor() + + M = a_layout.shape[0]() + N = b_layout.shape[1]() + + gpu_ctx = ctx.get_device_context() + + # Zero out the memory in the outbound tensor. + gpu_ctx.memset( + DeviceBuffer[out.type]( + gpu_ctx, + rebind[UnsafePointer[Scalar[out.type]]](out_layout.ptr), + M * N, + owning=False, + ), + 0, + ) + + # We support several compile-time variants for the matrix + # multiplication calculation: + # - "naive": A naive matrix multiplication using LayoutTensors. + # - "coalescing": Matrix multiplication with memory coalescing + # optimizations. + # - "tiled": Matrix multiplication using a tiling strategy. + # - "tiled_register": Matrix multiplication using shared memory + # and register tiling . + # - "block_tiled": Matrix multiplication using a 2D block tiling + # strategy. + # - "block_tiled_vectorized": Matrix multiplication using a + # further-optimized 2D block tiling strategy. + # - "tensor_core": Matrix multiplication using Tensor Cores. + # In each case, the specific matrix multiplication function is + # compiled and enqueued to run on the GPU. + @parameter + if algorithm == "naive": + alias BM = 32 + alias BN = 32 + gpu_ctx.enqueue_function[ + naive_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(BN, BM), + ) + elif algorithm == "coalescing": + alias BM = 32 + alias BN = 32 + gpu_ctx.enqueue_function[ + coalescing_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(BN, BM), + ) + elif algorithm == "tiled": + alias BM = 32 + alias BN = 32 + alias BK = 32 + alias NUM_THREADS = BM * BN + gpu_ctx.enqueue_function[ + tiled_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + BK, + NUM_THREADS, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(BM * BN), + ) + elif algorithm == "tiled_register": + alias BM = 64 + alias BN = 64 + alias BK = 8 + alias TM = 8 + alias NUM_THREADS = (BM * BN) // TM + gpu_ctx.enqueue_function[ + tiled_register_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + BK, + TM, + NUM_THREADS, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(NUM_THREADS), + ) + elif algorithm == "block_tiled": + alias BM = 128 + alias BN = 128 + alias BK = 8 + alias TM = 8 + alias TN = 8 + alias NUM_THREADS = (BM * BN) // (TM * TN) + gpu_ctx.enqueue_function[ + block_tiled_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + BK, + TM, + TN, + NUM_THREADS, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(NUM_THREADS), + ) + elif algorithm == "block_tiled_vectorized": + alias BM = 128 + alias BN = 128 + alias BK = 8 + alias TM = 8 + alias TN = 8 + alias NUM_THREADS = (BM * BN) // (TM * TN) + gpu_ctx.enqueue_function[ + block_tiled_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + BK, + TM, + TN, + NUM_THREADS, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(NUM_THREADS), + ) + elif algorithm == "tensor_core": + alias BM = 64 + alias BN = 64 + alias BK = 32 + alias WM = 32 + alias WN = 32 + alias MMA_M = 16 + alias MMA_N = 8 + alias MMA_K = 8 + alias NUM_WARPS = (BM // WM) * (BN // WN) + gpu_ctx.enqueue_function[ + tensor_core_matrix_multiplication[ + out.type, + a_layout.layout, + b_layout.layout, + out_layout.layout, + BM, + BN, + BK, + WM, + WN, + MMA_M, + MMA_N, + MMA_K, + ] + ]( + a_layout, + b_layout, + out_layout, + grid_dim=(ceildiv(N, BN), ceildiv(M, BM)), + block_dim=(NUM_WARPS * WARP_SIZE), + ) + else: + raise Error("No known matmul algorithm:", algorithm) + + else: + naive_matrix_multiplication_cpu(out, a, b) diff --git a/examples/custom_ops/kernels/top_k.mojo b/examples/custom_ops/kernels/top_k.mojo new file mode 100644 index 0000000000..7a03e23d18 --- /dev/null +++ b/examples/custom_ops/kernels/top_k.mojo @@ -0,0 +1,229 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from math import iota +from sys import alignof, sizeof, num_physical_cores + +from algorithm import parallelize_over_rows +from bit import log2_floor +from compiler import register +from gpu import WARP_SIZE, barrier +import gpu.warp as warp +from gpu.memory import AddressSpace, external_memory +from max.tensor import ManagedTensorSlice +from memory import Span +from benchmark import Bench, Bencher, BenchId, BenchMetric, ThroughputMeasure + +from utils.index import IndexList +from utils.numerics import min_or_neg_inf + + +@value +@register_passable("trivial") +struct TopKElement[T: DType]: + """Stores the value with it's index.""" + + var idx: Int32 + var val: Scalar[T] + + fn __gt__(self, rhs: Self) -> Bool: + return self.val > rhs.val + + +@register("top_k_custom", num_dps_outputs=2) +struct TopK: + """Registers the `top_k_custom` op, allowing python to use it from the `max` + package. This is a simplified version without bottom_k and sorting options, + or fused sampling. The purpose is to demonstrate concisely how you can + implement your own custom ops in Mojo that can be called from Python. MAX + has the "mo.top_k" op which is feature complete. + """ + + @staticmethod + fn execute[ + type: DType, + rank: Int, + //, # Forces the previous two params to be inferred from the args + K: Int, + target: StringLiteral, + ]( + out_vals: ManagedTensorSlice[type=type, rank=rank], + out_idxs: ManagedTensorSlice[type = DType.int32, rank=rank], + in_vals: ManagedTensorSlice[type=type, rank=rank], + ctx: DeviceContextPtr, + ) raises: + constrained[rank == 2, "rank must be 2"]() + var shape = in_vals.shape() + var batch_size = shape[0] + + var dev_ctx = ctx.get_device_context() + print("Executing on device:", dev_ctx.name()) + + @parameter + fn top_k_gpu[ + K: Int, + ]( + out_vals: __type_of(out_vals), + out_idxs: __type_of(out_idxs), + in_vals: __type_of(in_vals), + ): + var bid = block_idx.x + var tid = thread_idx.x + + # Get a pointer to shared memory for the indices and values + var top_k_sram = external_memory[ + TopKElement[type], + address_space = AddressSpace.SHARED, + alignment = alignof[TopKElement[type]](), + ]() + + # Threads put their corresponding index and value into shared memory + top_k_sram[tid] = TopKElement(tid, in_vals[bid, tid]) + # Finish packing the values across threads in this block + barrier() + + @parameter + for i in range(K): + var reduced = top_k_sram[tid] + alias limit = log2_floor(WARP_SIZE) + + # TODO(KERN-1544): `gpu.shuffle.warp_max` support index/value + @parameter + for j in reversed(range(limit)): + alias offset = 1 << j + # Parallel reduction using warp shuffle. Each thread gets a + # value from a thread 'offset' positions higher, keeping the + # larger value. + var shuffled = TopKElement( + warp.shuffle_down(reduced.idx, offset), + warp.shuffle_down(reduced.val, offset), + ) + reduced = max(reduced, shuffled) + + # Wait for all threads to finish reducing their values + barrier() + + # Thread 0 now has the reduced max value for this index + if tid == 0: + # Store the reduced top_k index and value in global memory + out_vals[bid, i] = reduced.val + out_idxs[bid, i] = reduced.idx + + # Remove found maximum from consideration in the next iter + var index = reduced.idx % block_dim.x + top_k_sram[index].val = min_or_neg_inf[type]() + + @parameter + fn top_k_cpu(start_idx: Int, end_idx: Int): + for row_idx in range(start_idx, end_idx): + var offset = (row_idx * K) + iota(out_idxs.unsafe_ptr() + offset, K) + + @parameter + fn val_greater_than(lhs: Int32, rhs: Int32) -> Bool: + return ( + in_vals[row_idx, Int(lhs)] > in_vals[row_idx, Int(rhs)] + ) + + sort[val_greater_than](Span(out_idxs.unsafe_ptr() + offset, K)) + + for i in range(K): + var sorted_idx = Int(out_idxs[row_idx, i]) + out_vals[row_idx, i] = in_vals[row_idx, sorted_idx] + + if batch_size <= 10: + + @parameter + if target == "gpu": + # This is a simplified version that only works for K being under + # the warp size. The MAX "mo.top_k" op supports any K and does + # another reduction after each warp has reduced its values. + if K >= WARP_SIZE: + raise Error( + "[top_k_custom] K=", + K, + " but must be less than the WARP_SIZE=", + WARP_SIZE, + ) + + if K < WARP_SIZE: + dev_ctx.enqueue_function[top_k_gpu[K]]( + out_vals, + out_idxs, + in_vals, + grid_dim=batch_size, # One block per batch + block_dim=K, # One thread per K + shared_mem_bytes=K * sizeof[TopKElement[type]](), + ) + else: + # Set grain size to 1 to put each batch in a separate task + parallelize_over_rows[top_k_cpu](shape, 1, grain_size=1) + + # Everything below is for benchmarking when running a stress test + else: + var bench = Bench() + + @parameter + @always_inline + fn bench_gpu(mut b: Bencher, shape: IndexList[rank]) raises: + @parameter + @always_inline + fn kernel_launch(dev_ctx: DeviceContext) raises: + dev_ctx.enqueue_function[top_k_gpu[K]]( + out_vals, + out_idxs, + in_vals, + grid_dim=batch_size, # One block per batch + block_dim=K, # One thread per K + shared_mem_bytes=K * sizeof[TopKElement[type]](), + ) + + b.iter_custom[kernel_launch](ctx.get_device_context()) + + @parameter + @always_inline + fn bench_cpu(mut b: Bencher) raises: + var grain = 1 + # Split job up evenly across physical cores on large batch + if batch_size > 1000: + grain = batch_size // num_physical_cores() + + @parameter + fn run_bench(): + parallelize_over_rows[top_k_cpu](shape, 1, grain_size=grain) + + b.iter[run_bench]() + + var els = ThroughputMeasure( + BenchMetric.elements, shape.flattened_length() + ) + var flops = ThroughputMeasure( + BenchMetric.flops, shape.flattened_length() * log2_floor(K) + ) + + # Only benchmark GPU if it's available + @parameter + if target == "gpu": + bench.bench_with_input[IndexList[rank], bench_gpu]( + BenchId("top_k_custom", "gpu"), shape, els, flops + ) + + # TODO: Always benchmark CPU to compare with GPU + else: + bench.bench_function[bench_cpu]( + BenchId("top_k_custom", "cpu"), els, flops + ) + + bench.config.verbose_metric_names = False + bench.config.verbose_timing = True + print(bench) diff --git a/examples/custom_ops/kernels/vector_addition.mojo b/examples/custom_ops/kernels/vector_addition.mojo new file mode 100644 index 0000000000..9b7f3e7d6b --- /dev/null +++ b/examples/custom_ops/kernels/vector_addition.mojo @@ -0,0 +1,101 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from math import ceildiv + +from gpu import block_dim, block_idx, thread_idx +from gpu.host import DeviceContext +from runtime.asyncrt import DeviceContextPtr +from tensor import ManagedTensorSlice, foreach + +from utils.index import IndexList + + +fn _vector_addition_cpu( + out: ManagedTensorSlice, + lhs: ManagedTensorSlice[type = out.type, rank = out.rank], + rhs: ManagedTensorSlice[type = out.type, rank = out.rank], + ctx: DeviceContextPtr, +): + # Warning: This is an extremely inefficient implementation! It's merely an + # instructional example of how a dedicated CPU-only path can be specified + # for basic vector addition. + var vector_length = out.dim_size(0) + for i in range(vector_length): + var idx = IndexList[out.rank](i) + var result = lhs.load[1](idx) + rhs.load[1](idx) + out.store[1](idx, result) + + +fn _vector_addition_gpu( + out: ManagedTensorSlice, + lhs: ManagedTensorSlice[type = out.type, rank = out.rank], + rhs: ManagedTensorSlice[type = out.type, rank = out.rank], + ctx: DeviceContextPtr, +) raises: + # Note: The following has not been tuned for any GPU hardware, and is an + # instructional example for how a simple GPU function can be constructed + # and dispatched. + alias BLOCK_SIZE = 16 + var gpu_ctx = ctx.get_device_context() + var vector_length = out.dim_size(0) + + # The function that will be launched and distributed across GPU threads. + @parameter + fn vector_addition_gpu_kernel(length: Int): + var tid = block_dim.x * block_idx.x + thread_idx.x + if tid < length: + var idx = IndexList[out.rank](tid) + var result = lhs.load[1](idx) + rhs.load[1](idx) + out.store[1](idx, result) + + # The vector is divided up into blocks, making sure there's an extra + # full block for any remainder. + var num_blocks = ceildiv(vector_length, BLOCK_SIZE) + + # The GPU function is compiled and enqueued to run on the GPU across the + # 1-D vector, split into blocks of `BLOCK_SIZE` width. + gpu_ctx.enqueue_function[vector_addition_gpu_kernel]( + vector_length, grid_dim=num_blocks, block_dim=BLOCK_SIZE + ) + + +@compiler.register("vector_addition", num_dps_outputs=1) +struct VectorAddition: + @staticmethod + fn execute[ + # The kind of device this will be run on: "cpu" or "gpu" + target: StringLiteral, + ]( + # as num_dps_outputs=1, the first argument is the "output" + out: ManagedTensorSlice[rank=1], + # starting here are the list of inputs + lhs: ManagedTensorSlice[type = out.type, rank = out.rank], + rhs: ManagedTensorSlice[type = out.type, rank = out.rank], + # the context is needed for some GPU calls + ctx: DeviceContextPtr, + ) raises: + # For a simple elementwise operation like this, the `foreach` function + # does much more rigorous hardware-specific tuning. We recommend using + # that abstraction, with this example serving purely as an illustration + # of how lower-level functions can be used to program GPUs via Mojo. + + # At graph compilation time, we will know what device we are compiling + # this operation for, so we can specialize it for the target hardware. + @parameter + if target == "cpu": + _vector_addition_cpu(out, lhs, rhs, ctx) + elif target == "gpu": + _vector_addition_gpu(out, lhs, rhs, ctx) + else: + raise Error("No known target:", target) diff --git a/examples/custom_ops/mandelbrot.py b/examples/custom_ops/mandelbrot.py new file mode 100644 index 0000000000..b1d4855171 --- /dev/null +++ b/examples/custom_ops/mandelbrot.py @@ -0,0 +1,99 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops + + +def create_mandelbrot_graph( + width: int, + height: int, + min_x: float, + min_y: float, + scale_x: float, + scale_y: float, + max_iterations: int, +) -> Graph: + """Configure a graph to run a Mandelbrot kernel.""" + output_dtype = DType.int32 + with Graph( + "mandelbrot", + ) as graph: + # The custom Mojo operation is referenced by its string name, and we + # need to provide inputs as a list as well as expected output types. + result = ops.custom( + name="mandelbrot", + values=[ + ops.constant(min_x, dtype=DType.float32), + ops.constant(min_y, dtype=DType.float32), + ops.constant(scale_x, dtype=DType.float32), + ops.constant(scale_y, dtype=DType.float32), + ops.constant(max_iterations, dtype=DType.int32), + ], + out_types=[TensorType(dtype=output_dtype, shape=[height, width])], + )[0].tensor + + # Return the result of the custom operation as the output of the graph. + graph.output(result) + return graph + + +if __name__ == "__main__": + # This is necessary only in specific build environments. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + # Establish Mandelbrot set ranges. + WIDTH = 15 + HEIGHT = 15 + MAX_ITERATIONS = 100 + MIN_X = -1.5 + MAX_X = 0.7 + MIN_Y = -1.12 + MAX_Y = 1.12 + + # Configure our simple graph. + scale_x = (MAX_X - MIN_X) / WIDTH + scale_y = (MAX_Y - MIN_Y) / HEIGHT + graph = create_mandelbrot_graph( + WIDTH, HEIGHT, MIN_X, MIN_Y, scale_x, scale_y, MAX_ITERATIONS + ) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session that runs the graph on a GPU, if available. + session = InferenceSession( + devices=[device], + custom_extensions=path, + ) + # Compile the graph. + model = session.load(graph) + + # Perform the calculation on the target device. + result = model.execute()[0] + + # Copy values back to the CPU to be read. + assert isinstance(result, Tensor) + result = result.to(CPU()) + + print("Iterations to escape:") + print(result.to_numpy()) + print() diff --git a/examples/custom_ops/matrix_multiplication.py b/examples/custom_ops/matrix_multiplication.py new file mode 100644 index 0000000000..70335e7b4d --- /dev/null +++ b/examples/custom_ops/matrix_multiplication.py @@ -0,0 +1,169 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import numpy as np +from max.driver import CPU, Accelerator, Device, Tensor, accelerator_count +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops +from numpy.typing import NDArray + + +def matrix_multiplication( + a: NDArray[np.float32], + b: NDArray[np.float32], + algorithm: str, + session: InferenceSession, + device: Device, +) -> Tensor: + dtype = DType.float32 + + # Create driver tensors from the input arrays, and move them to the + # accelerator. + a_tensor = Tensor.from_numpy(a).to(device) + b_tensor = Tensor.from_numpy(b).to(device) + + # Configure our simple one-operation graph. + with Graph( + "matrix_multiplication_graph", + input_types=[ + TensorType(dtype, shape=a_tensor.shape), + TensorType(dtype, shape=b_tensor.shape), + ], + ) as graph: + # Take in the two inputs to the graph. + a_value, b_value = graph.inputs + # The matrix multiplication custom operation takes in two matrices and + # produces a result, with the specific algorithm that is used chosen + # via compile-time parameterization. + output = ops.custom( + name="matrix_multiplication", + values=[a_value, b_value], + out_types=[ + TensorType( + dtype=a_value.tensor.dtype, + shape=[a_value.tensor.shape[0], b_value.tensor.shape[1]], + ) + ], + parameters={"algorithm": algorithm}, + )[0].tensor + graph.output(output) + + # Compile the graph. + print("Compiling...") + model = session.load(graph) + + # Perform the calculation on the target device. + print("Executing...") + result = model.execute(a_tensor, b_tensor)[0] + + # Copy values back to the CPU to be read. + assert isinstance(result, Tensor) + return result.to(CPU()) + + +if __name__ == "__main__": + # This is necessary only in specific build environments. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + M = 256 + K = 256 + N = 256 + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession( + devices=[device], + custom_extensions=path, + ) + + # Fill the input matrices with random values. + a = np.random.uniform(size=(M, K)).astype(np.float32) + b = np.random.uniform(size=(K, N)).astype(np.float32) + + # First, perform the matrix multiplication in NumPy. + print("A:") + print(a) + print() + + print("B:") + print(b) + print() + + print("Expected result:") + print(a @ b) + print() + + if accelerator_count() > 0: + # Then, test the various versions of matrix multiplication operations. + naive_result = matrix_multiplication(a, b, "naive", session, device) + print("Naive matrix multiplication:") + print(naive_result.to_numpy()) + print() + + coalescing_result = matrix_multiplication( + a, b, "coalescing", session, device + ) + print("Coalescing matrix multiplication:") + print(coalescing_result.to_numpy()) + print() + + tiled_result = matrix_multiplication(a, b, "tiled", session, device) + print("Tiled matrix multiplication:") + print(tiled_result.to_numpy()) + print() + + tiled_register_result = matrix_multiplication( + a, b, "tiled_register", session, device + ) + print("Shared memory and register tiling matrix multiplication:") + print(tiled_register_result.to_numpy()) + print() + + block_tiled_result = matrix_multiplication( + a, b, "block_tiled", session, device + ) + print("2D block tiled matrix multiplication:") + print(block_tiled_result.to_numpy()) + print() + + block_tiled_vectorized_result = matrix_multiplication( + a, b, "block_tiled_vectorized", session, device + ) + print("2D block tiled matrix multiplication (vectorized):") + print(block_tiled_vectorized_result.to_numpy()) + print() + + tensor_core_result = matrix_multiplication( + a, b, "tensor_core", session, device + ) + print("Matrix multiplication using Tensor Cores:") + print(tensor_core_result.to_numpy()) + print() + else: + print( + "No MAX-compatible accelerator detected, only running a naive matrix multiplication:" + ) + + naive_result = matrix_multiplication(a, b, "naive", session, device) + print("Naive matrix multiplication:") + print(naive_result.to_numpy()) + print() diff --git a/examples/custom_ops/mojoproject.toml b/examples/custom_ops/mojoproject.toml new file mode 100644 index 0000000000..d110891084 --- /dev/null +++ b/examples/custom_ops/mojoproject.toml @@ -0,0 +1,22 @@ +[project] +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +description = "An example of extending a graph with a custom Mojo operation" +name = "Custom Operations" +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] +version = "0.1.0" + +[tasks] +package = "mojo package kernels/ -o kernels.mojopkg" +addition = { cmd = "python addition.py", depends-on = ["package"] } +mandelbrot = { cmd = "python mandelbrot.py", depends-on = ["package"] } +vector_addition = { cmd = "python vector_addition.py", depends-on = ["package"] } +top_k = { cmd = "python top_k.py", depends-on = ["package"] } +fused_attention = { cmd = "python fused_attention.py", depends-on = ["package"] } +matrix_multiplication = { cmd = "python matrix_multiplication.py", depends-on = ["package"] } +histogram = { cmd = "python histogram.py", depends-on = ["package"] } +test = { depends-on = ["addition", "mandelbrot", "vector_addition", "top_k", "fused_attention", "matrix_multiplication"] } + +[dependencies] +python = ">=3.9,<3.13" +max = ">=24.6.0.dev2024090821" diff --git a/examples/custom_ops/parametric_addition.py b/examples/custom_ops/parametric_addition.py new file mode 100644 index 0000000000..e4f0d1d5a7 --- /dev/null +++ b/examples/custom_ops/parametric_addition.py @@ -0,0 +1,82 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import numpy as np +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops + +if __name__ == "__main__": + # This is necessary only in specific build environments. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + rows = 5 + columns = 10 + dtype = DType.float32 + + # Configure our simple one-operation graph. + graph = Graph( + "addition", + # The custom Mojo operation is referenced by its string name, and we + # need to provide inputs as a list as well as expected output types. + # Since the custom operation is parametric, we need to provide the + # parameters as a dictionary. + forward=lambda x: ops.custom( + name="add_constant_custom", + values=[x], + out_types=[TensorType(dtype=x.dtype, shape=x.tensor.shape)], + parameters={"value": 5}, + )[0].tensor, + input_types=[ + TensorType(dtype, shape=[rows, columns]), + ], + ) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession( + devices=[device], + custom_extensions=path, + ) + + # Compile the graph. + model = session.load(graph) + + # Fill an input matrix with random values. + x_values = np.random.uniform(size=(rows, columns)).astype(np.float32) + + # Create a driver tensor from this, and move it to the accelerator. + x = Tensor.from_numpy(x_values).to(device) + + # Perform the calculation on the target device. + result = model.execute(x)[0] + + # Copy values back to the CPU to be read. + assert isinstance(result, Tensor) + result = result.to(CPU()) + + print("Graph result:") + print(result.to_numpy()) + print() + + print("Expected result:") + print(x_values + 5) diff --git a/examples/custom_ops/top_k.py b/examples/custom_ops/top_k.py new file mode 100644 index 0000000000..887fd444c0 --- /dev/null +++ b/examples/custom_ops/top_k.py @@ -0,0 +1,214 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +import argparse +import os +from collections import defaultdict +from pathlib import Path +from typing import DefaultDict + +import numpy as np +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine.api import InferenceSession +from max.graph import Graph, TensorType, ops +from numpy.typing import NDArray + +INPUT_TEXT = """ +The quick rabbit runs past the brown fox +The quick rabbit jumps over the brown dog +The quick dog chases past the lazy fox +The quick dog runs through the tall trees +The quick brown fox jumps over the lazy dog +The brown dog sleeps under the shady tree +The brown rabbit hops under the tall tree +The brown fox runs through the forest trees +The brown fox watches the sleeping rabbit +The lazy fox watches over the sleeping dog +The lazy dog watches the quick rabbit +The shady tree shelters the brown rabbit +The shady fox sleeps under the old tree +The sleeping fox rests beside the shady tree +The lazy rabbit rests beside the brown fox +""" + + +class NextWordFrequency: + def __init__(self, text): + # nested `DefaultDict` to create the keys when first indexed + # Structure looks like: {"word": {"next_word": count}} + self.word_frequencies: DefaultDict[str, DefaultDict[str, int]] = ( + defaultdict(lambda: defaultdict(int)) + ) + + # Track the largest amount of next words to pad the tensor + self.max_next_words = 0 + + # Build word frequencies + words = text.lower().split() + for i in range(len(words) - 1): + current_word = words[i] + next_word = words[i + 1] + self.word_frequencies[current_word][next_word] += 1 + self.max_next_words = max( + self.max_next_words, len(self.word_frequencies[current_word]) + ) + + def next_word_probabilities(self, words) -> NDArray[np.float32]: + if not words: + return np.empty(0, dtype=np.float32) + + # List to store the probability distributions for each word + prob_distributions = [] + + for word in words: + if word not in self.word_frequencies: + raise ValueError( + f"Error: cannot predict word after '{word}', not found in input text" + ) + + for word in words: + frequencies = self.word_frequencies[word] + freq_list = np.array(list(frequencies.values()), dtype=np.float32) + + # Avoid division by zero + total = freq_list.sum() + if total > 0: + freq_list /= total + + # Pad to largest length of next words + padded_dist = np.pad( + freq_list, + (0, self.max_next_words - len(freq_list)), + mode="constant", + constant_values=0, + ) + prob_distributions.append(padded_dist) + + return np.stack(prob_distributions, axis=0) + + def __getitem__(self, idx): + return self.word_frequencies[idx] + + +# Example usage +def main(): + parser = argparse.ArgumentParser( + description="Top-K sampling with custom ops" + ) + parser.add_argument( + "--stress-test", + type=int, + default=0, + help=( + "Number of times to repeat input for stress testing. " + "On NVIDIA A100, 250_000_000 takes less than 0.5ms and uses over 75%% of its memory." + ), + ) + parser.add_argument( + "--cpu", + action="store_true", + help="Run on CPU even if there is a GPU available.", + ) + args = parser.parse_args() + + # This is necessary only for Modular internal CI. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + # Get the path to our compiled custom ops + path = Path(__file__).parent / "kernels.mojopkg" + + # Initialize the next word frequency for each unique word + frequencies = NextWordFrequency(INPUT_TEXT) + word_predictions = ["the", "quick", "brown"] + + # Get probabilities of next word for each word in the `word_predictions` list + probabilities = frequencies.next_word_probabilities(word_predictions) + + # If stress testing, repeat the input the specified number of times + if args.stress_test > 0: + probabilities = np.repeat(probabilities, args.stress_test, axis=0) + + batch_size = len(probabilities) + K = frequencies.max_next_words + + # Configure our simple one-operation graph. + with Graph( + "top_k_sampler", + # The dtype and shape of the probabilities being passed in + input_types=[TensorType(DType.float32, shape=[batch_size, K])], + ) as graph: + # Take the probabilities as a single input to the graph. + probs, *_ = graph.inputs + + results = ops.custom( + # This is the custom op name defined in `kernels/top_k.mojo`. + name="top_k_custom", + # Passes `K` as a compile-time Mojo `Int`. + parameters={"K": K}, + # Passes the probabilities as a single input to the graph. + values=[probs], + out_types=[ + # The output values dtype and shape + TensorType(probs.tensor.dtype, probs.tensor.shape), + # The output indices dtype and shape + TensorType(DType.int32, probs.tensor.shape), + ], + ) + graph.output(*results) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if args.cpu or accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession(devices=[device], custom_extensions=path) + + # Compile the graph. + model = session.load(graph) + + # Create a driver tensor from the next word probabilities + input_tensor = Tensor.from_numpy(probabilities).to(device) + + print(f"Sampling top k: {K} for batch size: {batch_size}") + + values, indices = model.execute(input_tensor) + + if args.stress_test > 0: + return + + # Copy values and indices back to the CPU to be read. + assert isinstance(values, Tensor) + values = values.to(CPU()) + np_values = values.to_numpy() + + assert isinstance(indices, Tensor) + indices = indices.to(CPU()) + np_indices = indices.to_numpy() + + for i in range(batch_size): + print(f"\nPredicted word after `{word_predictions[i]}`") + print("-------------------------------") + print("| word | confidence |") + print("-------------------------------") + keys = list(frequencies.word_frequencies[word_predictions[i]].keys()) + + for j in range(len(np_indices[i])): + # If it's a padded index/value, break out of the loop + if j > len(keys) - 1: + break + print(f"| {keys[np_indices[i][j]]:<13}| {np_values[i][j]:<13.8}|") + print("-------------------------------") + + +if __name__ == "__main__": + main() diff --git a/examples/custom_ops/vector_addition.py b/examples/custom_ops/vector_addition.py new file mode 100644 index 0000000000..9ed124f6a8 --- /dev/null +++ b/examples/custom_ops/vector_addition.py @@ -0,0 +1,92 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import numpy as np +from max.driver import CPU, Accelerator, Tensor, accelerator_count +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops + +if __name__ == "__main__": + # This is necessary only in specific build environments. + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + path = Path(__file__).parent / "kernels.mojopkg" + + vector_width = 10 + dtype = DType.float32 + + # Configure our simple one-operation graph. + with Graph( + "vector_addition", + input_types=[ + TensorType(dtype, shape=[vector_width]), + TensorType(dtype, shape=[vector_width]), + ], + ) as graph: + # Take in the two inputs to the graph. + lhs, rhs = graph.inputs + output = ops.custom( + name="vector_addition", + values=[lhs, rhs], + out_types=[ + TensorType(dtype=lhs.tensor.dtype, shape=lhs.tensor.shape) + ], + )[0].tensor + graph.output(output) + + # Place the graph on a GPU, if available. Fall back to CPU if not. + device = CPU() if accelerator_count() == 0 else Accelerator() + + # Set up an inference session for running the graph. + session = InferenceSession( + devices=[device], + custom_extensions=path, + ) + + # Compile the graph. + model = session.load(graph) + + # Fill input matrices with random values. + lhs_values = np.random.uniform(size=(vector_width)).astype(np.float32) + rhs_values = np.random.uniform(size=(vector_width)).astype(np.float32) + + # Create driver tensors from this, and move them to the accelerator. + lhs_tensor = Tensor.from_numpy(lhs_values).to(device) + rhs_tensor = Tensor.from_numpy(rhs_values).to(device) + + # Perform the calculation on the target device. + result = model.execute(lhs_tensor, rhs_tensor)[0] + + # Copy values back to the CPU to be read. + assert isinstance(result, Tensor) + result = result.to(CPU()) + + print("Left-hand-side values:") + print(lhs_values) + print() + + print("Right-hand-side values:") + print(rhs_values) + print() + + print("Graph result:") + print(result.to_numpy()) + print() + + print("Expected result:") + print(lhs_values + rhs_values) diff --git a/examples/gpu_functions/README.md b/examples/gpu_functions/README.md new file mode 100755 index 0000000000..3e09a9c092 --- /dev/null +++ b/examples/gpu_functions/README.md @@ -0,0 +1,50 @@ +# Compiling and running Mojo functions on a GPU + +> [!NOTE] +> This is a preview of an interface for programming GPUs using Mojo, +> and may be subject to change before the next stable release. + +Mojo functions can be compiled and dispatched on a GPU, and these examples +show a few different ways of doing so. They also demonstrate how to allocate +and move tensors between CPU and GPU via the MAX Driver API. These examples are +complementary with +[those that show how to program custom graph operations](../custom_ops/) to +run on the CPU or GPU in Mojo. + +> [!NOTE] +> The Mojo interfaces to the MAX Driver API are under development, are +> not fully documented, and may change before the next stable release. + +A [MAX-compatible GPU](https://docs.modular.com/max/faq/#gpu-requirements) is +necessary to run these examples. + +The four examples of GPU functions defined in Mojo consist of: + +- **vector_addition.mojo**: A common "hello world" example for GPU programming, + this adds two vectors together in the same way as seen in Chapter 2 of + ["Programming Massively Parallel Processors"](https://www.sciencedirect.com/book/9780323912310/programming-massively-parallel-processors). +- **grayscale.mojo**: The parallelized conversion of an RGB image to grayscale, + as seen in Chapter 3 of "Programming Massively Parallel Processors". +- **naive_matrix_multiplication.mojo**: An implementation of naive matrix + multiplication, again inspired by Chapter 3 of "Programming Massively + Parallel Processors". +- **mandelbrot.mojo**: A parallel calculation of the number of iterations to + escape in the Mandelbrot set. An example of the same computation performed as + a custom graph operation can be found [here](../custom_ops/). + +A single Magic command runs each of the examples: + +```sh +magic run vector_addition +magic run grayscale +magic run naive_matrix_multiplication +magic run mandelbrot +``` + +For larger computations, we recommend staging them as part of a +[MAX Graph](https://docs.modular.com/max/tutorials/get-started-with-max-graph-in-python). +The graph compiler within MAX performs intelligent operator fusion, +orchestrates efficient runtime execution, and more. The same Mojo code running +on a GPU in one of these examples can be easily translated to +[a custom operation](https://docs.modular.com/max/tutorials/build-custom-ops) +and placed inside a node in a MAX Graph. diff --git a/examples/gpu_functions/grayscale.mojo b/examples/gpu_functions/grayscale.mojo new file mode 100755 index 0000000000..f0bcc52566 --- /dev/null +++ b/examples/gpu_functions/grayscale.mojo @@ -0,0 +1,124 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +from gpu.host import Dim +from gpu.id import block_dim, block_idx, thread_idx +from math import ceildiv +from max.driver import ( + Device, + DynamicTensor, + Tensor, + accelerator_device, + cpu_device, +) +from max.driver.accelerator import compile + +alias channel_dtype = DType.uint8 +alias internal_float_dtype = DType.float32 +alias tensor_rank = 3 +alias TensorType = DynamicTensor[type=channel_dtype, rank=tensor_rank].Type + + +def print_image[h: Int, w: Int](t: Tensor[channel_dtype, 3]): + """A helper function to print out the grayscale channel intensities.""" + out = t.unsafe_slice() + for row in range(h): + for col in range(w): + var v = out[row, col, 0] + if v < 100: + print(" ", end="") + if v < 10: + print(" ", end="") + print(v, " ", end="") + print("") + + +fn color_to_grayscale_conversion( + width: Int, + height: Int, + image: TensorType, + out: TensorType, +): + """Converting each RGB pixel to grayscale, parallelized across the output tensor on the GPU. + """ + row = block_dim.y * block_idx.y + thread_idx.y + col = block_dim.x * block_idx.x + thread_idx.x + + if col < width and row < height: + red = image[row, col, 0].cast[internal_float_dtype]() + green = image[row, col, 1].cast[internal_float_dtype]() + blue = image[row, col, 2].cast[internal_float_dtype]() + gray = 0.21 * red + 0.71 * green + 0.07 * blue + + out[row, col, 0] = gray.cast[channel_dtype]() + + +def main(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + alias IMAGE_WIDTH = 5 + alias IMAGE_HEIGHT = 10 + alias NUM_CHANNELS = 3 + + # Allocate the input image tensor on the host. + rgb_tensor = Tensor[channel_dtype, tensor_rank]( + (IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS), host_device + ) + + # Fill the image with initial colors. + for row in range(IMAGE_HEIGHT): + for col in range(IMAGE_WIDTH): + rgb_tensor[row, col, 0] = row + col + rgb_tensor[row, col, 1] = row + col + 20 + rgb_tensor[row, col, 2] = row + col + 40 + + # Move the image tensor to the accelerator. + rgb_tensor = rgb_tensor.move_to(gpu_device) + + # Allocate a tensor on the accelerator to host the grayscale image. + gray_tensor = Tensor[channel_dtype, tensor_rank]( + (IMAGE_HEIGHT, IMAGE_WIDTH, 1), gpu_device + ) + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[color_to_grayscale_conversion](gpu_device) + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + num_col_blocks = ceildiv(IMAGE_WIDTH, BLOCK_SIZE) + num_row_blocks = ceildiv(IMAGE_HEIGHT, BLOCK_SIZE) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + IMAGE_WIDTH, + IMAGE_HEIGHT, + rgb_tensor.unsafe_slice(), + gray_tensor.unsafe_slice(), + grid_dim=Dim(num_col_blocks, num_row_blocks), + block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + gray_tensor = gray_tensor.move_to(host_device) + + print("Resulting grayscale image:") + print_image[IMAGE_HEIGHT, IMAGE_WIDTH](gray_tensor) diff --git a/examples/gpu_functions/mandelbrot.mojo b/examples/gpu_functions/mandelbrot.mojo new file mode 100755 index 0000000000..4356e624b1 --- /dev/null +++ b/examples/gpu_functions/mandelbrot.mojo @@ -0,0 +1,129 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from collections.string import StringSlice +from complex import ComplexSIMD +from gpu.host import Dim +from gpu.id import thread_idx, block_dim, block_idx +from math import ceildiv +from max.driver import DynamicTensor, Tensor, accelerator_device, cpu_device +from max.driver.accelerator import compile + +alias float_dtype = DType.float32 +alias int_dtype = DType.int32 +alias TensorType = DynamicTensor[type=int_dtype, rank=2].Type + + +def draw_mandelbrot[h: Int, w: Int](t: Tensor[int_dtype, 2], max: Int): + """A helper function to visualize the Mandelbrot set in ASCII art.""" + alias sr = StringSlice("....,c8M@jawrpogOQEPGJ") + out = t.unsafe_slice() + for row in range(h): + for col in range(w): + var v = out[row, col] + if v < max: + var idx = Int(v % len(sr)) + var p = sr[idx] + print(p, end="") + else: + print(" ", end="") + print("") + + +fn mandelbrot( + min_x: Scalar[float_dtype], + min_y: Scalar[float_dtype], + scale_x: Scalar[float_dtype], + scale_y: Scalar[float_dtype], + max_iterations: Scalar[int_dtype], + out: TensorType, +): + """The per-element calculation of iterations to escape in the Mandelbrot set. + """ + # Obtain the position in the grid from the X, Y thread locations. + var row = block_dim.y * block_idx.y + thread_idx.y + var col = block_dim.x * block_idx.x + thread_idx.x + + # Calculate the complex C corresponding to that grid location. + var cx = min_x + col * scale_x + var cy = min_y + row * scale_y + var c = ComplexSIMD[float_dtype, 1](cx, cy) + + # Perform the Mandelbrot iteration loop calculation. + var z = ComplexSIMD[float_dtype, 1](0, 0) + var iters = Scalar[int_dtype](0) + + var in_set_mask: Scalar[DType.bool] = True + for _ in range(max_iterations): + if not any(in_set_mask): + break + in_set_mask = z.squared_norm() <= 4 + iters = in_set_mask.select(iters + 1, iters) + z = z.squared_add(c) + + # Write out the resulting iterations to escape. + out[row, col] = iters + + +def main(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[mandelbrot](gpu_device) + + # Set the resolution of the Mandelbrot set grid that will be calculated. + alias GRID_WIDTH = 60 + alias GRID_HEIGHT = 25 + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + num_col_blocks = ceildiv(GRID_WIDTH, BLOCK_SIZE) + num_row_blocks = ceildiv(GRID_HEIGHT, BLOCK_SIZE) + + # Set the parameters for the area of the Mandelbrot set we'll be examining. + alias MIN_X: Scalar[float_dtype] = -2.0 + alias MAX_X: Scalar[float_dtype] = 0.7 + alias MIN_Y: Scalar[float_dtype] = -1.12 + alias MAX_Y: Scalar[float_dtype] = 1.12 + alias SCALE_X = (MAX_X - MIN_X) / GRID_WIDTH + alias SCALE_Y = (MAX_Y - MIN_Y) / GRID_HEIGHT + alias MAX_ITERATIONS = 100 + + # Allocate a tensor on the target device to hold the resulting set. + out_tensor = Tensor[int_dtype, 2]((GRID_HEIGHT, GRID_WIDTH), gpu_device) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + MIN_X, + MIN_Y, + SCALE_X, + SCALE_Y, + MAX_ITERATIONS, + out_tensor.unsafe_slice(), + grid_dim=Dim(num_col_blocks, num_row_blocks), + block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + out_tensor = out_tensor.move_to(host_device) + + # Draw the final Mandelbrot set. + draw_mandelbrot[GRID_HEIGHT, GRID_WIDTH](out_tensor, max=MAX_ITERATIONS) diff --git a/examples/gpu_functions/mojoproject.toml b/examples/gpu_functions/mojoproject.toml new file mode 100755 index 0000000000..242792e7fb --- /dev/null +++ b/examples/gpu_functions/mojoproject.toml @@ -0,0 +1,17 @@ +[project] +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +description = "Examples of using Mojo to write GPU functions" +name = "Mojo GPU Functions" +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] +version = "0.1.0" + +[tasks] +vector_addition = "mojo run vector_addition.mojo" +grayscale = "mojo run grayscale.mojo" +naive_matrix_multiplication = "mojo run naive_matrix_multiplication.mojo" +mandelbrot = "mojo run mandelbrot.mojo" +test = { depends-on = ["vector_addition", "grayscale", "naive_matrix_multiplication", "mandelbrot"] } + +[dependencies] +max = ">=24.6.0.dev2024090821" diff --git a/examples/gpu_functions/naive_matrix_multiplication.mojo b/examples/gpu_functions/naive_matrix_multiplication.mojo new file mode 100755 index 0000000000..515f87e2b5 --- /dev/null +++ b/examples/gpu_functions/naive_matrix_multiplication.mojo @@ -0,0 +1,110 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +from gpu.host import Dim +from gpu.id import block_dim, block_idx, thread_idx +from math import ceildiv +from max.driver import ( + Device, + DynamicTensor, + Tensor, + accelerator_device, + cpu_device, +) +from max.driver.accelerator import compile + +alias float_dtype = DType.float32 +alias tensor_rank = 2 +alias TensorType = DynamicTensor[type=float_dtype, rank=tensor_rank].Type + + +fn naive_matrix_multiplication( + i: Int, + j: Int, + k: Int, + m: TensorType, + n: TensorType, + p: TensorType, +): + """Naive matrix multiplication of M_ij x N_jk = P_ik.""" + row = block_dim.y * block_idx.y + thread_idx.y + col = block_dim.x * block_idx.x + thread_idx.x + + if row < i and col < k: + for j_index in range(j): + p[row, col] = p[row, col] + m[row, j_index] * n[j_index, col] + + +def main(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + alias I = 5 + alias J = 4 + alias K = 6 + + # Allocate the two input matrices on the host. + m_tensor = Tensor[float_dtype, tensor_rank]((I, J), host_device) + n_tensor = Tensor[float_dtype, tensor_rank]((J, K), host_device) + + # Fill them with initial values. + for m_row in range(I): + for m_col in range(J): + m_tensor[m_row, m_col] = m_row - m_col + + for n_row in range(J): + for n_col in range(K): + n_tensor[n_row, n_col] = n_row + n_col + + print("M matrix:", m_tensor) + print("N matrix:", n_tensor) + + # Move the input matrices to the accelerator. + m_tensor = m_tensor.move_to(gpu_device) + n_tensor = n_tensor.move_to(gpu_device) + + # Allocate a tensor on the accelerator to host the calculation results. + p_tensor = Tensor[float_dtype, tensor_rank]((I, K), gpu_device) + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[naive_matrix_multiplication](gpu_device) + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + num_col_blocks = ceildiv(I, BLOCK_SIZE) + num_row_blocks = ceildiv(J, BLOCK_SIZE) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + I, + J, + K, + m_tensor.unsafe_slice(), + n_tensor.unsafe_slice(), + p_tensor.unsafe_slice(), + grid_dim=Dim(num_col_blocks, num_row_blocks), + block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + p_tensor = p_tensor.move_to(host_device) + + print("Resulting matrix:", p_tensor) diff --git a/examples/gpu_functions/vector_addition.mojo b/examples/gpu_functions/vector_addition.mojo new file mode 100755 index 0000000000..dd4aaa4361 --- /dev/null +++ b/examples/gpu_functions/vector_addition.mojo @@ -0,0 +1,93 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from gpu.host import Dim +from gpu.id import block_dim, block_idx, thread_idx +from math import ceildiv +from max.driver import ( + Device, + DynamicTensor, + Tensor, + accelerator_device, + cpu_device, +) +from max.driver.accelerator import compile + +alias float_dtype = DType.float32 +alias tensor_rank = 1 +alias TensorType = DynamicTensor[type=float_dtype, rank=tensor_rank].Type + + +fn vector_addition( + length: Int, + lhs: TensorType, + rhs: TensorType, + out: TensorType, +): + """The calculation to perform across the vector on the GPU.""" + tid = block_dim.x * block_idx.x + thread_idx.x + if tid < length: + var result = lhs[tid] + rhs[tid] + out[tid] = result + + +def main(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + alias VECTOR_WIDTH = 10 + + # Allocate the two input tensors on the host. + lhs_tensor = Tensor[float_dtype, 1]((VECTOR_WIDTH), host_device) + rhs_tensor = Tensor[float_dtype, 1]((VECTOR_WIDTH), host_device) + + # Fill them with initial values. + for i in range(VECTOR_WIDTH): + lhs_tensor[i] = 1.25 + rhs_tensor[i] = 2.5 + + # Move the input tensors to the accelerator. + lhs_tensor = lhs_tensor.move_to(gpu_device) + rhs_tensor = rhs_tensor.move_to(gpu_device) + + # Allocate a tensor on the accelerator to host the calculation results. + out_tensor = Tensor[float_dtype, tensor_rank]((VECTOR_WIDTH), gpu_device) + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[vector_addition](gpu_device) + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + var num_blocks = ceildiv(VECTOR_WIDTH, BLOCK_SIZE) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + VECTOR_WIDTH, + lhs_tensor.unsafe_slice(), + rhs_tensor.unsafe_slice(), + out_tensor.unsafe_slice(), + grid_dim=Dim(num_blocks), + block_dim=Dim(BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + out_tensor = out_tensor.move_to(host_device) + + print("Resulting vector:", out_tensor) diff --git a/examples/graph-api/README.md b/examples/graph-api/README.md new file mode 100644 index 0000000000..faf99255c3 --- /dev/null +++ b/examples/graph-api/README.md @@ -0,0 +1,36 @@ +# MAX Graph API examples + +These examples demonstrate the flexibility of the +[MAX Graph API](https://docs.modular.com/max/graph/), a +[Mojo](https://docs.modular.com/mojo/) interface to the advanced graph compiler +within MAX. + +## Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run any of the +following commands: + +```sh +magic run basic +``` + +## Conda instructions + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda activate max-repo + +mojo basics/basic.🔥 + +conda deactivate +``` + +## [Graph API introduction](basics/) + +A basic Mojo Graph API example that provides an introduction to how to +stage and run a computational graph on MAX, following the +[getting started guide](https://docs.modular.com/max/tutorials/get-started-with-max-graph). diff --git a/examples/graph-api/basics/README.md b/examples/graph-api/basics/README.md new file mode 100644 index 0000000000..c37b59b418 --- /dev/null +++ b/examples/graph-api/basics/README.md @@ -0,0 +1,26 @@ +# Basic example for MAX Graph API 🔥 + +This is a very simple example of how to build a model with the MAX Graph API +and execute it with MAX Engine. + +For a walkthrough of this code, see the quickstart guide to [build a graph with +MAX Graph](https://docs.modular.com/max/tutorials/get-started-with-max-graph-in-python/). + +## Usage + +First, [install Magic](https://docs.modular.com/magic/). + +Then run `basic.🔥` from a command line: + +```shell +magic run mojo basic.🔥 +``` + +You should see the following output: + +```shell +Input: input0 +Output: output0 +Tensor([[1.0], +[1.0]], dtype=float32, shape=2x1) +``` diff --git "a/examples/graph-api/basics/basic.\360\237\224\245" "b/examples/graph-api/basics/basic.\360\237\224\245" new file mode 100644 index 0000000000..070a159653 --- /dev/null +++ "b/examples/graph-api/basics/basic.\360\237\224\245" @@ -0,0 +1,52 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.engine import InferenceSession +from max.graph import Graph, TensorType, ops +from max.tensor import Tensor, TensorShape + + +# This example highlights the very basic API structure around building a MAX +# Graph model and executing it through the MAX engine APIS. +# Simply run this mojo file to create, load, and execute this simple model. +def main(): + graph = Graph(TensorType(DType.float32, 2, 6)) + + # Create a constant for usage in the matmul op below: + matmul_constant_value = Tensor[DType.float32](TensorShape(6, 1), 0.15) + matmul_constant = graph.constant(matmul_constant_value) + + # Start adding a sequence of operator calls to build the graph. + # We can use the subscript notation to get the graph's first input tensor: + matmul = graph[0] @ matmul_constant + relu = ops.relu(matmul) + softmax = ops.softmax(relu) + graph.output(softmax) + + # Load the graph: + session = InferenceSession() + model = session.load(graph) + + # Print the input/output names: + in_names = model.get_model_input_names() + for name in in_names: + print("Input:", name[]) + out_names = model.get_model_output_names() + for name in out_names: + print("Output:", name[]) + + # Execute the model: + input = Tensor[DType.float32](TensorShape(2, 6), 0.5) + results = model.execute("input0", input^) + output = results.get[DType.float32]("output0") + print(output) diff --git a/examples/graph-api/environment.yml b/examples/graph-api/environment.yml new file mode 100644 index 0000000000..1395c6958d --- /dev/null +++ b/examples/graph-api/environment.yml @@ -0,0 +1,9 @@ +name: max-repo +channels: + - pytorch + - https://conda.modular.com/max/ + - conda-forge + - defaults +dependencies: + - python>=3.11,<3.12 + - max>=24.4.0dev6 diff --git a/examples/graph-api/pixi.toml b/examples/graph-api/pixi.toml new file mode 100644 index 0000000000..0070a3f9de --- /dev/null +++ b/examples/graph-api/pixi.toml @@ -0,0 +1,15 @@ +[project] +name = "Mojo Graph API Examples" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[tasks] +basic = "mojo basics/basic.🔥" +test = { depends-on = ["basic"] } + +[dependencies] +python = ">=3.9,<3.13" +max = "*" diff --git a/examples/graph-api/requirements.txt b/examples/graph-api/requirements.txt new file mode 100644 index 0000000000..53f6a450c2 --- /dev/null +++ b/examples/graph-api/requirements.txt @@ -0,0 +1 @@ +huggingface_hub >=0.24.6,<0.25 diff --git a/examples/gui/.gitattributes b/examples/gui/.gitattributes new file mode 100644 index 0000000000..07fe41c52c --- /dev/null +++ b/examples/gui/.gitattributes @@ -0,0 +1,2 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/examples/gui/.gitignore b/examples/gui/.gitignore new file mode 100644 index 0000000000..a6184bd794 --- /dev/null +++ b/examples/gui/.gitignore @@ -0,0 +1 @@ +app.log diff --git a/examples/gui/.streamlit/config.toml b/examples/gui/.streamlit/config.toml new file mode 100644 index 0000000000..c6c5316861 --- /dev/null +++ b/examples/gui/.streamlit/config.toml @@ -0,0 +1,9 @@ +[client] +showSidebarNavigation = false + +[server] +runOnSave = true + +[theme] +base = "dark" +primaryColor = "#8799ff" diff --git a/examples/gui/README.md b/examples/gui/README.md new file mode 100644 index 0000000000..ddfb444417 --- /dev/null +++ b/examples/gui/README.md @@ -0,0 +1,13 @@ +# MAX Examples GUI + +Example project showing how to create a GUI that calls MAX using the Python +[streamlit](https://streamlit.io/) library. + +## Quick Start + +Install Magic and run the GUI: + +```bash +curl -fsSL https://developer.modular.com/magic | bash +magic run gui +``` diff --git a/examples/gui/home.py b/examples/gui/home.py new file mode 100755 index 0000000000..0b12b27b2d --- /dev/null +++ b/examples/gui/home.py @@ -0,0 +1,32 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import streamlit as st +from shared import menu + +st.set_page_config("MAX", "⚡️") +menu() + +"""# MAX ⚡️ Examples + +Welcome to MAX! Select an example to get started: +""" + +if st.button("🦙 Llama3.1"): + st.switch_page("pages/llama3_1.py") +elif st.button("👓 BERT"): + st.switch_page("pages/bert.py") +elif st.button("🎨 Stable Diffusion 1.5"): + st.switch_page("pages/stable-diffusion.py") +elif st.button("🔍 YOLO"): + st.switch_page("pages/yolo.py") diff --git a/examples/gui/mojoproject.toml b/examples/gui/mojoproject.toml new file mode 100644 index 0000000000..272a71e3db --- /dev/null +++ b/examples/gui/mojoproject.toml @@ -0,0 +1,39 @@ +[project] +name = "gui" +version = "1.0.0" +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +max = "*" +numpy = "1.25.2" +pillow = "<=10.4.0" +protobuf = "<=4.25.3" +tokenizers = "<0.21" +transformers = "<4.47" + +[pypi-dependencies] +pipelines = { path = "../../src/max", editable = true} +accelerate = "<=0.34.2" +diffusers = "<=0.30.3" +gguf = "<=0.10.0" +onnxruntime = "<=1.18.1" +onnxslim = "<=0.1.34" +opencv-python = "<=4.10.0.84" +sentencepiece = "<=0.2.0" +streamlit = "<=1.38.0" +torch = "<=2.5.1" +ultralytics = "<=8.2.103" + +# RAG specific packages +chromadb = "<=0.4.17" +docx2txt = "<=0.8" +EbookLib = "<=0.18" +fastembed = "<=0.3.6" +ftfy = "<=6.2.3" +html2text = "<=2024.2.26" +llama-index = "<=0.11.14" +nbconvert = "<=7.16.4" + +[tasks] +gui = "streamlit run home.py" diff --git a/examples/gui/pages/bert.py b/examples/gui/pages/bert.py new file mode 100644 index 0000000000..b5088e18da --- /dev/null +++ b/examples/gui/pages/bert.py @@ -0,0 +1,151 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +import os +import time + +import pandas as pd +import streamlit as st +import torch +from max import engine +from max.dtype import DType +from shared import menu, modular_cache_dir +from transformers import BertForMaskedLM, BertTokenizer + +st.set_page_config("Bert", page_icon="👓") +menu() + +""" +# 👓 Bert + +A basic implementation of Bert using MAX. Type a text string, using `[MASK]` to indicate where you want the model to predict a word. +""" + +HF_MODEL_NAME = "bert-base-uncased" + + +# If batch, seq_len, or mlm options change, recompile the torchscript. +@st.cache_data +def compile_torchscript(batch: int, seq_len: int): + model = BertForMaskedLM.from_pretrained(HF_MODEL_NAME) + input_dict = { + "input_ids": torch.zeros((batch, seq_len), dtype=torch.int64), + "attention_mask": torch.zeros((batch, seq_len), dtype=torch.int64), + "token_type_ids": torch.zeros((batch, seq_len), dtype=torch.int64), + } + model.eval() + model.config.return_dict = False + with torch.no_grad(): + traced_model = torch.jit.trace( + model, example_kwarg_inputs=dict(input_dict), strict=False + ) + torch.jit.save(traced_model, model_path) + + +@st.cache_resource(show_spinner="Starting MAX Bert Inference Session") +def max_bert_session(model_path: str, batch: int, seq_len: int): + # Wait short time for spinner to start correctly + time.sleep(1) + session = engine.InferenceSession() + inputs = [ + torch.zeros((batch, seq_len), dtype=torch.int64), + torch.zeros((batch, seq_len), dtype=torch.int64), + torch.zeros((batch, seq_len), dtype=torch.int64), + ] + input_spec_list = [ + engine.TorchInputSpec(shape=tensor.size(), dtype=DType.int64) + for tensor in inputs + ] + return session.load(model_path, input_specs=input_spec_list) + + +@st.cache_data() +def get_tokenizer(): + return BertTokenizer.from_pretrained(HF_MODEL_NAME) + + +def softmax(logits): + exp_logits = torch.exp(logits - torch.max(logits)) + return exp_logits / exp_logits.sum(dim=-1, keepdim=True) + + +model_state = st.empty() + +show_predictions = st.sidebar.checkbox("Show top 5 predictions", True) +model_path = st.sidebar.text_input( + "Model Path", + os.path.join(modular_cache_dir(), "bert-mlm.torchscript"), +) +batch = st.sidebar.number_input("Batch Size", 1, 64) +seq_len = st.sidebar.slider("Sequence Length", 128, 1024) +input_text = st.text_input("Text Input", "Don't [MASK] about it") + +compile_torchscript(batch, seq_len) + +if st.button("Predict Word"): + masks = input_text.split("[MASK]") + if len(masks) > 2: + st.error("Cannot have more than a single [MASK] in the input text") + exit(1) + if len(masks) < 2: + st.error("Require at least one [MASK] in the input text") + exit(1) + + model = max_bert_session(model_path, batch, seq_len) + + tokenizer = get_tokenizer() + inputs = tokenizer( + input_text, + return_tensors="pt", + padding="max_length", + truncation=True, + max_length=seq_len, + ) + + masked_index = (inputs["input_ids"] == tokenizer.mask_token_id).nonzero( + as_tuple=True + )[1] + + outputs = model.execute_legacy(**inputs)["result0"] + + logits = torch.from_numpy(outputs[0, masked_index, :]) + + predicted_token_id = logits.argmax(dim=-1) + predicted_tokens = tokenizer.decode( + [predicted_token_id], + skip_special_tokens=True, + clean_up_tokenization_spaces=True, + ) + + st.text_area( + "Filled Mask", input_text.replace("[MASK]", predicted_tokens, 40) + ) + + if show_predictions: + # Get top N predictions for the [MASK] token + top_n = 5 + mask_logits = logits.squeeze(0) # Remove batch dimension + top_n_probs, top_n_indices = torch.topk(softmax(mask_logits), top_n) + + top_n_tokens = tokenizer.convert_ids_to_tokens(top_n_indices.tolist()) + top_n_probs_percent = [prob * 100 for prob in top_n_probs.tolist()] + + # Create a dictionary for the bar chart data + data = {"Token": top_n_tokens, "Probability (%)": top_n_probs_percent} + + # Create a DataFrame for the table + top_n_df = pd.DataFrame(data) + + st.write("Top N predictions for [MASK]:") + st.bar_chart(top_n_df.set_index("Token")) # Display bar chart! diff --git a/examples/gui/pages/llama3_1.py b/examples/gui/pages/llama3_1.py new file mode 100644 index 0000000000..b467bc7792 --- /dev/null +++ b/examples/gui/pages/llama3_1.py @@ -0,0 +1,206 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +import asyncio +import os +import time +from pathlib import Path + +import streamlit as st +import torch +from max.driver import CPU, Accelerator +from max.pipelines import ( + PIPELINE_REGISTRY, + PipelineConfig, + SupportedEncoding, +) +from max.pipelines.architectures.llama3.config import get_llama_huggingface_file +from shared import ( + RAG_PROMPT, + RAG_SYSTEM_PROMPT, + hf_streamlit_download, + load_embed_docs, + menu, + stream_output, +) + +st.set_page_config(page_title="Llama3.1", page_icon="🦙") + +""" +# Llama3.1 🦙 + +Compile and cache Llama3.1 built with MAX graphs so you can continuously +chat with it. + +Tick `Activate RAG` on the sidebar to augment your prompts with +text from documents in the `examples/gui/ragdata` folder in format: `.txt` +`.pdf` `.csv` `.docx` `.epub` `.ipynb` `.md` `.html`. +""" + +menu() + + +@st.cache_resource(show_spinner=False) +def start_llama3( + weight_path: str, + quantization: SupportedEncoding, + max_length: int, + max_new_tokens: int, + use_gpu: bool, +) -> Llama3: + config = PipelineConfig( + architecture="LlamaForCausalLM", + device=Accelerator() if use_gpu else CPU(), + weight_path=[Path(weight_path)], + quantization_encoding=quantization, + max_length=max_length, + max_new_tokens=max_new_tokens, + model_path="modularai/Llama-3.1-8B-Instruct-GGUF", + ) + _, pipeline = PIPELINE_REGISTRY.retrieve_factory(config) + return pipeline + + +def messages_to_llama3_prompt(messages: list[dict[str, str]]) -> str: + prompt_string = "<|begin_of_text|>" + for message in messages: + prompt_string += ( + f"<|start_header_id|>{message['role']}<|end_header_id|>\n\n" + ) + prompt_string += f"{message['content']}<|eot_id|>\n" + prompt_string += "<|start_header_id|>assistant<|end_header_id|>" + return prompt_string + + +if torch.cuda.is_available(): + use_gpu = st.sidebar.checkbox( + f"Use GPU: {torch.cuda.get_device_name(0)}", value=True + ) +else: + use_gpu = st.sidebar.checkbox( + "Use GPU (Accelerator not available)", value=False, disabled=True + ) + +if use_gpu: + encoding = st.sidebar.selectbox("Encoding", [SupportedEncoding.bfloat16]) +else: + encoding = st.sidebar.selectbox( + "Encoding", + [ + SupportedEncoding.q4_k, + SupportedEncoding.q4_0, + SupportedEncoding.q6_k, + ], + ) + +max_length = st.sidebar.number_input( + "Max input and output tokens", 0, 128_000, 12_000 +) +max_new_tokens = st.sidebar.number_input("Max output tokens", 0, 24_000, 6000) + +hf_file = get_llama_huggingface_file("3.1", encoding) +weights = hf_streamlit_download(hf_file.repo_id, hf_file.filename) + +button_state = st.empty() +model_state = st.empty() +if button_state.button("Start Llama3", key=0): + model_state.info("Starting Llama3...", icon="️⚙️") + st.session_state["model"] = start_llama3( + weights, + encoding, + max_length, + max_new_tokens, + use_gpu, + ) + model_state.success("Llama3 is ready!", icon="✅") + +rag = st.sidebar.checkbox("Activate RAG", value=False) + +if rag: + system_prompt = st.sidebar.text_area( + "System Prompt", + value=RAG_SYSTEM_PROMPT, + ) + n_result = st.sidebar.slider( + "Number of Top Embedding Search Results", 1, 7, 5 + ) + rag_directory = st.sidebar.text_input( + "RAG Directory", + value=Path(__file__).parent.parent / "ragdata", + ) + filenames = [ + f + for f in os.listdir(rag_directory) + if os.path.isfile(os.path.join(rag_directory, f)) + ] + # Re-cache reading the documents again if there's a change + collection, embedding_model = load_embed_docs(filenames) + st.success("RAG data is indexed", icon="✅") +else: + system_prompt = st.sidebar.text_area( + "System Prompt", + value="You are a helpful coding assistant named MAX Llama3.", + ) + +# Initialize chat history +if "messages" not in st.session_state: + st.session_state.messages = [] + +# Display chat messages from history on app rerun +for message in st.session_state.messages: + with st.chat_message(message["role"], avatar=message["avatar"]): + st.markdown(message["content"]) + + +disable_chat = True if "model" not in st.session_state else False + +if prompt := st.chat_input("Send a message to llama3", disabled=disable_chat): + messages = [{"role": "system", "content": system_prompt}] + messages += [ + {"role": m["role"], "content": m["content"]} + for m in st.session_state.messages + ] + if rag: + query_embedding = list(embedding_model.embed(prompt))[0].tolist() + ret = collection.query(query_embedding, n_results=n_result) + data = [] + if ret["documents"] is not None and ret["metadatas"] is not None: + for i, (doc, metadata) in enumerate( + zip(ret["documents"], ret["metadatas"]) + ): + data.append(("\n\n".join(doc), metadata[0]["file_name"])) + messages.append( + { + "role": "user", + "content": RAG_PROMPT.format(query=prompt, data=data), + } + ) + else: + messages.append({"role": "user", "content": prompt}) + + with st.chat_message("user", avatar="💬"): + st.markdown(prompt) + + prompt_string = messages_to_llama3_prompt(messages) + + # Sleep short time so prior messages refresh and don't go dark + time.sleep(0.1) + + with st.chat_message("assistant", avatar="🦙"): + response = asyncio.run( + stream_output(st.session_state["model"], prompt_string) + ) + + st.session_state.messages += [ + {"role": "user", "avatar": "💬", "content": prompt}, + {"role": "assistant", "avatar": "🦙", "content": response}, + ] diff --git a/examples/gui/pages/stable-diffusion.py b/examples/gui/pages/stable-diffusion.py new file mode 100644 index 0000000000..efb787cf5a --- /dev/null +++ b/examples/gui/pages/stable-diffusion.py @@ -0,0 +1,136 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import time +from pathlib import Path + +import numpy as np +import streamlit as st +from diffusers.schedulers.scheduling_pndm import PNDMScheduler +from max.engine import InferenceSession +from PIL import Image +from shared import hf_streamlit_download, menu +from transformers.models.clip.tokenization_clip import CLIPTokenizer + +st.set_page_config("Stable Diffusion 1.5", page_icon="🎨") + +menu() + +"""# 🎨 Stable Diffusion 1.5""" + + +@st.cache_data +def load_tokenizer(path): + return CLIPTokenizer.from_pretrained(path) + + +num_steps = st.sidebar.number_input("Number of steps", 1, 100, 15) +seed = st.sidebar.number_input("Seed", 0, 255) +guidance_scale_factor = st.sidebar.number_input( + "Guidance Scale Factor", 0.0, 10.0, 7.5 +) +latent_scale_factor = st.sidebar.number_input( + "Latent Scale Factor", 0.0, 1.0, 0.18215 +) +output_height = st.sidebar.number_input("Output Height", 0, 2048, 512) +output_width = st.sidebar.number_input("Output Width", 0, 2048, 512) +latent_width = output_width // 8 +latent_height = output_height // 8 +latent_channels = 4 + +model_dir = Path(hf_streamlit_download("modularai/stable-diffusion-1.5-onnx")) + +text_encoder_path = model_dir / "text_encoder" / "model.onnx" +img_decoder_path = model_dir / "vae_decoder" / "model.onnx" +img_diffuser_path = model_dir / "unet" / "model.onnx" +scheduler_path = model_dir / "scheduler" / "scheduler_config.json" +tokenizer_path = model_dir / "tokenizer" + +prompt = st.text_input("Prompt", "A puppy playing the drums") +negative_prompt = st.text_input("Negative Prompt", "No overlapping geometry") + +if seed > 0: + np.random.seed(seed) + +if st.button("Generate Image"): + with st.spinner("Compiling models, faster after first run..."): + # Need a small delay so the spinner starts correctly + time.sleep(1) + session = InferenceSession() + txt_encoder = session.load(text_encoder_path) + img_decoder = session.load(img_decoder_path) + img_diffuser = session.load(img_diffuser_path) + + with st.spinner("Processing Input"): + tokenizer = load_tokenizer(tokenizer_path) + prompt_p = tokenizer( + prompt, padding="max_length", max_length=tokenizer.model_max_length + ) + prompt_n = tokenizer( + negative_prompt, + padding="max_length", + max_length=tokenizer.model_max_length, + ) + input_ids = np.stack((prompt_p.input_ids, prompt_n.input_ids)).astype( + np.int32 + ) + encoder_hidden_states = txt_encoder.execute_legacy(input_ids=input_ids)[ + "last_hidden_state" + ] + + with st.spinner("Initializing Latent"): + scheduler = PNDMScheduler.from_pretrained(scheduler_path) + + # Note: For onnx, shapes are given in NCHW format. + latent = np.random.normal( + size=(1, latent_channels, latent_height, latent_width) + ) + latent = latent * scheduler.init_noise_sigma + latent = latent.astype(np.float32) + + # Loop through diffusion model. + scheduler.set_timesteps(num_steps) + progress_bar = st.progress(0.0, "Step 1/25") + for i, t in enumerate(scheduler.timesteps): + progress_bar.progress(i / num_steps, f"Step {i}/{num_steps}") + if i == num_steps: + progress_bar.progress(1.0, "Complete!") + + # Duplicate input and scale based on scheduler. + sample = np.vstack((latent, latent)) + sample = scheduler.scale_model_input(sample, timestep=t) + + # Execute the diffusion model with bs=2. Both batches have same primary input and + # timestep, but the encoder_hidden_states (primary prompt vs negative) differs. + noise_pred = img_diffuser.execute_legacy( + sample=sample, + encoder_hidden_states=encoder_hidden_states, + timestep=np.array([t], dtype=np.int64), + )["out_sample"] + + # Merge conditioned & unconditioned outputs. + noise_pred_text, noise_pred_uncond = np.split(noise_pred, 2) + noise_pred = noise_pred_uncond + guidance_scale_factor * ( + noise_pred_text - noise_pred_uncond + ) + + # Merge latent with previous iteration. + latent = scheduler.step(noise_pred, t, latent).prev_sample + + # Decode finalized latent. + with st.spinner("Decoding Image"): + latent = latent * (1 / latent_scale_factor) + decoded = img_decoder.execute_legacy(latent_sample=latent)["sample"] + image = np.clip(decoded / 2 + 0.5, 0, 1).squeeze() + image = (image.transpose(1, 2, 0) * 255).astype(np.uint8) + st.image(Image.fromarray(image, "RGB")) diff --git a/examples/gui/pages/yolo.py b/examples/gui/pages/yolo.py new file mode 100644 index 0000000000..11e2a2dde4 --- /dev/null +++ b/examples/gui/pages/yolo.py @@ -0,0 +1,178 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +import time +from pathlib import Path + +import cv2 +import numpy as np +import streamlit as st +import torch +from max import engine +from shared import menu, modular_cache_dir +from ultralytics import YOLO +from ultralytics.engine.results import Results +from ultralytics.models.yolo.segment.predict import ops + +st.set_page_config("YOLO", page_icon="🔍") +menu() + +""" +# 🔍 YOLO Segmentation + +Segment objects using your webcam. This downloads and converts YOLOv8n to +ONNX, then compiles it with MAX for faster inference! +""" + +# First do a quick check to see if a webcam is available +capture = cv2.VideoCapture(cv2.CAP_ANY) +if capture.isOpened(): + capture.release() +else: + st.error("This example is only available on a local machine with a webcam") + exit() + + +@st.cache_data(show_spinner="Downloading YOLO and exporting to ONNX") +def download_and_export_yolo(model_path, height, width): + model = YOLO(model_path) + model.export(format="onnx", imgsz=(height, width), simplify=True) + return model.names + + +@st.cache_resource(show_spinner="Starting MAX Inference Session") +def max_yolo_session(onnx_path): + # Have to sleep for a short time for the spinner to start correctly + time.sleep(1) + session = engine.InferenceSession() + return session.load(onnx_path) + + +def resize_and_pad(image, shape): + # Grab shape sizes. + (h, w, _) = image.shape + (target_h, target_w) = shape + + # Resize to fully fit within `shape`. + min_ratio = min(target_h / h, target_w / w) + unpadded_h = int(round(min_ratio * h)) + unpadded_w = int(round(min_ratio * w)) + image = cv2.resize( + image, (unpadded_w, unpadded_h), interpolation=cv2.INTER_LINEAR + ) + + # Pad to be the same size as `shape`. + delta_h = (target_h - unpadded_h) / 2 + delta_w = (target_w - unpadded_w) / 2 + top, bottom = int(round(delta_h - 0.1)), int(round(delta_h + 0.1)) + left, right = int(round(delta_w - 0.1)), int(round(delta_w + 0.1)) + return cv2.copyMakeBorder( + image, + top, + bottom, + left, + right, + cv2.BORDER_CONSTANT, + value=(114, 114, 114), + ) + + +def postprocess(out0, out1, input, frame, class_names): + out0 = torch.from_numpy(out0) + out1 = torch.from_numpy(out1) + + pred = ops.non_max_suppression( + out0, + conf_thres=0.25, + iou_thres=0.70, + agnostic=False, + max_det=10, + nc=len(class_names), + classes=None, + )[0] + + if not len(pred): + result = Results( + orig_img=frame, + path="", + names=class_names, + boxes=pred[:, :6], + ) + else: + masks = ops.process_mask( + out1[0], + pred[:, 6:], + pred[:, :4], + input.shape[2:], + upsample=True, + ) # HWC + pred[:, :4] = ops.scale_boxes(input.shape[2:], pred[:, :4], frame.shape) + result = Results( + orig_img=frame, + path="", + names=class_names, + boxes=pred[:, :6], + masks=masks, + ) + return result + + +model_path = st.sidebar.text_input( + "Model Path", + os.path.join(modular_cache_dir(), "yolov8n-seg.pt"), +) +onnx_path = Path(os.path.dirname(model_path)) / "yolov8n-seg.onnx" +width = st.sidebar.number_input("Image Width", 64, 2048, 640) +height = st.sidebar.number_input("Image Height", 64, 2048, 480) + +class_names = download_and_export_yolo(model_path, height, width) +yolo = max_yolo_session(onnx_path) + +previous_elapsed_ms = [] + +frame_window = st.image([]) +camera = cv2.VideoCapture(0) + +button_placeholder = st.empty() +if button_placeholder.button("Start Webcam"): + button_placeholder.empty() + while True: + _, img = camera.read() + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = resize_and_pad(img, (height, width)) + # Preprocess inputs. + input = ( + img[np.newaxis, :, :, ::-1].transpose(0, 3, 1, 2).astype(np.float32) + / 255 + ).copy() + start = time.time() + outputs = list(yolo.execute_legacy(images=input).values()) + elapsed_ms = (time.time() - start) * 1000 + result = postprocess(outputs[0], outputs[1], input, img, class_names) + img = result.plot() + # Calculated average fps and update window title. + # global previous_elapsed_ms + previous_elapsed_ms.append(elapsed_ms) + previous_elapsed_ms = previous_elapsed_ms[-100:] + fps = 1000.0 / np.average(previous_elapsed_ms) + img = cv2.putText( + img, + f"FPS: {int(fps)}", + org=(50, 50), + fontFace=cv2.FONT_HERSHEY_COMPLEX, + fontScale=1, + color=(255, 0, 0), + thickness=2, + ) + frame_window.image(img) diff --git a/examples/gui/ragdata/mojo_functions.txt b/examples/gui/ragdata/mojo_functions.txt new file mode 100644 index 0000000000..f053dcb669 --- /dev/null +++ b/examples/gui/ragdata/mojo_functions.txt @@ -0,0 +1,28 @@ +# Mojo Functions + +Mojo functions can be declared with either fn or def. + +The fn declaration enforces type-checking and memory-safe behaviors (Rust style), while def allows no type declarations and dynamic behaviors (Python style). + +For example, this def function doesn't require declaration of argument types or the return type: + +```mojo +def greet(name): + return "Hello, " + name + "!" +``` + +While the same thing as an fn function requires that you specify the argument type and the return type like this: + +```mojo +fn greet2(name: String) -> String: + return "Hello, " + name + "!" +``` + +Both functions have the same result, but the fn function provides compile-time checks to ensure the function receives and returns the correct types. Whereas, the def function might fail at runtime if it receives the wrong type. + +Currently, Mojo doesn't support top-level code in a .mojo (or .🔥) file, so every program must include a function named main() as the entry point. You can declare it with either def or fn: + +```mojo +def main(): + print("Hello, world!") +``` diff --git a/examples/gui/shared.py b/examples/gui/shared.py new file mode 100644 index 0000000000..0f3bca2c3e --- /dev/null +++ b/examples/gui/shared.py @@ -0,0 +1,282 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +import threading +import time +from functools import wraps +from pathlib import Path +from typing import List + +import chromadb +import streamlit as st +from chromadb.config import Settings +from fastembed import TextEmbedding +from gguf import Union +from huggingface_hub import hf_hub_download, snapshot_download +from llama_index.core import SimpleDirectoryReader +from max.pipelines import TokenGenerator +from streamlit.runtime.scriptrunner import ( + add_script_run_ctx, + get_script_run_ctx, +) +from tqdm.auto import tqdm + +RAG_SYSTEM_PROMPT = """You are a helpful document search assistant. +Your task is to find an answer to user's query about their given documentation. +DO NOT HALLUCINATE.""" + +RAG_PROMPT = """Answer the users query: {query} using the provided context: {data}. +If you don't have an answer say 'I don't know!' +Make sure to include the filename of any document you use to answer the query. + +## GO""" + + +def menu(): + st.sidebar.page_link("home.py", label="️Home", icon="⚡️") + st.sidebar.page_link("pages/llama3_1.py", label="Llama3.1", icon="🦙") + st.sidebar.page_link("pages/bert.py", label="Bert", icon="👓") + st.sidebar.page_link("pages/yolo.py", label="YOLO", icon="🔍") + st.sidebar.page_link( + "pages/stable-diffusion.py", label="Stable Diffusion 1.5", icon="🎨" + ) + + +def modular_cache_dir() -> str: + cache_folder = os.getenv("XDG_CACHE_PATH", str(Path.home() / ".cache")) + modular_dir = os.path.join(cache_folder, "modular") + os.makedirs(modular_dir, exist_ok=True) + return modular_dir + + +def format_time(seconds): + """Return a pretty format based on how much time is left.""" + hours, remainder = divmod(seconds, 3600) + minutes, seconds = divmod(remainder, 60) + if hours > 0: + return f"{int(hours)}h {int(minutes)}m {int(seconds)}s" + elif minutes > 0: + return f"{int(minutes)}m {int(seconds)}s" + else: + return f"{int(seconds)}s" + + +tqdm_patched = False + + +def hf_streamlit_download(repo_id: str, filename: str = "") -> str: + """Patch tqdm to update st.progress bars, uses `hf_hub_download` if + a `repo_id` and `filename` is provided, otherwise uses `snapshot_download`. + """ + global tqdm_patched + if not tqdm_patched: + tqdm_patched = True + patch_tqdm() + + if filename: + return hf_hub_download(repo_id, filename) + + return snapshot_download(repo_id) + + +# TODO: raise patch to `huggingface_hub` to see if they'd be interested in this +# as a class that inherits from tqdm, which can be installed with +# huggingface_hub[streamlit] +def patch_tqdm(): + """Monkey patches tqdm to update st.progress bars. `hf_hub_download` and + `snapshot_download` use tqdm, so this is a way to hook into the progress + of each file download and display it on the GUI. We need to pass the + script context so other threads can communicate with the main thread, + when interacting with streamlit elements.""" + progress_bars = {} + ctx = get_script_run_ctx() + + def patch_update(original): + @wraps(original) + def wrapper(self, n=1): + # Return early if tqdm instance is describing how many files + # will be downloaded. + if self.desc.startswith("Fetching"): + return + + if self.n is not None and self.total is not None: + # Convert everything to MB + downloaded = self.n / 1024 / 1024 + total = self.total / 1024 / 1024 + speed = ( + self.format_dict["rate"] / 1024 / 1024 + if self.format_dict["rate"] + else 0.0 + ) + if speed != 0: + time_left = format_time((total - downloaded) / speed) + else: + time_left = "N/A" + # Only create/update progress bar if the download is in progress to skip small files + if time_left != "N/A": + add_script_run_ctx(threading.currentThread(), ctx) + if self.pos not in progress_bars: + progress_bars[self.pos] = st.empty() + progress_bar = progress_bars[self.pos] + status = ( + f"{self.desc}: {int(downloaded)}/{int(total)} MB Speed:" + f" {speed:.2f} MB/s Remaining: {time_left}" + ) + progress_bar.progress(downloaded / total, status) + return original(self, n) + + return wrapper + + def patch_del(original): + @wraps(original) + def wrapper(self, *args, **kwargs): + if self.pos in progress_bars: + progress_bars[self.pos].empty() + del progress_bars[self.pos] + + return original(self, *args, **kwargs) + + return wrapper + + tqdm.update = patch_update(tqdm.update) + tqdm.__del__ = patch_del(tqdm.__del__) + + +@st.cache_resource(show_spinner=False) +def load_embed_docs(docs_filenames: List[str]): + """Loads documents from `./ragdir` and embeds them to chromadb + using a text embedding model. + """ + with st.spinner("Loading RAG data..."): + docs = SimpleDirectoryReader("./ragdata").load_data() + client = chromadb.Client(Settings(anonymized_telemetry=False)) + collection = client.get_or_create_collection( + "max-rag-example", metadata={"hnsw:space": "cosine"} + ) + embedding_model = TextEmbedding() + + for i, doc in enumerate(docs): + embedding = list(embedding_model.embed(doc.text))[0].tolist() + collection.upsert( + documents=doc.text, + embeddings=embedding, + ids=[str(i)], + metadatas=[doc.metadata], + ) + + return collection, embedding_model + + +# Generate metrics for streamlit +class TextGenerationMetrics: + """Metrics capturing and reporting for a text generation pipeline.""" + + prompt_size: int + output_size: int + startup_time: Union[float, str] + time_to_first_token: Union[float, str] + prompt_eval_throughput: Union[float, str] + eval_throughput: Union[float, str] + + _start_time: float + _signposts: dict[str, float] + + def __init__(self): + self.signposts = {} + self.prompt_size = 0 + self.output_size = 0 + self.start_time = time.time() + + def signpost(self, name: str): + """Measure the current time and tag it with a name for later reporting.""" + self.signposts[name] = time.time() + + def new_token(self): + """Report that a new token has been generated.""" + self.output_size += 1 + + def calculate_results(self): + end_generation = time.time() + begin_generation = self.signposts.get("begin_generation") + if begin_generation: + self.startup_time = ( + self.signposts["begin_generation"] - self.start_time + ) * 1000.0 + else: + self.startup_time = "n/a" + + first_token = self.signposts.get("first_token") + if first_token and begin_generation: + self.time_to_first_token = ( + self.signposts["first_token"] + - self.signposts["begin_generation"] + ) * 1000.0 + else: + self.time_to_first_token = "n/a" + + st.sidebar.metric( + "Input/Output Tokens", + value=f"{self.prompt_size}/{self.output_size}", + ) + st.sidebar.metric( + "Time to first token", value=f"{self.time_to_first_token:.2f} ms" + ) + + if first_token and begin_generation: + generation_time = end_generation - self.signposts["first_token"] + assert isinstance(self.time_to_first_token, float) + self.prompt_eval_throughput = self.prompt_size / ( + self.time_to_first_token / 1000.0 + ) + self.eval_throughput = (self.output_size - 1) / generation_time + st.sidebar.metric( + "Prompt eval throughput (context-encoding):", + value=f"{self.prompt_eval_throughput:.2f} tokens/s", + ) + st.sidebar.metric( + "Eval throughput (token-generation):", + value=f"{self.eval_throughput:.2f} tokens/s", + ) + + +async def stream_output(model: TokenGenerator, prompt: str) -> str: + metrics = TextGenerationMetrics() + context = model.new_context(prompt) + prompt_size = context.current_length + + response_display = st.empty() + response_str = "" + + if metrics: + metrics.prompt_size = prompt_size + metrics.signpost("begin_generation") + + is_first_token = True + request_id = str(id(prompt)) + while True: + response = model.next_token({request_id: context}, num_steps=1)[0] + if request_id not in response: + break + response_str += response[request_id] + response_display.markdown(response_str) + if metrics: + if is_first_token: + is_first_token = False + metrics.signpost("first_token") + metrics.new_token() + if metrics: + metrics.signpost("end_generation") + + metrics.calculate_results() + return response_str diff --git a/examples/inference/README.md b/examples/inference/README.md new file mode 100644 index 0000000000..7903926872 --- /dev/null +++ b/examples/inference/README.md @@ -0,0 +1,18 @@ +# PyTorch and ONNX inference in MAX + +MAX can accelerate the inference of existing PyTorch or ONNX models. These +examples show several common PyTorch or ONNX models running in MAX through the +Mojo, Python, and C APIs: + +## PyTorch (via TorchScript) + +- BERT, [with the Mojo API](./bert-mojo-torchscript/), +[with the Python API](./bert-python-torchscript/), +and [with the C API](./bert-c-torchscript/) +- [ResNet50 with the Python API](./resnet50-python-torchscript/) + +## ONNX + +- Stable Diffusion, [with the Mojo API](./stable-diffusion-mojo-onnx/) and +[with the Python API](./stable-diffusion-python-onnx/) +- [YOLOv8 with the Python API](./yolo-python-onnx/) diff --git a/examples/inference/bert-c-torchscript/.gitignore b/examples/inference/bert-c-torchscript/.gitignore new file mode 100644 index 0000000000..2f2295c1a6 --- /dev/null +++ b/examples/inference/bert-c-torchscript/.gitignore @@ -0,0 +1,7 @@ +# Binaries generated +inputs +outputs.bin + +# Don't check in / version control the downloaded model +*.pt +*.torchscript diff --git a/examples/inference/bert-c-torchscript/CMakeLists.txt b/examples/inference/bert-c-torchscript/CMakeLists.txt new file mode 100644 index 0000000000..650f7040be --- /dev/null +++ b/examples/inference/bert-c-torchscript/CMakeLists.txt @@ -0,0 +1,22 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +cmake_minimum_required(VERSION 3.24) + +project(max-examples LANGUAGES C) + +list(APPEND CMAKE_MODULE_PATH "$ENV{MAX_PKG_DIR}/lib/cmake") +include(AddMaxEngine) + +add_executable(bert main.c) +target_link_libraries(bert PUBLIC max-engine) diff --git a/examples/inference/bert-c-torchscript/README.md b/examples/inference/bert-c-torchscript/README.md new file mode 100644 index 0000000000..f7d6f9d490 --- /dev/null +++ b/examples/inference/bert-c-torchscript/README.md @@ -0,0 +1,69 @@ +# TorchScript BERT inference with C + +This directory includes scripts used to run simple BERT inference via the MAX +Engine C API to predict the sentiment of the given text. + +## Quickstart + +For this example, you need a cmake installed on your system and a C compiler. + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +magic run bash run.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +``` + +## Scripts included + +- `pre-process.py`: Prepares an example input and saves the pre-processed input +to a local directory, for use use in the `main.c` program. Example: + + ```sh + python3 pre-process.py --text "Paris is the [MASK] of France." + ``` + +- `post-process.py`: Loads the generated output, post-processes it, and outputs +the prediction. Example: + + ```sh + python3 post-process.py + ``` + +## Building the example + +This example uses CMake. To build the executable, please use the following +commands: + +```sh +export MAX_PKG_DIR=`modular config max.path` +cmake -B build -S . +cmake --build build +``` + +The executable is called `bert` and will be present in the build directory. + +## Usage + +```sh +python3 ../common/bert-torchscript/download-model.py +python3 pre-process.py --text "Your text" +./build/bert ../../models/bert.torchscript +python3 post-process.py +``` diff --git a/examples/inference/bert-c-torchscript/environment.yml b/examples/inference/bert-c-torchscript/environment.yml new file mode 100644 index 0000000000..13c6313bfc --- /dev/null +++ b/examples/inference/bert-c-torchscript/environment.yml @@ -0,0 +1,8 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/bert-c-torchscript/main.c b/examples/inference/bert-c-torchscript/main.c new file mode 100644 index 0000000000..5c277174bc --- /dev/null +++ b/examples/inference/bert-c-torchscript/main.c @@ -0,0 +1,222 @@ +/******************************************************************************* + * Copyright (c) 2025, Modular Inc. All rights reserved. + * + * Licensed under the Apache License v2.0 with LLVM Exceptions: + * https://llvm.org/LICENSE.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +#include "max/c/common.h" +#include "max/c/context.h" +#include "max/c/model.h" +#include "max/c/pytorch/config.h" +#include "max/c/tensor.h" +#include "max/c/value.h" + +#include +#include +#include + +void logHelper(const char *level, const char *message, const char delimiter) { + printf("%s: %s%c", level, message, delimiter); +} +void logDebug(const char *message) { logHelper("DEBUG", message, ' '); } +void logInfo(const char *message) { logHelper("INFO", message, '\n'); } +void logError(const char *message) { logHelper("ERROR", message, '\n'); } + +#define CHECK(x) \ + if (M_isError(x)) { \ + logError(M_getError(x)); \ + return EXIT_FAILURE; \ + } + +// Read file at the given path. On failure abort. +char *readFileOrExit(const char *filepath) { + FILE *file; + file = fopen(filepath, "rb"); + if (!file) { + printf("failed to open %s. Aborting.\n", filepath); + abort(); + } + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); + rewind(file); + + char *buffer = (char *)malloc(fileSize * sizeof(char)); + size_t count = fread(buffer, fileSize, 1, file); + if (count != 1) { + printf("failed to read %s. Aborting.\n", filepath); + abort(); + } + fclose(file); + return buffer; +} + +int main(int argc, char **argv) { + if (argc != 2) { + printf("Usage: bert "); + return EXIT_FAILURE; + } + + M_Status *status = M_newStatus(); + + M_RuntimeConfig *runtimeConfig = M_newRuntimeConfig(); + M_RuntimeContext *context = M_newRuntimeContext(runtimeConfig, status); + CHECK(status); + + logInfo("Compiling Model"); + M_CompileConfig *compileConfig = M_newCompileConfig(); + const char *modelPath = argv[1]; + M_setModelPath(compileConfig, /*path=*/modelPath); + + logInfo("Setting InputSpecs for compilation"); + int64_t *inputIdsShape = + (int64_t *)readFileOrExit("inputs/input_ids_shape.bin"); + M_TorchInputSpec *inputIdsInputSpec = + M_newTorchInputSpec(inputIdsShape, /*dimNames=*/NULL, /*rankSize=*/2, + /*type=*/M_INT32, /*device=*/"", status); + CHECK(status); + + int64_t *attentionMaskShape = + (int64_t *)readFileOrExit("inputs/attention_mask_shape.bin"); + M_TorchInputSpec *attentionMaskInputSpec = + M_newTorchInputSpec(attentionMaskShape, /*dimNames=*/NULL, /*rankSize=*/2, + /*type=*/M_INT32, /*device=*/"", status); + CHECK(status); + + int64_t *tokenTypeIdsShape = + (int64_t *)readFileOrExit("inputs/token_type_ids_shape.bin"); + M_TorchInputSpec *tokenTypeIdsInputSpec = + M_newTorchInputSpec(tokenTypeIdsShape, /*dimNames=*/NULL, /*rankSize=*/2, + /*type=*/M_INT32, /*device=*/"", status); + CHECK(status); + + M_TorchInputSpec *inputSpecs[3] = {inputIdsInputSpec, attentionMaskInputSpec, + tokenTypeIdsInputSpec}; + M_setTorchInputSpecs(compileConfig, inputSpecs, 3); + + M_AsyncCompiledModel *compiledModel = + M_compileModel(context, &compileConfig, status); + CHECK(status); + + logInfo("Initializing Model"); + M_AsyncModel *model = + M_initModel(context, compiledModel, /*weightsRegistry=*/NULL, status); + CHECK(status); + + logInfo("Waiting for model compilation to finish"); + M_waitForModel(model, status); + CHECK(status); + + logInfo("Inspecting model metadata"); + size_t numInputs = M_getNumModelInputs(compiledModel, status); + CHECK(status); + printf("Num inputs: %ld\n", numInputs); + + M_TensorNameArray *tensorNames = M_getInputNames(compiledModel, status); + CHECK(status); + logDebug("Model input names:"); + for (size_t i = 0; i < numInputs; i++) { + const char *tensorName = M_getTensorNameAt(tensorNames, i); + printf("%s ", tensorName); + } + printf("\n"); + + logInfo("Preparing inputs..."); + M_AsyncTensorMap *inputToModel = M_newAsyncTensorMap(context); + + M_TensorSpec *inputIdsSpec = + M_newTensorSpec(inputIdsShape, /*rankSize=*/2, /*dtype=*/M_INT32, + /*tensorName=*/"input_ids"); + int32_t *inputIdsTensor = (int32_t *)readFileOrExit("inputs/input_ids.bin"); + M_borrowTensorInto(inputToModel, inputIdsTensor, inputIdsSpec, status); + CHECK(status); + + M_TensorSpec *attentionMaskSpec = + M_newTensorSpec(attentionMaskShape, /*rankSize=*/2, /*dtype=*/M_INT32, + /*tensorName=*/"attention_mask"); + int32_t *attentionMaskTensor = + (int32_t *)readFileOrExit("inputs/attention_mask.bin"); + M_borrowTensorInto(inputToModel, attentionMaskTensor, attentionMaskSpec, + status); + CHECK(status); + + M_TensorSpec *tokenTypeIdsSpec = + M_newTensorSpec(tokenTypeIdsShape, /*rankSize=*/2, /*dtype=*/M_INT32, + /*tensorName=*/"token_type_ids"); + int32_t *tokenTypeIdsTensor = + (int32_t *)readFileOrExit("inputs/token_type_ids.bin"); + M_borrowTensorInto(inputToModel, tokenTypeIdsTensor, tokenTypeIdsSpec, + status); + CHECK(status); + + logInfo("Running Inference..."); + M_AsyncTensorMap *outputs = + M_executeModelSync(context, model, inputToModel, status); + CHECK(status); + + M_AsyncValue *resultValue = + M_getValueByNameFrom(outputs, /*tensorName=*/"result0", status); + CHECK(status); + + logInfo("Extracting output values"); + // Convert the value we found to a tensor and save it to disk. + M_AsyncTensor *result = M_getTensorFromValue(resultValue); + size_t numElements = M_getTensorNumElements(result); + printf("Tensor size: %ld\n", numElements); + M_Dtype dtype = M_getTensorType(result); + const char *outputFilePath = "outputs.bin"; + FILE *file = fopen(outputFilePath, "wb"); + if (!file) { + printf("failed to open %s. Aborting.\n", outputFilePath); + return EXIT_FAILURE; + } + fwrite(M_getTensorData(result), M_sizeOf(dtype), numElements, file); + fclose(file); + + // free memory buffers + free(tokenTypeIdsTensor); + free(attentionMaskTensor); + free(inputIdsTensor); + + free(tokenTypeIdsShape); + free(attentionMaskShape); + free(inputIdsShape); + + // free resources + M_freeTensor(result); + + M_freeValue(resultValue); + + M_freeAsyncTensorMap(outputs); + + M_freeTensorSpec(tokenTypeIdsSpec); + M_freeTensorSpec(attentionMaskSpec); + M_freeTensorSpec(inputIdsSpec); + + M_freeAsyncTensorMap(inputToModel); + + M_freeTensorNameArray(tensorNames); + + M_freeModel(model); + + M_freeCompileConfig(compileConfig); + M_freeCompiledModel(compiledModel); + + M_freeTorchInputSpec(tokenTypeIdsInputSpec); + M_freeTorchInputSpec(attentionMaskInputSpec); + M_freeTorchInputSpec(inputIdsInputSpec); + + M_freeCompileConfig(compileConfig); + M_freeRuntimeContext(context); + + M_freeStatus(status); + + logInfo("Inference successfully completed"); + return EXIT_SUCCESS; +} diff --git a/examples/inference/bert-c-torchscript/pixi.toml b/examples/inference/bert-c-torchscript/pixi.toml new file mode 100644 index 0000000000..eae282bdfe --- /dev/null +++ b/examples/inference/bert-c-torchscript/pixi.toml @@ -0,0 +1,25 @@ +[project] +name = "BERT C Torchscript" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +transformers = ">=4.44.0" +numpy = "<2.0" +cmake = ">=3.24" + +# For performance, prefer pytorch over anything else. +# The linux ARM package doesn't exist there, so prefer PyPi instead. +[target.linux-64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.osx-arm64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.linux-aarch64.pypi-dependencies] +torch = "==2.5.1" +[pypi-options] +extra-index-urls = ["https://download.pytorch.org/whl/cpu"] diff --git a/examples/inference/bert-c-torchscript/post-process.py b/examples/inference/bert-c-torchscript/post-process.py new file mode 100644 index 0000000000..b5f683dd70 --- /dev/null +++ b/examples/inference/bert-c-torchscript/post-process.py @@ -0,0 +1,29 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import numpy as np +import torch + + +def post_process(): + logits = torch.from_numpy(np.fromfile("outputs.bin", dtype=np.float32)) + predictions = torch.argmax(logits, dim=-1) + + predicted_label = predictions.item() + sentiment_labels = {0: "Negative", 1: "Positive"} + print(f"Predicted sentiment: {sentiment_labels[predicted_label]}") + + +if __name__ == "__main__": + torch.set_default_device("cpu") + post_process() diff --git a/examples/inference/bert-c-torchscript/pre-process.py b/examples/inference/bert-c-torchscript/pre-process.py new file mode 100644 index 0000000000..bc1d55b322 --- /dev/null +++ b/examples/inference/bert-c-torchscript/pre-process.py @@ -0,0 +1,63 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +#!/usr/bin/env python3 + +from argparse import ArgumentParser +from pathlib import Path + +import numpy as np +from transformers import BertTokenizer + +HF_MODEL_NAME = "bert-base-uncased" + + +def main(): + parser = ArgumentParser(description="Preprocessing for BERT inputs") + parser.add_argument( + "--text", + type=str, + metavar="", + required=True, + help="Statement to classify.", + ) + + args = parser.parse_args() + + print("Generating input tensors...") + print(f'Input sentence: "{args.text}".') + + tokenizer = BertTokenizer.from_pretrained(HF_MODEL_NAME) + encoded_inputs = tokenizer(args.text, return_tensors="pt") + + print("Saving inputs to disk...") + input_dir = Path("inputs") + input_dir.mkdir(exist_ok=True) + + created_files = [] + for name, value in encoded_inputs.items(): + value = value.numpy().astype(np.int32) + filename = input_dir / name + filename = filename.with_suffix(".bin") + filename.unlink(missing_ok=True) + value.tofile(filename) + + shape = np.array(value.shape).astype(np.int64) + shape_file = input_dir / f"{name}_shape.bin" + shape.tofile(shape_file) + created_files += [str(filename), str(shape_file)] + print("Inputs saved.") + + +if __name__ == "__main__": + main() diff --git a/examples/inference/bert-c-torchscript/run.sh b/examples/inference/bert-c-torchscript/run.sh new file mode 100755 index 0000000000..046b914abb --- /dev/null +++ b/examples/inference/bert-c-torchscript/run.sh @@ -0,0 +1,50 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +set -e + +CURRENT_DIR=$(dirname "$0") +# Make sure we're running from inside the directory containing this file. +cd "$CURRENT_DIR" + +# remove the build artifacts +rm -rf build + +if [[ -n "$CONDA_PREFIX" ]]; then + # Required for the CMake build + MAX_PKG_DIR="${MAX_PKG_DIR:-$CONDA_PREFIX}" +else + echo "This script should be run with Conda. Try \`magic run run.sh\`." && false +fi + +export MAX_PKG_DIR + +MODEL_PATH="$CURRENT_DIR/../../models/bert.torchscript" + +# Example input for the model +INPUT_EXAMPLE="My dog is cute." + +# Download model from HuggingFace +python3 "$CURRENT_DIR/../common/bert-torchscript/download-model.py" -o "$MODEL_PATH" +python3 "$CURRENT_DIR/pre-process.py" --text "$INPUT_EXAMPLE" + +# Build the example +cmake -B build -S "$CURRENT_DIR" +cmake --build build + +# Run example +./build/bert "$MODEL_PATH" + +# Post process +python3 "$CURRENT_DIR/post-process.py" diff --git a/examples/inference/bert-mojo-torchscript/README.md b/examples/inference/bert-mojo-torchscript/README.md new file mode 100644 index 0000000000..436c1fdcf2 --- /dev/null +++ b/examples/inference/bert-mojo-torchscript/README.md @@ -0,0 +1,30 @@ +# TorchScript BERT inference with Mojo + +This directory includes scripts used to run simple BERT inference via the [MAX +Engine Mojo API](https://docs.modular.com/max/api/mojo/engine/) to +predict the masked words in a sentence. + +## Quickstart + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +magic run bash run.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +``` diff --git a/examples/inference/bert-mojo-torchscript/environment.yml b/examples/inference/bert-mojo-torchscript/environment.yml new file mode 100644 index 0000000000..b600eef8fc --- /dev/null +++ b/examples/inference/bert-mojo-torchscript/environment.yml @@ -0,0 +1,9 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge + - defaults +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/bert-mojo-torchscript/pixi.toml b/examples/inference/bert-mojo-torchscript/pixi.toml new file mode 100644 index 0000000000..a5c8b581f9 --- /dev/null +++ b/examples/inference/bert-mojo-torchscript/pixi.toml @@ -0,0 +1,24 @@ +[project] +name = "BERT Mojo Torchscript" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +transformers = ">=4.44.0" +numpy = "<2.0" + +# For performance, prefer pytorch over anything else. +# The linux ARM package doesn't exist there, so prefer PyPi instead. +[target.linux-64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.osx-arm64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.linux-aarch64.pypi-dependencies] +torch = "==2.5.1" +[pypi-options] +extra-index-urls = ["https://download.pytorch.org/whl/cpu"] diff --git a/examples/inference/bert-mojo-torchscript/run.sh b/examples/inference/bert-mojo-torchscript/run.sh new file mode 100755 index 0000000000..0aa4710039 --- /dev/null +++ b/examples/inference/bert-mojo-torchscript/run.sh @@ -0,0 +1,28 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +set -e + +# Example input for the model +INPUT_EXAMPLE="Paris is the [MASK] of France." + +MODEL_PATH="../../models/bert-mlm.torchscript" + +# Make sure we're running from inside the directory containing this file. +cd "$(dirname "$0")" + +# Download model from HuggingFace +python3 ../common/bert-torchscript/download-model.py -o "$MODEL_PATH" --mlm + +mojo simple_inference.🔥 "$INPUT_EXAMPLE" diff --git "a/examples/inference/bert-mojo-torchscript/simple_inference.\360\237\224\245" "b/examples/inference/bert-mojo-torchscript/simple_inference.\360\237\224\245" new file mode 100755 index 0000000000..9e9e486c18 --- /dev/null +++ "b/examples/inference/bert-mojo-torchscript/simple_inference.\360\237\224\245" @@ -0,0 +1,127 @@ +#!/usr/bin/env mojo +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.engine import InputSpec, InferenceSession, Model +from pathlib import Path +from python import Python, PythonObject +from max.tensor import Tensor, TensorSpec +import sys + + +def execute(model: Model, text: String, transformers: PythonObject) -> String: + # The model was compiled with a maximum seqlen, so read that out from the model output metadata + output_spec = model.get_model_output_metadata()[0] + max_seqlen = output_spec[1].value() + + tokenizer = transformers.AutoTokenizer.from_pretrained("bert-base-uncased") + + inputs = tokenizer( + text=text, + add_special_tokens=True, + padding="max_length", + truncation=True, + max_length=max_seqlen, + return_tensors="np", + ) + + input_ids = inputs["input_ids"] + token_type_ids = inputs["token_type_ids"] + attention_mask = inputs["attention_mask"] + + outputs = model.execute( + "input_ids", + input_ids, + "token_type_ids", + token_type_ids, + "attention_mask", + attention_mask, + ) + + logits = outputs.get[DType.float32]("result0") + + mask_idx = -1 + for i in range(len(input_ids[0])): + if input_ids[0][i] == tokenizer.mask_token_id: + mask_idx = i + + predicted_token_id = argmax(logits)[mask_idx] + return String( + tokenizer.decode( + predicted_token_id, + skip_special_tokens=True, + clean_up_tokenization_spaces=True, + ) + ) + + +def argmax(t: Tensor) -> List[Int]: + var res = List[Int](capacity=t.dim(1)) + for i in range(t.dim(1)): + var max_val = Scalar[t.type].MIN + var max_idx = 0 + for j in range(t.dim(2)): + if t[0, i, j] > max_val: + max_val = t[0, i, j] + max_idx = j + res.append(max_idx) + return res + + +def load_model(session: InferenceSession) -> Model: + batch = 1 + seqlen = 128 + + input_ids_spec = TensorSpec(DType.int64, batch, seqlen) + token_type_ids_spec = TensorSpec(DType.int64, batch, seqlen) + attention_mask_spec = TensorSpec(DType.int64, batch, seqlen) + input_specs = List[InputSpec]() + + input_specs.append(input_ids_spec) + input_specs.append(attention_mask_spec) + input_specs.append(token_type_ids_spec) + + model = session.load( + Path("../../models/bert-mlm.torchscript"), input_specs=input_specs + ) + + return model + + +def read_input() -> String: + USAGE = ( + 'Usage: ./run.mojo \n\t e.g., ./run.mojo "Paris is the [MASK] of' + ' France"' + ) + + argv = sys.argv() + if len(argv) != 2: + raise Error("\nPlease enter a prompt." + "\n" + USAGE) + + return String(sys.argv()[1]) + + +def main(): + # Import HF Transformers dependency (for the tokenizer) + transformers = Python.import_module("transformers") + + # Read user prompt, create an InferenceSession, and load the model + text = read_input() + session = InferenceSession() + model = load_model(session) + + # Run inference + decoded_result = execute(model, text, transformers) + + print("input text: ", text) + print("filled mask: ", text.replace("[MASK]", decoded_result)) diff --git a/examples/inference/bert-python-torchscript/.gitignore b/examples/inference/bert-python-torchscript/.gitignore new file mode 100644 index 0000000000..2c785ab505 --- /dev/null +++ b/examples/inference/bert-python-torchscript/.gitignore @@ -0,0 +1 @@ +model-repository/ diff --git a/examples/inference/bert-python-torchscript/README.md b/examples/inference/bert-python-torchscript/README.md new file mode 100644 index 0000000000..325e2a64d7 --- /dev/null +++ b/examples/inference/bert-python-torchscript/README.md @@ -0,0 +1,47 @@ +# TorchScript BERT inference with Python + +This directory includes scripts used to run simple BERT inference via the MAX +Engine Python API to predict the masked words in a sentence. + +## Quickstart + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +# Run the MAX Engine example +magic run bash run.sh +# Run the MAX Serving example +magic run bash deploy.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +# Run the MAX Serving example +conda run -n max-repo --live-stream bash deploy.sh +``` + +## Scripts included + +- `simple-inference.py`: Predicts the masked words in the input text using the +MAX Engine Python API. The script prepares an example input, executes the +model, and generates the filled mask. + + You can use the `--text` CLI flag to specify an input sentence. + For example: + + ```sh + python3 simple-inference.py --text "Paris is the [MASK] of France." + ``` diff --git a/examples/inference/bert-python-torchscript/environment.yml b/examples/inference/bert-python-torchscript/environment.yml new file mode 100644 index 0000000000..13c6313bfc --- /dev/null +++ b/examples/inference/bert-python-torchscript/environment.yml @@ -0,0 +1,8 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/bert-python-torchscript/pixi.toml b/examples/inference/bert-python-torchscript/pixi.toml new file mode 100644 index 0000000000..49912bf471 --- /dev/null +++ b/examples/inference/bert-python-torchscript/pixi.toml @@ -0,0 +1,24 @@ +[project] +name = "BERT Python Torchscript" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +numpy = "<2.0" +transformers = ">=4.44.0" + +# For performance, prefer pytorch over anything else. +# The linux ARM package doesn't exist there, so prefer PyPi instead. +[target.linux-64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.osx-arm64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.linux-aarch64.pypi-dependencies] +torch = "==2.5.1" +[pypi-options] +extra-index-urls = ["https://download.pytorch.org/whl/cpu"] diff --git a/examples/inference/bert-python-torchscript/run.sh b/examples/inference/bert-python-torchscript/run.sh new file mode 100755 index 0000000000..6e175dddc0 --- /dev/null +++ b/examples/inference/bert-python-torchscript/run.sh @@ -0,0 +1,28 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +set -ex + +# Example input for the model +INPUT_EXAMPLE="Paris is the [MASK] of France." + +MODEL_PATH="../../models/bert-mlm.torchscript" + +# Make sure we're running from inside the directory containing this file. +cd "$(dirname "$0")" + +# Download model from HuggingFace +python3 ../common/bert-torchscript/download-model.py -o "$MODEL_PATH" --mlm + +python3 simple-inference.py --text "$INPUT_EXAMPLE" --model-path "$MODEL_PATH" diff --git a/examples/inference/bert-python-torchscript/simple-inference.py b/examples/inference/bert-python-torchscript/simple-inference.py new file mode 100644 index 0000000000..6f69632558 --- /dev/null +++ b/examples/inference/bert-python-torchscript/simple-inference.py @@ -0,0 +1,105 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# suppress extraneous logging +import os +import platform +import signal +from argparse import ArgumentParser + +import torch +from max import engine +from max.dtype import DType +from transformers import BertTokenizer + +os.environ["TRANSFORMERS_VERBOSITY"] = "critical" +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +BATCH = 1 +SEQLEN = 128 +DEFAULT_MODEL_PATH = "../../models/bert-mlm.torchscript" +DESCRIPTION = "BERT model" +HF_MODEL_NAME = "bert-base-uncased" + + +def execute(model_path, text, input_dict): + session = engine.InferenceSession() + input_spec_list = [ + engine.TorchInputSpec(shape=tensor.size(), dtype=DType.int64) + for tensor in input_dict.values() + ] + model = session.load(model_path, input_specs=input_spec_list) + tokenizer = BertTokenizer.from_pretrained(HF_MODEL_NAME) + print("Processing input...") + inputs = tokenizer( + text, + return_tensors="pt", + padding="max_length", + truncation=True, + max_length=SEQLEN, + ) + print("Input processed.\n") + masked_index = (inputs["input_ids"] == tokenizer.mask_token_id).nonzero( + as_tuple=True + )[1] + outputs = model.execute_legacy(**inputs)["result0"] + logits = torch.from_numpy(outputs[0, masked_index, :]) + predicted_token_id = logits.argmax(dim=-1) + predicted_tokens = tokenizer.decode( + [predicted_token_id], + skip_special_tokens=True, + clean_up_tokenization_spaces=True, + ) + return predicted_tokens + + +def main(): + # Parse args + parser = ArgumentParser(description=DESCRIPTION) + parser.add_argument( + "--text", + type=str, + metavar="", + required=True, + help="Masked language model.", + ) + parser.add_argument( + "--model-path", + type=str, + default=DEFAULT_MODEL_PATH, + help="Directory for the downloaded model.", + ) + args = parser.parse_args() + + # Improves model compilation speed dramatically on intel CPUs + if "Intel" in platform.processor(): + os.environ["OMP_NUM_THREADS"] = "1" + os.environ["MKL_NUM_THREADS"] = "1" + + signal.signal(signal.SIGINT, signal.SIG_DFL) + + torch.set_default_device("cpu") + input_dict = { + "input_ids": torch.zeros((BATCH, SEQLEN), dtype=torch.int64), + "attention_mask": torch.zeros((BATCH, SEQLEN), dtype=torch.int64), + "token_type_ids": torch.zeros((BATCH, SEQLEN), dtype=torch.int64), + } + + outputs = execute(args.model_path, args.text, input_dict) + # Get the predictions for the masked token + print(f"input text: {args.text}") + print(f"filled mask: {args.text.replace('[MASK]', outputs)}") + + +if __name__ == "__main__": + main() diff --git a/examples/inference/common/bert-torchscript/download-model.py b/examples/inference/common/bert-torchscript/download-model.py new file mode 100644 index 0000000000..d72f9f7350 --- /dev/null +++ b/examples/inference/common/bert-torchscript/download-model.py @@ -0,0 +1,91 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os + +# suppress extraneous logging +os.environ["TRANSFORMERS_VERBOSITY"] = "critical" +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +from argparse import ArgumentParser +from pathlib import Path + +import torch +from transformers import ( + AutoModelForSequenceClassification, + BertForMaskedLM, + logging, +) + +HF_MODEL_NAME = "bert-base-uncased" +DEFAULT_MODEL_PATH = "../../models/bert-mlm.torchscript" + + +def main(): + parser = ArgumentParser(description="Download model for inference.") + parser.add_argument( + "--mlm", + action="store_true", + help="Whether to use the Bert's Masked Language Model variant", + ) + parser.add_argument( + "--output-path", + "-o", + type=str, + help="Location to save the model", + default=DEFAULT_MODEL_PATH, + ) + + args = parser.parse_args() + + torch.set_default_device("cpu") + + model_path = Path(args.output_path) + + print("Downloading model...") + logging.set_verbosity_error() # Disable warning suggesting to train the model + if args.mlm: + model = BertForMaskedLM.from_pretrained(HF_MODEL_NAME) + else: + model = AutoModelForSequenceClassification.from_pretrained( + HF_MODEL_NAME + ) + + model.eval() + # We set return_dict to False to return Tensors directly + model.config.return_dict = False + + print("Saving model in TorchScript format...") + model_path = Path(args.output_path) + if model_path.exists(): + print(f"'{args.output_path}' already exists.\n") + else: + print("Converting the model to TorchScript format...") + batch = 1 + seqlen = 128 + inputs = { + "input_ids": torch.zeros((batch, seqlen), dtype=torch.int64), + "attention_mask": torch.zeros((batch, seqlen), dtype=torch.int64), + "token_type_ids": torch.zeros((batch, seqlen), dtype=torch.int64), + } + with torch.no_grad(): + traced_model = torch.jit.trace( + model, example_kwarg_inputs=dict(inputs), strict=False + ) + + torch.jit.save(traced_model, model_path) + print("Model saved.") + + +if __name__ == "__main__": + main() diff --git a/examples/inference/resnet50-python-torchscript/.gitignore b/examples/inference/resnet50-python-torchscript/.gitignore new file mode 100644 index 0000000000..2c785ab505 --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/.gitignore @@ -0,0 +1 @@ +model-repository/ diff --git a/examples/inference/resnet50-python-torchscript/README.md b/examples/inference/resnet50-python-torchscript/README.md new file mode 100644 index 0000000000..c72dcc3561 --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/README.md @@ -0,0 +1,50 @@ +# TorchScript ResNet-50 inference with Python + +This directory includes scripts used to run simple ResNet-50 inference via the +MAX Engine Python API to classify an input image. In this case, we use an image +of a leatherback turtle as an example. + +## Quickstart + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +magic run bash run.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +``` + +## Scripts included + +- `download-model.py`: Downloads the model from HuggingFace, converts it to +TorchScript, and saves it to an output directory of your choosing, or defaults +to `../../models/resnet50.torchscript`. + + For more information about the model, please refer to the + [model card](https://huggingface.co/microsoft/resnet-50). + +- `simple-inference.py`: Classifies example input image using MAX Engine. +The script prepares an example input, executes the model, and generates the +resultant classification output. + + You can use the `--input` CLI flag to specify an input example. + For example: + + ```sh + python3 simple-inference.py --input= + ``` diff --git a/examples/inference/resnet50-python-torchscript/download-model.py b/examples/inference/resnet50-python-torchscript/download-model.py new file mode 100644 index 0000000000..b93669138a --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/download-model.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from argparse import ArgumentParser + +# suppress extraneous logging +os.environ["TRANSFORMERS_VERBOSITY"] = "critical" + +from pathlib import Path + +import torch +from transformers import ResNetForImageClassification + +DEFAULT_MODEL_PATH = "../../models/resnet50.torchscript" +DESCRIPTION = "Download a ResNet-50 model." +HF_MODEL_NAME = "microsoft/resnet-50" + + +def main(): + # Parse args + parser = ArgumentParser(description=DESCRIPTION) + parser.add_argument( + "-o", + "--output-path", + type=str, + default=DEFAULT_MODEL_PATH, + help="Location to save the model.", + ) + args = parser.parse_args() + + torch.set_default_device("cpu") + + print("Downloading model...") + model = ResNetForImageClassification.from_pretrained(HF_MODEL_NAME) + model.eval() + # We set return_dict to False to return Tensors directly + model.config.return_dict = False + + print("Saving model in TorchScript format...") + model_path = Path(args.output_path) + if model_path.exists(): + print(f"'{args.output_path}' already exists.\n") + else: + print("Converting the model to TorchScript format...") + input_batch = torch.zeros((1, 3, 224, 224), dtype=torch.float32) + with torch.no_grad(): + traced_model = torch.jit.trace(model, input_batch) + + torch.jit.save(traced_model, model_path) + print(f"Model saved to {args.output_path}.\n") + + +if __name__ == "__main__": + main() diff --git a/examples/inference/resnet50-python-torchscript/environment.yml b/examples/inference/resnet50-python-torchscript/environment.yml new file mode 100644 index 0000000000..b600eef8fc --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/environment.yml @@ -0,0 +1,9 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge + - defaults +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/resnet50-python-torchscript/input/leatherback_turtle.jpg b/examples/inference/resnet50-python-torchscript/input/leatherback_turtle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82a4a5e6a118a981ee3b884654677e5b97f13dad GIT binary patch literal 364047 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 z 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%0D)CK$d#&7Ue%mT-`w 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

ViUyk40qeiN# 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

Z#mVW^8P7j@c7cq6D_GN~ts$ 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

5fCu~i!?2FF6)N7nE{xt_@4 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

M@PcPNo|`fuBz@vrpi zV%o@27b#D;ZrQH&vrytCmQ zH-ri5tbQBRQV81t{{Yd~p1a7&BfPdQR;+21j=ZuXv{R~v+cQqk1aG7R%C@j zo-%VjNgD8@$Di%gDJ{@=@lnP0>4+})^YYEj~6s;C)~$jk~pE_ba;`-hB^TJ>>jv+sTE+j6~?PH zb3~G~&>H+nP{o@=e>?f>tnN0hT03;|6&{u*ENS806c3TFcaI%KX6&qJ8{C+zyJ1K8Yq%lpT99WJ zd-r_?zb&e2p^Q+6-vUn+*auoV`RYV(+IA!EzU1xsvA1cd{{WqQen-?;tw4i9R8y$t z0klwg_}JO#j!sY0JCqnoZk@p^%otEJme>68f`F z10iVJ#A8HkpCtTs2Rkhqbn@Ap`$t*(dZmdjUz)?PhB7~Q&$+^@06dR@)rz$nvd;p| zC3`lciS10Wph#NOawn&{j@XTYzS60k|2PgHQ!Q~X&919k^4y3=0vNL zNMn$TqU@TxdL@ZtO7XHX%PfHJWt|R@eCd8VH+CBk=h)`4)vQlpgJbegtGd^X6uX?IV#g-RjJ2C20kfFi!^K^$5Vl1feI

syMt$qh`CLRUj%Y@O(I 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 ZrZnsNzia#bCFT3SopqXR3i~H#|JhfAzlHz+ literal 0 HcmV?d00001 diff --git a/examples/inference/resnet50-python-torchscript/pixi.toml b/examples/inference/resnet50-python-torchscript/pixi.toml new file mode 100644 index 0000000000..8d3f09c09c --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/pixi.toml @@ -0,0 +1,26 @@ +[project] +name = "Resnet50 Python Torchscript" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +networkx = "==3.1" +transformers = ">=4.44.0" +pillow = ">=10.3.0" +numpy = "<2.0" + +# For performance, prefer pytorch over anything else. +# The linux ARM package doesn't exist there, so prefer PyPi instead. +[target.linux-64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.osx-arm64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.linux-aarch64.pypi-dependencies] +torch = "==2.5.1" +[pypi-options] +extra-index-urls = ["https://download.pytorch.org/whl/cpu"] diff --git a/examples/inference/resnet50-python-torchscript/run.sh b/examples/inference/resnet50-python-torchscript/run.sh new file mode 100755 index 0000000000..c31d2eeb60 --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/run.sh @@ -0,0 +1,28 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +set -ex + +# Example input for the model +INPUT_EXAMPLE="input/leatherback_turtle.jpg" + +MODEL_PATH="../../models/resnet50.torchscript" + +# Make sure we're running from inside the directory containing this file. +cd "$(dirname "$0")" + +# Download model from HuggingFace +python3 download-model.py -o "$MODEL_PATH" + +python3 simple-inference.py --input "$INPUT_EXAMPLE" --model-path "$MODEL_PATH" diff --git a/examples/inference/resnet50-python-torchscript/simple-inference.py b/examples/inference/resnet50-python-torchscript/simple-inference.py new file mode 100644 index 0000000000..572ad10bf5 --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/simple-inference.py @@ -0,0 +1,98 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# suppress extraneous logging +import os +import platform +import signal +from argparse import ArgumentParser + +import numpy as np +from max import engine +from max.dtype import DType +from PIL import Image +from transformers import AutoImageProcessor, AutoModelForImageClassification + +os.environ["TRANSFORMERS_VERBOSITY"] = "critical" +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +DEFAULT_MODEL_PATH = "../../models/resnet50.torchscript" +DESCRIPTION = "Classify an input image." +HF_MODEL_NAME = "microsoft/resnet-50" + + +def execute(model_path, inputs): + session = engine.InferenceSession() + input_spec_list = [ + engine.TorchInputSpec(shape=(1, 3, 224, 224), dtype=DType.float32) + ] + + print("Loading and compiling model...") + model = session.load(model_path, input_specs=input_spec_list) + print("Model compiled.\n") + + print("Executing model...") + outputs = model.execute_legacy(pixel_values=inputs["pixel_values"]) + print("Model executed.\n") + return outputs + + +def main(): + # Parse args + parser = ArgumentParser(description=DESCRIPTION) + parser.add_argument( + "--input", + type=str, + metavar="", + required=True, + help="Path to input image.", + ) + parser.add_argument( + "--model-path", + type=str, + default=DEFAULT_MODEL_PATH, + help="Location of the downloaded model.", + ) + args = parser.parse_args() + + # Improves model compilation speed dramatically on intel CPUs + if "Intel" in platform.processor(): + os.environ["OMP_NUM_THREADS"] = "1" + os.environ["MKL_NUM_THREADS"] = "1" + + signal.signal(signal.SIGINT, signal.SIG_DFL) + + # Preprocess input image + print("Processing input...") + image = Image.open(args.input) + processor = AutoImageProcessor.from_pretrained(HF_MODEL_NAME) + inputs = processor(images=image, return_tensors="np") + print("Input processed.\n") + + # Classify input image + outputs = execute(args.model_path, inputs) + + # Extract class predictions from output + print("Extracting class from outputs...") + predicted_label = np.argmax(outputs["result0"], axis=-1)[0] + model = AutoModelForImageClassification.from_pretrained(HF_MODEL_NAME) + predicted_class = model.config.id2label[predicted_label] + + print( + "\nThe input image is likely one of the following classes:" + f" \n{predicted_class}" + ) + + +if __name__ == "__main__": + main() diff --git a/examples/inference/stable-diffusion-mojo-onnx/.gitignore b/examples/inference/stable-diffusion-mojo-onnx/.gitignore new file mode 100644 index 0000000000..593cb73472 --- /dev/null +++ b/examples/inference/stable-diffusion-mojo-onnx/.gitignore @@ -0,0 +1 @@ +output.png diff --git a/examples/inference/stable-diffusion-mojo-onnx/README.md b/examples/inference/stable-diffusion-mojo-onnx/README.md new file mode 100644 index 0000000000..e8eee6302f --- /dev/null +++ b/examples/inference/stable-diffusion-mojo-onnx/README.md @@ -0,0 +1,51 @@ +# Stable Diffusion inference with Mojo + +This directory illustrates how to run Stable Diffusion through MAX Engine. +Specifically, this example extracts StableDiffusion-1.5 from Hugging Face and executes +it via the MAX Engine Mojo API. + +## Quickstart + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +magic run bash run.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +``` + +## Custom Images + +Getting started with your own creative prompts is as simple as: + +```sh +./text_to_image.🔥 --prompt "my image description" -o my-image.png +``` + +But of course, there are some additional settings that can be tweaked for more +fine-grained control over image output. See `./text_to_image.🔥 --help` for +details. + +## Files + +- `download-model.py`: Downloads [runwayml/stable-diffusion-v1-5 +](https://huggingface.co/runwayml/stable-diffusion-v1-5) +and exports it as ONNX. + +- `text_to_image.🔥`: Example program that runs full stable-diffusion pipeline +through MAX Engine in order to generate images from the given prompt. diff --git a/examples/inference/stable-diffusion-mojo-onnx/environment.yml b/examples/inference/stable-diffusion-mojo-onnx/environment.yml new file mode 100644 index 0000000000..13c6313bfc --- /dev/null +++ b/examples/inference/stable-diffusion-mojo-onnx/environment.yml @@ -0,0 +1,8 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/stable-diffusion-mojo-onnx/pixi.toml b/examples/inference/stable-diffusion-mojo-onnx/pixi.toml new file mode 100644 index 0000000000..9af82f125a --- /dev/null +++ b/examples/inference/stable-diffusion-mojo-onnx/pixi.toml @@ -0,0 +1,26 @@ +[project] +name = "Stable Diffusion Mojo Onnx" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +transformers = ">=4.44.0" +huggingface_hub = ">=0.24.6,<0.25" +pillow = "==10.3.0" +numpy = "<2.0" + +# For performance, prefer pytorch over anything else. +# The linux ARM package doesn't exist there, so prefer PyPi instead. +[target.linux-64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.osx-arm64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +[target.linux-aarch64.pypi-dependencies] +torch = "==2.5.1" +[pypi-options] +extra-index-urls = ["https://download.pytorch.org/whl/cpu"] diff --git "a/examples/inference/stable-diffusion-mojo-onnx/python_utils.\360\237\224\245" "b/examples/inference/stable-diffusion-mojo-onnx/python_utils.\360\237\224\245" new file mode 100644 index 0000000000..9303072f1a --- /dev/null +++ "b/examples/inference/stable-diffusion-mojo-onnx/python_utils.\360\237\224\245" @@ -0,0 +1,91 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from python import Python, PythonObject +from memory import memcpy, UnsafePointer +from collections import List + +from max.tensor import Tensor, TensorShape + + +@always_inline +fn numpy_data_pointer[ + type: DType +](numpy_array: PythonObject) raises -> UnsafePointer[Scalar[type]]: + return numpy_array.__array_interface__["data"][0].unsafe_get_as_pointer[ + type + ]() + + +@always_inline +fn memcpy_to_numpy[ + type: DType +](array: PythonObject, tensor: Tensor[type]) raises: + var dst = numpy_data_pointer[type](array) + var src = tensor._ptr + var length = tensor.num_elements() + memcpy(dst.address, src.address, length) + + +@always_inline +fn memcpy_from_numpy[ + type: DType +](array: PythonObject, tensor: Tensor[type]) raises: + var src = numpy_data_pointer[type](array) + var dst = tensor._ptr + var length = tensor.num_elements() + memcpy(dst.address, src.address, length) + + +@always_inline +fn shape_to_python_list(shape: TensorShape) raises -> PythonObject: + var python_list = Python.evaluate("list()") + for i in range(shape.rank()): + _ = python_list.append(shape[i]) + return python_list^ + + +@always_inline +fn get_np_dtype[type: DType](np: PythonObject) raises -> PythonObject: + @parameter + if type is DType.float32: + return np.float32 + elif type is DType.int32: + return np.int32 + elif type is DType.int64: + return np.int64 + elif type is DType.uint8: + return np.uint8 + + raise "Unknown datatype" + + +@always_inline +fn tensor_to_numpy[ + type: DType +](tensor: Tensor[type], np: PythonObject) raises -> PythonObject: + var shape = shape_to_python_list(tensor.shape()) + var tensor_as_numpy = np.zeros(shape, get_np_dtype[type](np)) + memcpy_to_numpy(tensor_as_numpy, tensor) + return tensor_as_numpy^ + + +@always_inline +fn numpy_to_tensor[type: DType](array: PythonObject) raises -> Tensor[type]: + var shape = List[Int]() + var array_shape = array.shape + for dim in array_shape: + shape.append(dim) + var out = Tensor[type](shape) + memcpy_from_numpy(array, out) + return out^ diff --git a/examples/inference/stable-diffusion-mojo-onnx/run.sh b/examples/inference/stable-diffusion-mojo-onnx/run.sh new file mode 100755 index 0000000000..9a89ecfb28 --- /dev/null +++ b/examples/inference/stable-diffusion-mojo-onnx/run.sh @@ -0,0 +1,26 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +# If anything goes wrong, stop running the script. +set -e + +NPROMPT="bad anatomy, looking away, looking sideways, crooked stick" +NPROMPT="$NPROMPT, stick not going through jaw, orange tongue" +PPROMPT="Cute puppy chewing on a stick" + +# Make sure we're running from inside the directory containing this file. +cd "$(dirname "$0")" + +# Execute model +mojo text_to_image.🔥 --seed 7 --num-steps 20 --prompt "$PPROMPT" --negative-prompt "$NPROMPT" diff --git "a/examples/inference/stable-diffusion-mojo-onnx/scheduler.\360\237\224\245" "b/examples/inference/stable-diffusion-mojo-onnx/scheduler.\360\237\224\245" new file mode 100644 index 0000000000..36678ef9d1 --- /dev/null +++ "b/examples/inference/stable-diffusion-mojo-onnx/scheduler.\360\237\224\245" @@ -0,0 +1,155 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# +# This code is directly ported from the hugging face diffusers library. +# +# Copyright 2024 Zhejiang University Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""A simple helper implementation of a pndm schedular for stable diffusion """ + +from max.tensor import Tensor + +alias FloatTensor = Tensor[DType.float32] + + +struct Scheduler: + alias training_steps = 1000 + alias init_noise_sigma = 1.0 + alias beta_start = 0.00085 + alias beta_end = 0.012 + + var counter: Int + var step_ratio: Int + var timesteps: List[Int] + var alphas_cumprod: List[Float32] + var previous_outputs: List[FloatTensor] + + def __init__(out self, inference_steps: Int): + self.counter = 0 + self.previous_outputs = List[FloatTensor]() + self.alphas_cumprod = List[Float32]() + + # Generate timesteps. + self.step_ratio = Self.training_steps // inference_steps + self.timesteps = List[Int]() + for i in range(1, Self.training_steps, self.step_ratio): + self.timesteps.append(i) + + self.timesteps.reverse() + + # Duplicate the second timestep because this scheduler skips the prk steps. + if len(self.timesteps) >= 2: + self.timesteps.insert(1, self.timesteps[1]) + + # Generate alpha cumulative product. + var start = Self.beta_start**0.5 + var end = Self.beta_end**0.5 + var step = (end - start) / Self.training_steps + var cumprod = 1.0 + for i in range(Self.training_steps): + var beta = start + (end - start) * (i / Self.training_steps) + var alpha = 1.0 - (beta**2) + cumprod *= alpha + self.alphas_cumprod.append(cumprod.cast[DType.float32]()) + + def step( + mut self, + model_output: FloatTensor, + timestep: Int, + sample: FloatTensor, + ) -> FloatTensor: + var previous_timestep = timestep - self.step_ratio + + if self.counter == 1: + # Special case: the second timestep is repeated. + previous_timestep = timestep + timestep = timestep + self.step_ratio + else: + # TODO: clear out old tensors. + # For some reason, doing this leads to a crash. + # self.previous_outputs = self.previous_outputs[-3:] + self.previous_outputs.append(FloatTensor(model_output)) + + averaged_output = FloatTensor(model_output) + if len(self.previous_outputs) == 1 and self.counter == 0: + # First input, there is no data to average. + pass + elif len(self.previous_outputs) == 1 and self.counter == 1: + averaged_output = ( + averaged_output + self.previous_outputs[-1] + ) / 2.0 + elif len(self.previous_outputs) == 2: + averaged_output = ( + 3 * self.previous_outputs[-1] - self.previous_outputs[-2] + ) / 2.0 + elif len(self.previous_outputs) == 3: + averaged_output = ( + 23 * self.previous_outputs[-1] + - 16 * self.previous_outputs[-2] + + 5 * self.previous_outputs[-3] + ) / 12.0 + else: + averaged_output = (1.0 / 24.0) * ( + 55 * self.previous_outputs[-1] + - 59 * self.previous_outputs[-2] + + 37 * self.previous_outputs[-3] + - 9 * self.previous_outputs[-4] + ) + + previous_sample = self._get_previous_sample( + sample, timestep, previous_timestep, averaged_output + ) + self.counter += 1 + + return previous_sample + + def _get_previous_sample( + mut self, + sample: FloatTensor, + timestep: Int, + previous_timestep: Int, + model_output: FloatTensor, + ) -> FloatTensor: + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_previous = ( + self.alphas_cumprod[previous_timestep] if previous_timestep + >= 0 else self.alphas_cumprod[0] + ) + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_previous = 1 - alpha_prod_t_previous + + sample_coeff = (alpha_prod_t_previous / alpha_prod_t) ** (0.5) + + model_output_denom_coeff = alpha_prod_t * beta_prod_t_previous ** ( + 0.5 + ) + (alpha_prod_t * beta_prod_t * alpha_prod_t_previous) ** (0.5) + + previous_sample = ( + sample_coeff * sample + - (alpha_prod_t_previous - alpha_prod_t) + * model_output + / model_output_denom_coeff + ) + return previous_sample diff --git "a/examples/inference/stable-diffusion-mojo-onnx/text_to_image.\360\237\224\245" "b/examples/inference/stable-diffusion-mojo-onnx/text_to_image.\360\237\224\245" new file mode 100755 index 0000000000..8f78f144dc --- /dev/null +++ "b/examples/inference/stable-diffusion-mojo-onnx/text_to_image.\360\237\224\245" @@ -0,0 +1,223 @@ +#!/usr/bin/env mojo +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import sys +import random +import os +from pathlib import Path + +from collections import List +from memory import memcpy +from python import Python +from random import seed + +from max.engine import InferenceSession +from max.tensor import Tensor, TensorShape, TensorSpec + +# Local Mojo imports +import python_utils +from scheduler import Scheduler + + +var GUIDANCE_SCALE_FACTOR = Float32(7.5) +var LATENT_SCALE_FACTOR = Float32(0.18215) +var OUTPUT_HEIGHT = 512 +var OUTPUT_WIDTH = 512 +var LATENT_WIDTH = OUTPUT_WIDTH // 8 +var LATENT_HEIGHT = OUTPUT_HEIGHT // 8 +var LATENT_CHANNELS = 4 + + +def vstack[dtype: DType](a: Tensor[dtype], b: Tensor[dtype]) -> Tensor[dtype]: + """Concatenate tensors a & b along the outermost dimension.""" + # Generate return shape. + out_shape = List[Int]() + out_shape.append(a.shape()[0] + b.shape()[0]) + for i in range(1, a.shape().rank()): + out_shape.append(a.shape()[i]) + + # Allocate return tensor. + out = Tensor[dtype](TensorShape(out_shape)) + + # Fill data. + memcpy(out.unsafe_ptr().address, a.unsafe_ptr().address, a.num_elements()) + memcpy( + (out.unsafe_ptr() + a.num_elements()).address, + b.unsafe_ptr().address, + b.num_elements(), + ) + return out + + +def split[dtype: DType](x: Tensor[dtype], i: Int) -> Tensor[dtype]: + """Return the ith slice of the outermost dim; i.e., x[idx, :, :, ..., :].""" + # Generate return shape + shape = List[Int]() + shape.append(1) + for i in range(1, x.shape().rank()): + shape.append(x.shape()[i]) + # Allocate return tensor + ret = Tensor[dtype](TensorShape(shape)) + # Fill data + memcpy( + ret.unsafe_ptr().address, + (x.unsafe_ptr() + (x.num_elements() // 2) * i).address, + x.num_elements() // 2, + ) + return ret + + +def main(): + # Parse args. + USAGE = ( + "Usage: ./text_to_image.🔥 --prompt [--negative-prompt ]" + " [--num-steps ] [--seed ] [-o ]" + ) + + argv = sys.argv() + if len(argv) % 2 == 0: + print(USAGE) + raise Error("All options require an argument") + + # Set default values + seed() + prompt = String("") + negative_prompt = String("") + num_steps = 25 + hf = Python.import_module("huggingface_hub") + model_dir = Path( + String(hf.snapshot_download("modularai/stable-diffusion-1.5-onnx")) + ) + output = String("output.png") + + for i in range(1, len(argv), 2): + if argv[i] == "--prompt": + prompt = String(argv[i + 1]) + elif argv[i] == "--negative-prompt": + negative_prompt = String(argv[i + 1]) + elif argv[i] == "--num-steps": + num_steps = atol(argv[i + 1]) + elif argv[i] == "--seed": + seed(atol(argv[i + 1])) + elif argv[i] == "-o" or argv[i] == "--output": + output = String(argv[i + 1]) + else: + print(USAGE) + raise Error(String("Unknown option: ") + argv[i]) + + # Only required arg is --prompt + if prompt == "": + print(USAGE) + raise Error("--prompt option is required") + + # Import python modules. + np = Python.import_module("numpy") + Image = Python.import_module("PIL.Image") + transformers = Python.import_module("transformers") + + # Compile & load models - this may take a few minutes. + print("Loading and compiling models...") + session = InferenceSession() + txt_encoder = session.load(model_dir / "text_encoder" / "model.onnx") + img_decoder = session.load(model_dir / "vae_decoder" / "model.onnx") + img_diffuser = session.load(model_dir / "unet" / "model.onnx") + print("Models compiled.\n") + + # Tokenize inputs and run through text encoder. + print("Processing input...") + tokenizer = transformers.CLIPTokenizer.from_pretrained( + os.path.join(model_dir.path, "tokenizer") + ) + max_length = Int(tokenizer.model_max_length) + prompt_p = tokenizer(prompt, padding="max_length", max_length=max_length) + prompt_n = tokenizer( + negative_prompt, padding="max_length", max_length=max_length + ) + + prompt_p_tensor = python_utils.numpy_to_tensor[DType.int32]( + np.array(prompt_p["input_ids"], dtype=np.int32) + ) + prompt_n_tensor = python_utils.numpy_to_tensor[DType.int32]( + np.array(prompt_n["input_ids"], dtype=np.int32) + ) + + input_ids = vstack[DType.int32]( + prompt_p_tensor.reshape(TensorShape(1, max_length)), + prompt_n_tensor.reshape(TensorShape(1, max_length)), + ) + + encoder_output = txt_encoder.execute("input_ids", input_ids) + encoder_hidden_states = encoder_output.get[DType.float32]( + "last_hidden_state" + ) + print("Input processed.\n") + + # Initialize latent. + print("Initializing latent...") + + schedule = Scheduler(num_steps) + + # Note: For onnx, shapes are given in NCHW format. + latent = ( + Tensor[DType.float32].randn( + TensorShape(1, LATENT_CHANNELS, LATENT_HEIGHT, LATENT_WIDTH) + ) + * Scheduler.init_noise_sigma + ) + + # Loop through diffusion model. + for i in range(len(schedule.timesteps)): + print("\rGenerating image:", i, "/", num_steps, end="") + + # Duplicate latent to create full sample. + sample = vstack(latent, latent) + + # Execute the diffusion model with bs=2. Both batches have same primary input and + # timestep, but the encoder_hidden_states (primary prompt vs negative) differs. + timestep_tensor = Tensor[DType.int64](TensorSpec(DType.int64, 1)) + timestep_tensor[0] = Int(schedule.timesteps[i]) + + diffuser_output = img_diffuser.execute( + "sample", + sample, + "encoder_hidden_states", + encoder_hidden_states, + "timestep", + timestep_tensor, + ) + + noise_pred = diffuser_output.get[DType.float32]("out_sample") + + # Merge conditioned & unconditioned outputs. + noise_pred_text = split[DType.float32](noise_pred, 0) + noise_pred_uncond = split[DType.float32](noise_pred, 1) + noise_pred = noise_pred_uncond + GUIDANCE_SCALE_FACTOR * ( + noise_pred_text - noise_pred_uncond + ) + + # Merge latent with previous iteration. + latent = schedule.step(noise_pred, schedule.timesteps[i], latent) + + # Decode finalized latent. + print("\n\nDecoding image...") + latent = latent * (1 / LATENT_SCALE_FACTOR) + + decoder_output = img_decoder.execute("latent_sample", latent) + decoded = decoder_output.get[DType.float32]("sample") + + image = ((decoded / 2.0 + 0.5).clip(0, 1) * 255.0).astype[DType.uint8]() + np_pixels = python_utils.tensor_to_numpy[DType.uint8](image, np) + np_pixels = np_pixels.squeeze().transpose(1, 2, 0) + Image.fromarray(np_pixels, "RGB").save(output) + print("Image saved to " + output + ".") diff --git a/examples/inference/stable-diffusion-python-onnx/.gitignore b/examples/inference/stable-diffusion-python-onnx/.gitignore new file mode 100644 index 0000000000..593cb73472 --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/.gitignore @@ -0,0 +1 @@ +output.png diff --git a/examples/inference/stable-diffusion-python-onnx/README.md b/examples/inference/stable-diffusion-python-onnx/README.md new file mode 100644 index 0000000000..a96732bcde --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/README.md @@ -0,0 +1,51 @@ +# Stable Diffusion inference with Python + +This directory illustrates how to run Stable Diffusion through MAX Engine. +Specifically, this example extracts StableDiffusion-1.5 from Hugging Face and executes +it via the MAX Engine Python API. + +## Quickstart + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +magic run bash run.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +``` + +## Custom Images + +Getting started with your own creative prompts is as simple as: + +```sh +./text_to_image.py --prompt "my image description" -o my-image.png +``` + +But of course, there are some additional settings that can be tweaked for more +fine-grained control over image output. See `./text_to_image.py --help` for +details. + +## Files + +- `download-model.py`: Downloads [runwayml/stable-diffusion-v1-5 +](https://huggingface.co/runwayml/stable-diffusion-v1-5) +and exports it as ONNX. + +- `text_to_image.py`: Example program that runs full stable-diffusion pipeline +through MAX Engine in order to generate images from the given prompt. diff --git a/examples/inference/stable-diffusion-python-onnx/environment.yml b/examples/inference/stable-diffusion-python-onnx/environment.yml new file mode 100644 index 0000000000..13c6313bfc --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/environment.yml @@ -0,0 +1,8 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/stable-diffusion-python-onnx/pixi.toml b/examples/inference/stable-diffusion-python-onnx/pixi.toml new file mode 100644 index 0000000000..b6f5be2a07 --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/pixi.toml @@ -0,0 +1,29 @@ +[project] +name = "Stable Diffusion Python Onnx" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +transformers = ">=4.44.0" +huggingface_hub = ">=0.24.6,<0.25" +pillow = "==10.3.0" +numpy = "<2.0" + +# For performance, prefer pytorch over anything else. +# The linux ARM package doesn't exist there, so prefer PyPi instead. +[target.linux-64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +diffusers = "==0.27.2" +[target.osx-arm64.dependencies] +pytorch = {version = "==2.5.1", channel = "pytorch"} +diffusers = "==0.27.2" +[target.linux-aarch64.pypi-dependencies] +torch = "==2.5.1" +diffusers = "==0.27.2" +[pypi-options] +extra-index-urls = ["https://download.pytorch.org/whl/cpu"] diff --git a/examples/inference/stable-diffusion-python-onnx/run.sh b/examples/inference/stable-diffusion-python-onnx/run.sh new file mode 100755 index 0000000000..87a0e0566f --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/run.sh @@ -0,0 +1,27 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +# If anything goes wrong, stop running the script. +set -e + +MODEL_DIR="../../models/stable-diffusion-onnx" +NPROMPT="bad anatomy, looking away, looking sideways, crooked stick" +NPROMPT="$NPROMPT, stick not going through jaw, orange tongue" +PPROMPT="Cute puppy chewing on a stick" + +# Make sure we're running from inside the directory containing this file. +cd "$(dirname "$0")" + +# Execute model +python3 text_to_image.py --seed 7 --num-steps 20 --prompt "$PPROMPT" --negative-prompt "$NPROMPT" diff --git a/examples/inference/stable-diffusion-python-onnx/text_to_image.py b/examples/inference/stable-diffusion-python-onnx/text_to_image.py new file mode 100755 index 0000000000..b3cfbfb5ef --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/text_to_image.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import signal +import sys +from argparse import ArgumentParser +from pathlib import Path + +import numpy as np +from diffusers import PNDMScheduler +from huggingface_hub import snapshot_download +from max.engine import InferenceSession +from PIL import Image +from transformers import CLIPTokenizer + +DESCRIPTION = "Generate an image based on the given prompt." +GUIDANCE_SCALE_FACTOR = 7.5 +LATENT_SCALE_FACTOR = 0.18215 +OUTPUT_HEIGHT = 512 +OUTPUT_WIDTH = 512 +LATENT_WIDTH = OUTPUT_WIDTH // 8 +LATENT_HEIGHT = OUTPUT_HEIGHT // 8 +LATENT_CHANNELS = 4 + + +def run_stable_diffusion( + args, txt_encoder, img_decoder, img_diffuser, tokenizer, scheduler +): + # Tokenize inputs and run through text encoder. + print("Processing input...") + prompt_p = tokenizer( + args.prompt, padding="max_length", max_length=tokenizer.model_max_length + ) + prompt_n = tokenizer( + args.negative_prompt, + padding="max_length", + max_length=tokenizer.model_max_length, + ) + + input_ids = np.stack((prompt_p.input_ids, prompt_n.input_ids)).astype( + np.int32 + ) + encoder_hidden_states = txt_encoder.execute_legacy(input_ids=input_ids)[ + "last_hidden_state" + ] + print("Input processed.\n") + + # Initialize latent and scheduler. + print("Initializing latent...") + + # Note: For onnx, shapes are given in NCHW format. + latent = np.random.normal( + size=(1, LATENT_CHANNELS, LATENT_HEIGHT, LATENT_WIDTH) + ) + latent = latent * scheduler.init_noise_sigma + latent = latent.astype(np.float32) + + # Loop through diffusion model. + scheduler.set_timesteps(args.num_steps) + for i, t in enumerate(scheduler.timesteps): + print(f"\rGenerating image: {i}/{args.num_steps}", end="") + + # Duplicate input and scale based on scheduler. + sample = np.vstack((latent, latent)) + sample = scheduler.scale_model_input(sample, timestep=t) + + # Execute the diffusion model with bs=2. Both batches have same primary input and + # timestep, but the encoder_hidden_states (primary prompt vs negative) differs. + noise_pred = img_diffuser.execute_legacy( + sample=sample, + encoder_hidden_states=encoder_hidden_states, + timestep=np.array([t], dtype=np.int64), + )["out_sample"] + + # Merge conditioned & unconditioned outputs. + noise_pred_text, noise_pred_uncond = np.split(noise_pred, 2) + noise_pred = noise_pred_uncond + GUIDANCE_SCALE_FACTOR * ( + noise_pred_text - noise_pred_uncond + ) + + # Merge latent with previous iteration. + latent = scheduler.step(noise_pred, t, latent).prev_sample + + # Decode finalized latent. + print("\n\nDecoding image...") + latent = latent * (1 / LATENT_SCALE_FACTOR) + decoded = img_decoder.execute_legacy(latent_sample=latent)["sample"] + image = np.clip(decoded / 2 + 0.5, 0, 1).squeeze() + image = (image.transpose(1, 2, 0) * 255).astype(np.uint8) + Image.fromarray(image, "RGB").save(args.output) + print(f"Image saved to {args.output}.") + return + + +def parse(args): + # Parse args. + parser = ArgumentParser(description=DESCRIPTION) + parser.add_argument( + "--prompt", + type=str, + metavar="", + required=True, + help="Description of desired image.", + ) + parser.add_argument( + "--negative-prompt", + type=str, + metavar="", + default="", + help="Objects or styles to avoid in generated image.", + ) + parser.add_argument( + "--num-steps", + type=int, + metavar="", + default=25, + help="# of diffusion steps; trades-off speed vs quality", + ) + parser.add_argument( + "--seed", + type=int, + metavar="", + default=None, + help="Seed for psuedo-random number generation.", + ) + parser.add_argument( + "--output", + "-o", + type=str, + metavar="", + default="output.png", + help="Output filename.", + ) + parsed_args = parser.parse_args(args) + + signal.signal(signal.SIGINT, signal.SIG_DFL) + + # Set seed if requested. + if parsed_args.seed: + np.random.seed(parsed_args.seed) + + return parsed_args + + +def main(): + args = parse(sys.argv[1:]) + + # Compile & load models - this may take a few minutes. + session = InferenceSession() + model_dir = Path(snapshot_download("modularai/stable-diffusion-1.5-onnx")) + print("Loading and compiling models...") + txt_encoder = session.load(model_dir / "text_encoder" / "model.onnx") + img_decoder = session.load(model_dir / "vae_decoder" / "model.onnx") + img_diffuser = session.load(model_dir / "unet" / "model.onnx") + print("Models compiled.\n") + + # Instantiate tokenizer and scheduler. + tokenizer = CLIPTokenizer.from_pretrained(model_dir / "tokenizer") + scheduler = PNDMScheduler.from_pretrained(model_dir / "scheduler") + + run_stable_diffusion( + args, txt_encoder, img_decoder, img_diffuser, tokenizer, scheduler + ) + + +if __name__ == "__main__": + main() diff --git a/examples/inference/yolo-python-onnx/.gitignore b/examples/inference/yolo-python-onnx/.gitignore new file mode 100644 index 0000000000..b24b699c42 --- /dev/null +++ b/examples/inference/yolo-python-onnx/.gitignore @@ -0,0 +1 @@ +output.mp4 diff --git a/examples/inference/yolo-python-onnx/README.md b/examples/inference/yolo-python-onnx/README.md new file mode 100644 index 0000000000..2b8a14d180 --- /dev/null +++ b/examples/inference/yolo-python-onnx/README.md @@ -0,0 +1,81 @@ +# YOLOv8 Segmentation with Python + +This directory illustrates how to run YOLOv8 Segmentation through the MAX Engine. +Specifically, this example uses Ultralytics YOLO with opencv to segment images +from the webcam. + +## Quickstart + +This example will change depending on if you have a webcam or not. +If you have a webcam, the example will capture the webcam +and display a window running live segmentation. + +If you do not have a webcam, the example will segment +[a downloaded video file](https://drive.google.com/file/d/1H9abV76VohmT-J2RmDrbDhF-FCHt1Sbh/view?usp=sharing) +and generate `output.mp4`. + +### Magic instructions + +If you have [`magic`](https://docs.modular.com/magic), you can run the +following command: + +```sh +magic run bash run.sh +``` + +### Conda instructions + +Create a Conda environment, activate that environment, and install the +requirements: + +```sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Update the environment with the environment.yml file +conda env update -n max-repo -f environment.yml --prune +# Run the example +conda run -n max-repo --live-stream bash run.sh +``` + +## Note: GUI Dependencies + +The webcam version of this example depends on `opencv-python` +and its ability to render GUIs. +The dependencies for this are not always installed on linux. + +Downloading these dependencies is distro dependent. +On Ubuntu, it should be: + +```bash +apt install -y libgl1 +``` + +## Performance Comparison + +To get an idea of the performance difference between the ONNX Runtime and MAX Engine, +you can run the webcam script with/without the `--onnx` flag. + +The model execution time is printed as part of the window title. +Note, it can take a bit for the execution time to stabilize. + +MAX Engine: + +```sh +./segment.py webcam +``` + +ONNX Runtime: + +```sh +./segment.py webcam --onnx +``` + +## Files + +- `download-model.py`: Downloads YOLOv8n-seg from +[ultralytics](https://github.com/ultralytics/ultralytics) +and exports it as ONNX. + +- `segment.py`: Example program that runs the full YOLO segmentation pipeline +through the MAX Engine on images from the webcam or video files. +Use `--help` to see the various commands. diff --git a/examples/inference/yolo-python-onnx/constants.py b/examples/inference/yolo-python-onnx/constants.py new file mode 100644 index 0000000000..476fd8cd41 --- /dev/null +++ b/examples/inference/yolo-python-onnx/constants.py @@ -0,0 +1,95 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +CLASS_NAMES = [ + "person", + "bicycle", + "car", + "motorcycle", + "airplane", + "bus", + "train", + "truck", + "boat", + "traffic light", + "fire hydrant", + "stop sign", + "parking meter", + "bench", + "bird", + "cat", + "dog", + "horse", + "sheep", + "cow", + "elephant", + "bear", + "zebra", + "giraffe", + "backpack", + "umbrella", + "handbag", + "tie", + "suitcase", + "frisbee", + "skis", + "snowboard", + "sports ball", + "kite", + "baseball bat", + "baseball glove", + "skateboard", + "surfboard", + "tennis racket", + "bottle", + "wine glass", + "cup", + "fork", + "knife", + "spoon", + "bowl", + "banana", + "apple", + "sandwich", + "orange", + "broccoli", + "carrot", + "hot dog", + "pizza", + "donut", + "cake", + "chair", + "couch", + "potted plant", + "bed", + "dining table", + "toilet", + "tv", + "laptop", + "mouse", + "remote", + "keyboard", + "cell phone", + "microwave", + "oven", + "toaster", + "sink", + "refrigerator", + "book", + "clock", + "vase", + "scissors", + "teddy bear", + "hair drier", + "toothbrush", +] diff --git a/examples/inference/yolo-python-onnx/download-model.py b/examples/inference/yolo-python-onnx/download-model.py new file mode 100644 index 0000000000..daf067c1d9 --- /dev/null +++ b/examples/inference/yolo-python-onnx/download-model.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +import signal +from argparse import ArgumentParser + +from ultralytics import YOLO + +DEFAULT_MODEL_DIR = "../../models/yolo" +DESCRIPTION = "Download a Yolo segmentation model." + + +def main(): + # Parse args + parser = ArgumentParser(description=DESCRIPTION) + parser.add_argument( + "-o", + "--output-dir", + type=str, + default=DEFAULT_MODEL_DIR, + help="Output directory for the downloaded model.", + ) + args = parser.parse_args() + + signal.signal(signal.SIGINT, signal.SIG_DFL) + + # Download and export model from huggingface. + if os.path.exists(args.output_dir): + print(f"Skipping {args.output_dir} (already exists)") + return + + print("Downloading Model and Exporting...\n") + model = YOLO(f"{args.output_dir}/yolov8n-seg.pt") + model.export(format="onnx", imgsz=(480, 640), simplify=True) + print(f"Model exported to {args.output_dir}/.\n") + + +if __name__ == "__main__": + main() diff --git a/examples/inference/yolo-python-onnx/environment.yml b/examples/inference/yolo-python-onnx/environment.yml new file mode 100644 index 0000000000..13c6313bfc --- /dev/null +++ b/examples/inference/yolo-python-onnx/environment.yml @@ -0,0 +1,8 @@ +name: max-repo +channels: + - https://conda.modular.com/max-nightly/ + - conda-forge +dependencies: + - python>=3.9,<3.13 + - max + - pip>=24.0,<25 diff --git a/examples/inference/yolo-python-onnx/input.mp4 b/examples/inference/yolo-python-onnx/input.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6300d2e3cfaedf1d24efae7e597a74e9b1387179 GIT binary patch literal 1164686 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%0A!mU2$Y-|kx;0DV(HIQsHYl452@9+Tj^X8? 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

P-+y7`O!GC~XlgCC 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 h0md3X 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 VK`FU~H%pFw{ls&5 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 z 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�ab0C2|)*I0}sa`Go`LR-rnpl4t0-2uF*) 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

IJ+YdD#U&CY#fkQCAAt~L1GFg%!{=;b>#=wft z{5W7l4nGeU+=blb};=4&{4e3pnrYUlzqAx4B{{5JLK* zQw58?MiC&yJ!pJ|R8%TG`V4Jd`_nRjk71p=E;TQeXTA^2OCRux9Cpm6(<-hc+M~KH zGz3s-czvmxYh8oBb{w}E_$v&Hext@-vxH|4s<$5>M^Kv7dv}?0&4l=cXFMKu(1am& zz`^#Rh+4XF=&lyGe7}n&V}47*u>z?*3VzC-zSd5|*A;Tk||jn>iXb@{6tGB01l=sy6!c zgnbH@!m1AqO%35oezb|uTkLZcp3HzV7HK6U)B;~Qwwsgurh^p7TEEq-r?GgK^@8%? z-vOIAHT&O9Iv99ejWI7lLKPdwJP;V(c0A<}ywU7;@a;;Ks!E$a`2KK`$5|s)nqF`G z%(5>6;kuEd$2Lz~52jn>hl1!OH(+&hb3VZhcCCB+4nkC#HU=($2>fDW!+X&}?gvU*t2q2q-vEwlgC%r9)T*5OSXl+=w=tOy zp;)}6LR~#MN1smedZ?zL1kRTn-Yc-IUc2s2f$cr96W>&YqK0}D8|=D8*T$rTCUOx2 zTvo-E($%FLy+naWxKXm~HRX51vppq8jXV#}Tk#bsUKuD{-82q-OdCK9rhZ6FJE&xFBzhe3GkdJ5S^H<51@Ap?2`Oq8AGD z^;`gRiZ{$vZgM?CnPva^*~h4KW`g3-mNH0xF?L`3I(tJcZmr>Ex2c1PD7Jsq8TVso zJj-Cf=P$&d*O55oZStY&hQz!CG;Al+qBW9?uxTrNc*!RVMbTRKt54DePta#mZnUDH z*_|qSDwft*J_%O~g?*dZnXq&_58Bq4}+Z)85&LxZr5IvVD)$Odh7C%{2s zXFM94Th^lOoT37?*oLyToy9!wM>xpzN}N-BnOE590neI{jIDkW&(W;@MU6@8xec zAw8j^|4it28<;yc4Vq27u!z~ng%ci45yl9xH>b`33hm0FBsRGFGPmz|1?``uF)|`M zIT~N6ZwM>>mEsq=5I(qWAnZ}J1*}_hg#Bhd06yw%GKKHKG`n+}3U)e3#_9*qRKfgj zA(06RLmY$OB{~W$W^Yb)NSc!S`3v|n-vg~MI;bgiXI&#;^e`0~ zL);RH;uD8heHPkscl=zX+MJHROUo*(9h=37VI&FjV53mV03Zv-oUA*MiBZGHBb4|i z;*FR?lt=$0+UL%J23$g31s65#lNHt6z;!Ds&97Kx0;gj<-luSUhqP)NQcRSquI4{& zN>lJ$b;lFpuTWj3Xsf~wYj-(Ol}r@j4OF>4NUBa-?H4zLg3VrnujbFcP#z=^54Ag? zO^))RlFT`L6kwj}huLlan!l#QV93z1%kKC*tBrTcI(|J8vBKMy@80ra_PFlNg5qik zF^khqID>$8yk7u?vA}=HJ(K|iuFuhdMH)j1;db}PUN|OmVmnd9*<;iWe`GPf{<^Et zdC%ru;HPCZm`@QSSL@J}BO9|}^ay;llS~lBl#@~k+o`$USZj2-O5yOX^J)n2mH=pO zKx9+j8U;{eukDX9hJ!FWfxctu_xrZVZmGXFo9pr1$CAwFq0sCv&;S4ih5?_Nn505q zh~UE+DiE$un!+w}JzX2;ZmW1ke9GJ}4AP8#vOpUGBKUmgbv7(T&3|&`B}Lp*?R;7b zCQc=R4vRW8b!)DbqRLT~M7?{}B@WPTaj2kSdzStyZ}>Ju3#fes%sigvD?IMQT)8-c zxnM(gs9a9v2r0?_#5b^=cT?R0A8I-Wd!vJ6?C$(>Q4I2hY4im1D>PqeP?EzRf^rd4 zr?@y2*#pI$k?F8qq|(s#Ysu>AQ?$0N@3U^AD6JUoX6QxjcK|l9zZBhWzer*^oZiy;s?#JlL0bx(s+4vhi4)C*itG13i!+tkEq9)o4JDKqJ zpNg^=`wrbO9^h6gmNZ>>2wL?y&MMiG(Plh_*)HBbPM~aL0^a!2vbbwTzNVBaCZ5z0`ifkowrioCG?iDQ9TqhzJkf< zLQ~yG5`O(xPS=Xl^$q;NZ+a}fX|!D2PY<fs zxMrcZNxb$xbzW&n9b{!mu?exKtW7gzJl^N0L@>rU*S>zY@iQ1)VKlc$E6;A{8uXKy zPek~l@=chH4&KqNTvIwUd-I^o(uqiRZ5o_=pv;w}w@L6YdTpcEGjX7Pe7Z-y4}kyr zBatBRD_3aa{kMfL9>kYIoI%ITD6>6;NSQNDEt5(^x~5lvKHSo**&tj@q-4pbz8xNi zl^zzB^0Zn>3Fh?6zykaL9T(17go=f1=Cz&mY%rSat>g%wA&*XDhHl&y#M7n^Cduc% zJ}t(LW9hYuKw6)=Q(54!WmF6BjWN^b0PY~Yvs4nax|*T?#}CpySf+2EjIdomY*E7+ zWN>KWJcQRiUax)uz8C!3BOUQdodo?q3f@KJLct~AqeqXygxI%C713BansBoX8VJ;R zMMV;ajZn8fAJ{CeXEJVQ7QjeqVWV*+==?F2TrI&^QrkI2rE5grVsW zqChsC){qmo30UvZRKIF8@PSuD{7|dhcX;_y#lhU#{Z3%$Y;Hig=|uK0RgRCvMSFRH-Y`)p*BG1!i*zhMQ~bgAbI zlY-q~z(j2Bt$rnR#vXWs!=Q5_IX3t!*@T-8*ps;BuhN) z*3t!ZKCd_zUbDc?Ldl0b=tTJNvS_>jvy{Mp!bMfGF%Vs!0RMx5h|tnL;mAvyY351XM zjk>H4{BwC@b#;Qu-M2RIU~Z4Zz#-Nw)7EgzP^K`bFx%4`%+J^MPgQ0bEvvb^ge%(s z00ra$pPLxD34eFm?b84IW)?PP@NEzaqFe;?`2Gn*p1B$>rt$MESp9}%K?^$1ze&zJ zxN%_X3Cf(*VCPKLlCCri6bi`3=jFij_=N8X2kjPt+l9;NW7Cxa{M1aM22+!wYsZVr zm+Acr*78}Eme}rBlXNISB7t3XkQ192#bqr%7{k9I_{;X=z9;%-MD>zb|KGop62mjc z%HhMPNc|N+)9Ts2i50Q?I}-iHM5@p1DvEn68T949TU8Eq2>9C~J(nW}5BU?B0=o9s zF>Del&6W6L9x!S_hShw$#K}>IP1$ba#bmQ@23A;Aa@mH^MH^C?$ZBj~dMY`^7_P5I z$Qhs_m4*sAmp}lzx3Om~A+&DI?Y<`YS&!&Q#qmQ~!QaPfGe$&y+i^99-+HL}3jn871%x7(bwqB)oJ0mcjxQXO-Fo&ABkMuYxHh3s3 z(J+s1W@OwD@3`5|^OYUn|4u+`vp(m#XIFpaw*?iLh*gFUnYaCk#q!M1M+2GN`?LVo?DFoN6{Yhm=%Z3rbgTwqSa4*AvpeQVN#jZiaxTzT z|3C=KE7-Gp1sj%^)nbp?UkS+N;9$~yPc*bJ5;T3;5^k6BOA1j5xyY@YSMHq97Bq2pCm{(4tb*2Ac*z+XudUT{h3nV&lph5d@Vcp&PxMzTv#x?qIRwxI%=N^6MCP z1_^_HjM7*HdO+XL*-k&-^@*uzYg35FZMB5Nw*w{`#bLQ!$52{~6;by>LJ z;d%ZNQ5JMXXe0pkL_xfm=N|y(A?n3|5BEH-r)GGG1Lpykc%F3l*s%MkE-<^m179~N zKMyNxyLTA&H8IMu5=VuFWpEUrl+(j2a5-i$MT_HAIc2V}2A|#Sl@9gHu+?+xCM1i; z`ZFL^ML@BU{g<@jk2dZaywqP4H+B2uZ1>sp9AHRZ;+b$3Uboc6duJnE@&E_W>T}=z zDAQx(-l+wfW9+SzWs%`~Gt^!~_OExoTFYOX>KHRlg4_LzZtiKfHAU_^>caGUp-=oc z|53*}oOk?Us!>GiVlXg;-)$^$%b}*dX6$i4vnB*zwPj^$kQ{~Hs5nbEeQQ)< z+8Vr()&04cxGMS}0Nd7e1oOnbs8u<`8_SBxo30oTR6uSp<(o+}&Y#|r{W~AJ$=P7F zzIazy@@VSa!R084H|vWEBbSvTd0r%>i}hbyH-FEHAU=mRbxb6VzQ zGosD1n}Qn;1{(@~=2Vh*xPh-B3Aq2&&1@^2fRjl~PD&UM)U)TaI>e8p#5gu_Y1sy= z=l0w7a74(IyTZxE*eLyqGYBTNFp#Yi)LXY~t>~@{*(J~Y%GJu)Axc#TY(Fmi_9oUO zL`XpZ02f6;o16_n0@~WuEmD&yfB*nV|HfcKgyUfD|Dl$hYe;x*m~0afoCwfEU#+6- z-~kHs59Br5z9M|&oe+Q!`V?0})fXWsPEK9A%J8)J_s6B4tvG3P5&t+TM`l0F4VHah zi(p88NcL;9D@BIabh_QZf0bi}9JoiHlW;ropNwh{$ub_4>ar;+~ni3MBZ2Nd&~iA5?*mboVOe9cA% z-Ql_OP0ZC#Sq5)zOjMYcT5FT=j2a9M^9V;Uf{~@m@P^Bw+ahEPjfR6#5-#A3dJIZE zNjEjt{%ju|kYW4OYHSxx^LR)Hvx-{PUxv`^`j;=+a-(k|sEPr`1eM2Hw<9vGG zo5xZO^^{&L!6`BbK$|Q?Jrvoe^+ELAB_rL#stL z00iJ5ZRaic2C^tathaOz(xzaP6;(_zR?6`KQ$>&-#*qv~73%7CQ#L=rl!Leih0{ev z5330DdX7=YcyF+;6zED|u5XeFwx%a5zKY6+!$-g8cGIo-);<-y#)|UQWlSd~V^M;q z>(vvNrHg>*^|X!x&oTsfh>7@s!U6mP^|?h2GFdDZ&N`GBg!CqRr$KNOVtXCSI-Z!a z(+yOq$v34tg4-{@0IuoPnsNPYU~To}iS;5;U8>Hl2a^eiuA2HiCmSCRp&}$xbo$FB zl?}v@#3q;jJ4W<}U%`0XH93(&==kD@?GqvM8dRFQz8;Rs`st5nkwuyj73_HF;Ml)q zCBzp@&6O?zmxc?R(}<9-Apl zIybe`@ICj*&Q(7;XD!9(a!Z_Dc_Ta(_>+l4^#>D9oe1BS2B;|}>VWpnsxN1XYvf)> zTFV^Cd(;MK!*?pLja=^^^6vBW` zDhH=PNIjzzBq)x6Oas*?&aLGU1vl5xSpT|ou9QM!bd+%yc&+>`ZW`FmZn`>*UZ2SA zgeqmSmXZJlC*aT0u&_Csh3Tw-$9<%A4Mq1bje67u7aphkQ26$dg47jY$Uwt0|EEGQ z5&ml#A1f98j$KQMhU2I{t8JJ$IEezuwyEJ~xo6{N=-g3+yMztcqH}yH10cKMCyCYw z^R;sMf}(8tpKsli1l6b(ncY?+iDIkpU+=swQ*_&rY z5x3%!t%xl4YtvBcQ-nszBI(jR+p3}o1O?!v4f_eb^G27bX}4)jYCRH^lFGUcMsJry zz7CKC4a)?D&QX2Tn}`g#D!mq|a<$a!mz1ue#;+*KY4^(ybdiNT;v|Ccy!wxVm1i%T ztceM&@Yp>>ec?^$;>d!e%k#$w{wR!EMytL=_)&ewD+y>4>L~a}vBdFJ@-{KbnBhD0 zKvr1nbNNoJMj3#jE$2W8s+JBnyWTJhg96zQI<#EH-7iwqzcXJ@$n4&LzqX`N92OoI z4fgW4x$w@*nse3_gT}Bm0J`bYP#u)xW|+GpE$5mJ1!CCScGc4en9IU_WYlx#1)3Qk zKs$K29zZMkWR6JT&HyAeRE$ z{CB&|+k+|Z?N$iWpo<||-@2^@1Z_(*>8q$8cDWQfyqKY^56&!L#>1S>`A^|6EDet4 zV(2ru$$x$?@2sSsU61<3iJ)`#zSd+-7+^EXuwbLUfljVdmBPKhBZwX3xhos=jnb#L z0qp?5Q*4%w5kYW<>ddt}iGteJiOl9dfgySXuTY-mvyNev$!+G^H;3J*1^_fJqy-OP z?yWga@$&qNejYcoiFPu=4*{vj5AoJue>b#epw3V%{49O3U99d*%pu8LLI7H1L9L~X z!`o`09s!ppc}x0;#>Rx>$AE$Elp=*NC5*N~?WbA1BV?OpsjPw$k)X!3{A>ICc3Q-_ zJYIy9Le>M-+kVKYB^sLpLZ$sb@@vTz0`hIG*1l zIaboKX{H=>4Jo9KyrHtR!h2qmiM195pD_3QaIg%`OZ{VE>{oF{>#a262!rFFb2(c2 z$?@u>$I_v^9|kn1mZ|)>+t#-BGg(nT#BO}Ct;NK*?FwBj3h3>Y3Su9hQcQ{m4 z{Z*f8W_Om?jq|#F)x*vbZSP1b;C5NHg(&;D8Vs*OtI*2Y24pgHnqOxSgq>RZPM8$HnGj+MGTGss%U2%(vxi{k;8QZ=T0Dkm@wf8vDi3+poL< z?YXgcM_y)C$+BkaPNA;-3;VsrC3_Q3`cB{UVM&f^4K0O4J2EYQ1R#8sckHL_9M5{O zJ^PD}9@@}$;^eulg=>Ti=aWbDZ2$;k%%zaPauZ=fHmwj=RclEKQ}yx7W-Tw_X3$taPDz>DKHm(KucY9o~L%v>dDtsGg0%i(0 z(^zdHSJEPSrXg(|Bve2y#02Y3C6KdU421O!(jv&R_k>wXs7nk-jjMCLD*=#pBIJ;U zXT8K0s!UOcScE`aJR|okbB3KSn7rKw_*Q@)6taN33iW;VwPmy2GI1Zq{bB2U_3HH0 zZI}h?&zx`Zl`k{+9=N5{!>1Ml=IFT5WbXOxAN|ie*^1AW&@JKBiR*yx;mU<)@)Ugq z-pp;%4QOa+nPmS+2L(pY)RRpUPNr)By`r0=z+2fFR^KQ$g34hNKuyeAK19w5qS;%Y2&RttaS#^s!pNY-sHy^G7q0J{4v{xG}y{-s$}NzA3ORwTV$+7;)a)f$e zj%{pehRZ(QJ=>(Rkn29San`}@FQ}T2Zxgr@i9yGFoz~Z0Xmg`Gp2Z;%7 z+HTeVlUL>Um{|Ws8bNs0M^=R4^SEAZUwK)9OhD~gl|pA8IlrUpb5MsR;3xKva;;%v zkS|s9%rkazuch}lf=yH6hXy>~0WR?Q|Kr`M1EWSOPh}KQmhwV7kQ+lrcIkh3?N=|nl(U}tI2|uPg+rJZjBg&uSH~oXjPiu`5@5oxZMziYV4FsR7k3!Y$@D) zHmX@H1@7)@Mk!80nvaY&X|Ul(FG$ljwcP&gN1I5<1maj47z_4S1?=zoGgTf@QFT)o zDf#z=r~A;48qzTl`ePdM#3QqG;-Y(GK=B@j|Hh`@!Ms+K=cZd-=v;pUeIoulg!(Sk zzmY6%^UMaj-_)f=VQ_(~t!DdRg=0lc<`6i=k|TV@jWr&?C%|!tL7+k0g!- zHM4J8n3QUV4SV%d<3(LhyTR#F1pQa`WIW2mQ-FVhNM*1uCeCeGMENO+tCZqre~{qz zZL8TcGeBEA!1FxnAOc0tfvyma9ueUUbRUe`;{ zuIPfN&kOq~1WT+A4TNk?VYj+AFrkLqI}l`cPCf#H%CP1gzr-!lqK`Xr?s@4g1xBfE zAr|}47$Z9S&MmW`kPu8d3eyLI5+vWtWhFi6Lgm5R%t^S~{p2_53Xfp(l}BQlkACQV z%uiRIf=`enS+A%e{oGMRGD*JSu61#N;}g`tZyR!Ee{*w=br{VBvgEqO4VES5#MU?R z;M5BUc7&uQwnwM}1#L1m6Zg_7TlkZk#Xo{kg5Nu72rI)j??>_QGH?6Z$mlrcurf6W z4;<;fB}(6hQD%;TX|#qa>y|~b&4{?{iR6f4D!t`ic0jK}rkL}YgKTI7d1GE!S>m1( zLfN;v8gX+hQEp!EkD{+oUAxN*-+u|StPoczLII9U#qsI6r~0-o{25QNBG8J4WPutx z_-971h0fijb2$>aW1;Gfi%^02>s8BzIFa-!-=e2c4jsMTeU6isxSXm?lpQdg?PFA; z-8t!@A_ZI6-@|jp6fI5gX`i>Hg`tDM_LF5_h}1D(uR5r;SdF}`J~ztb$Et&Kv-XA+ zIzpRTCxMbeZVZnZ269K<2LMa~aJ6559dB9#0letAyl(9OqyoepDNX?I3YS^4jzMvj zkI}wB2UdT~AX)Gz0270gy(Iv$fMpqkJQh0Vhs&T1V(mK734t; zK7}!#?U;d;zFfaRfiknQ&OC!HMuL=OV-FXx z6s?1#jw`XNxEa9PQ8+P-s2x`an{_i=H{jp&s2i016RFpNt&QE_i583mE=>H)Z-E$e z{i0XvqKtN%QkULO^Q=rQ<28ffP9*~XL5pM=Wo8r!k-0r2|3nKCW}+X4_HYy8vP4UW zSVRpY=a%1p5E3ixUv@ZgqG+Yi(x|vWzJw`nKV{dP+FcZVn?_rbI7bop7paow zVg_GiMTby3BEWwEzq4#d_#%W5E8z9%xFFXBj)lbT<5knV4$%*#@JRU{{$1v{o`%Z5 z@S`x$A$jS(TWyj+ti0g0{~ntMq?904eF>nY!WWXn?f%xP7=5CCaV&r~Ub+~&N7egl z?2S^L1DpO%%oH%&Ds3MXe79Icq!@7m5g8)z4)t4)$%gnfC78M9cCRlEBQ9gplTwyk zi-Z#Epmnx?h&iE}%j!&dLIvb;PxP8zQX0WZSadz{H)e@ORyr=`pDpJ-i>LcI_2-G|0@Q?;4#$ zx5NA90VDn8TRRCB8o-#%kDGM|LMq9q(hv*b-xKQyEcU|Jt)lAYScJ8v7n%~7B^Bh!hO%|0r74TzBj?*M z{rccyJT)#j>3elfUenABoH-D-E%vzQ{zurqR^+|r!j#s3>`MLpI6<^qcZ7_Fn6KVG zPA7{+HH&Se!0Gpn122!yt5sE!(qXfaE~!S}!(i>(BotefD}cN|ZKQ%W1P$Cndwb&X zMzIb{Kd`ux1<0N%a>>zJzeo+^-@M~39*AQmKpQdA`z|)V10$Pj0)PX)nsBjsDV3P9 zt$?JWvIC-+_u8l3VVnPXPx$Wo`Q~Daj5(Al3A(Bvo75Blg@vn|d7lNzUplS@-cj;# z^sm~4O&7??g^pR7>E-s&9x5EX_Gig5G?&4IotGE!RH^MeOAZvWjhPDQP@Y3u7UZ^# z0FQYO5GuK$#2GL&9bPZe#^5{p=q$T)QE~{JoMC(dhtdLz zw15B_Zp8dm@$oM7&J@@pw)0cFpeVGXSo6bHEuATUKntd_y&27tB*k2mdeo6m#PQE& zTj-$u##6|OyNfbP>mYxlPg@2OKCTdANlONctmE|-3IGs=bAdRm~PJQl4O zP4G)Bq#%YFCK{}|JRt$(*F&_{q0R1%lpv>O8{)^p-w3%Q6aznp9-D1g>JUlJ+4E+z=o;*NBE}3mAA4>m z!!$I(fcKlyaqD)>t4K%TMvH;i)4}eo%~m+$6yZVtx8{na{va|`c5vSnXeDiul{wEE zwa%O(!>vdt+)XyYf1*-_ca2NZt9h`@z(Q3hqTK=lA^K-w000KuL7%Ib$wLs_A^%`* zt3Z{;gnmF?dP_2Orh}7EVo`3BmwC@YAAE2j3o&JMhOJ45yGOLT{lJ=~`OP!c`!{>ku!gx0*1rE>N zIAHu@IRN}D8M5t>;>3!pi+>FQa@WKv+_m1JZLecpdgI^eyyL*k3*^z&Io+S^9o`z? zFhTyvYI2YSWBU&OeHLqY*Nul|-Vai-sm0znhAY+LUOK-8n#gPLmv&uE1Wd63=gWy> zp&>u08~mOSsUMpYV=KFBx5V`t1(+u<=({d`mp29O?oEbE(70A;)bClk6`#2#A4Xza zO``@$7qPt1I>6}=5rEn7jsy|Faoj<`NBLhwmka-tg6^nYLu5llFGza-JojM|D|^Gi zq@Ll>O9^04U@_BD%;!^0^Wj{vc&E&TZmRT`PFy(WDQp zTlTT47izFM4>S6HLpb${HFaiZ{F#c8$wd%a>|elgN`o#H?==?=Tr!3`kyfb3=*wb* znS-!didIIn^6J(7^JygT#e*o5lHMl4@pf5xf}Q-+a^)g;|{s z9ePIoZR2ylP=TKuh-xB}XN}mK&2L4nYj(@`d-RL3x_iqsophk<+-@{(r=g<1n3w=i zK(D_!P_4&5;K4y6Vg(11cHBP11k7$W1AdQ;+;gmJv=?Q;N_898P@h>+t8x6g_&@_k zCYiPWgO{XLLN&(?Uc8R{ck-m28Maf_(#1l{J;i=ON>Td0U?~wc858rF8GeZQ9#CC&2N+ zcN1NlFW(G+wUt#nc3B0kIB;(cO3xtk|LQ7B(nC?BDM`RT<~90Cdh^3JwPBmbeoJzU z{27D|m0Q0i2ZL-C$9L_cr4DK=ry!QDpi<^tik_jn7g&I_S)vCWgo6~9ddl(ndr3WX zD|0#z*)_3jTeuGa+PwfSDK)MeHB1}`kuBUTwC%>kkbn>VVl~4A8-l}~P$>S<230-! ztz+KXSF(I(Un`itT_YGKmB7n-FhY?m6D!6r6>`$!zfc#%uZxk+>7;kYWGZq{K=wDi zik^U*wRT|JU>{$9xxL_&3v@K~=Z>~Fv`E0{IO;=4`FwxiUL<(F-=CiTjJ>3M6S9v# z{v6K7kk`H~sc$MKz+{>}nL<8H7uqp=Yg{MDLkmy!jx6BGJvCA&mrPj_6RRa!8b=~iP_dSy90b@h}}PY zDEQ07!)Rj_bFR2TkztIYhRv3tKMuyJ7@MgDv~^J8h{c2OP2wP|!fP4h3wN0Epv(@s zLAR}@&*0{i{5aYOR(W!3Nok{XBnJGuqI?9j$d@?C9b4G6!*wvg)%A5r$Vxksel}HO zHa4T874fGPDu)DPwPG#1(UtBMZ~ovmL}Xnn^GD@|CjJ4LO3VB06rTT5R-nFEFmqUm z|9`XKuK{b~>?j{oGzymI1ek|chM!4b{;Q5igq%H4fKj+}e!lpbXD)-w*mR zVBrYF#>6m(c6>$jg2#kk1=5 zl>gnZGRv!mV${8Uq(M;0cU&cb5it9b5`hhm=$wjtrc~Jgr#%#`f?g&Pd11T9HcVw% zPCQLJ3|mgr;h>Y1wErsbvjJXgld?}VZ!LeCzaYsUs1SFO%SN2H&I<&{65md6mIzOf z)Vu!mGb-1we&XFTr5R5|{6XOk9150lM_@XU7JzE$U(ik%E7bGU5v^{1ST95k3tl0x zXIb2~!JYvfe|Ph7%f*eUT2;S&)^oZ$L#lN%K?s+bod5s^QURa4*trRRozz}~19gP7 zR+Hl7EH@zA_dwwpF8x49>YPGf`^uCtF107-D+!V&?hU&0)LCI~J&&T95P=>HP` z_Aw!5oO|wC?jG+=-u@s&>VtqMz91h5q~?eEpXRmkA5mc(bNglKOgj7RkUdcdpa)%A zjwx0hps0`w{KG?+fiN9fDQt|J58b&)kWOzO_R;5G)jc*F?FkhH4_Tt}7q_p2R4>-} zpSoGP=`o`Y59|XD@ZdC}OufEjnFj{r$(K7(i5&s}tv%NZ97@9Cfn8Kb{}ans6yU*f zvEe@OX-%(Q9#N7L8|y#HGFB2A){ttmATD=2Q>JoVR*Y}UuImORNOIFtSgycjKR2V= zL58Acm`(v+wZb_ao6z3r9{S|3L0yOmQ>cs22I6N0j?Vs+YKBfo{*-j$KgQZvndGPf z^|Tq}vI@>j(s&d8fIyjo)Z1Ofph1VeN*8%ovWJg$tW7dk(HmV1HT_(hMmbU@cv>Di3SUTzYz@4cHAUrc=6{`=KC0d|k&x)=e_axoEZ(0J>L3*1k4 zw>)#I?-I3hLzkjPLRhX6e5H7o>%>T`m@9E)H?%d_e(~+|5Y@v1VF84H6)ci#%!d~J zM^w$A*xucrlsTO`2nDjODw;te>+~9mn}lO*+~SV7)~o;twNZO<|NWrTA}}ic#JA)) zzgA4vkL8pY-9s?ik#}{~O3zvAl$h-CtaJ)Lb`ovmFgiF&pT3s*(ZDdDQVRMIZ zQRd7I)L#@24Cp$)BjbgMRy#+6LQZ7}&Rp--zw<*Ae6U*pJM<8f`mvLg!U8y$PM4K16W zX=twvNo`#;gaQ2kHVH753k1Q^K~H-4Z{qe^v}5O5-tCGw%;4+6;Tb2y2q>hw*cYex z>=NN znvU!RB_#5~^kJlNs>RWwAE_V@Z&sbvx#1Uh z+j+(3`ODoI4)M2>Jtqr8R8W?+Oi>XR_MGR}hcuvdZh27B70!yWCx2Y`tSgK;i*P%# zr|DXbmoQeALlqlHPOY?vGQiYm%z`mhlArr~Z2Zynzfh$CZtRM*Yy+F{q{-gZ(L~+s zfj&vdAHz>P^Y>nkV-jw>_~~)>M;41{+O-!_GBK@XJx{CJ@>Pv1S1I$g7$`lZ{WeS# zQ-b(=aZpb8G!xP0>}@Zx?Ag8s281czFsf0d&SN!R*8Thd8hRlyeww+Izp~+bGsD11 zYP-OmS9(r@Dj-8$h9@MDwZQmZw9ScC!F=0Zj-MXQ!#Up8-k9x{_2Jus;&)F}AORrJK>4DrTSDrJSd6@d6$A z_;o8gk}GTsit#OUVXT4*Zp0u532rN_IoUFf&M-=dbVyjtaD$#Lc9Hc0X@4r=MY)L` zIcGjjzL@sH_U>7@RV7qbt%{u1aj}6k6G{Mz_xi>y3F7UW6z>5A1QXc( zd?*xleG5|D0!+KX$2G6TG_V*Sg+2$E_Zu5zeNTBlp({4_&w}$LUjO_SEMrvYSq>Jyt+00lSqn~ zRF`Ap<}MA#E210jH)73aajMcC@x<3#`9gOuPu|#67HnwFlmc+JjB}I}N`n90I*M5| zf}P@?3sWfecrs<@LzWP_X`k4QO=~9pdQyswd-6-j*yxW?%;1F)Yx0@oDBk7}msD#7 z8SxZ2dDQc~J{=MIs&!EBLH|n^B+%bY07GC@4rwY!WUNanSQ!>3md5zX-#k#>s@A(5 z^=DyNbuE9igiw0Y14=7@m1U=*1T-uww z5PNrQD%{tTtfv*&ty71%;E3;o2|tsUM#u>9(1?O=! zPKvA)CKR}W(dA@<=jUPpWs@2Ug0$g~@j>4#lq40m{fo|-%sNgGyN8N^0P*TvWaSnw zQ{%FiG2S2=>5T!?Wl97+?9uG-U<_LYdN~3Y<`QS89eueZ7oQ0h$U!dL8GF5~LgqzAy0dL?<}&*F?Y4TC%a7324<`12(yNH2#&X z1#azY!^;nEPz?Ax?k}i%%mae5TZv>AC>@eiXHHQx4x80=%&>~~{%J6tyFq7I(Zos4 zjRF7^p54W#(77E9Nflyv<2-)4yL-utC+C4P37Kyn{aq~00HZv~wsE({V}^>L!wrK` zOIoTF9oq)(Q)jQLaxHD{U!WTB9UggrUqSh4f(qb8xuAisa`0oR=NGRvGFkO-0AFJDO zHAkRCoP7?F`U+5MVRxZ95T#v z#u|w%t~@;Srsg&cSaK;gX8iLeeT;_57#iTi8V%{biDk7&iRWG_(yc7K59={6DO7qz zDnC*Xwbc)v?TKM=PypRB2i~pJiadA8OerpH>unpxKxyC}=BONC``#MPaq-C0?^ral z%D+{b=nHghIvi>q+77X_RO{O(+X=$!4?^u11Z^uvz`mib=LV!kLm03;1F+i)FK!Wn_3Uvc-FgEI4QgI^}r+U!~A zA|p|5-z3#E7+4pm@0SqDL}e&j<6dFw;Ec=qxzPq|Ut+i%VQp zL{qvY=L5yDE?KB02n9(v(3fz8DU4J9G6>AB;2)m1@nAo@7awu4{*1u*O7Q|OIp@bM zA$5(}H@eDQpJ;~iNDcODIDyA#;RxCvb%T$(S{mnphj+s!o;`?Ut6HncBfk|rL`Udb z+n0;{xi3DjciC6mn4RdNzb0BYY6#HT=`*kWxCO4iDZt!1UbE&{#D>KuxTXmQl9Uv=h!A-0ES!D`Oga#% z?VyJ2PQ30k|ckcXN~qj+?`UcAJf zGUZRqoKrpqsbzx}6613>~Sm!aUaPq?O9AjOl;bt^x z>@28exACq2qvum1?37V+)Q=LK)6VPYjH4}fm>>cDB-IMk@9hZ!H{`=mcV=mgZi zg96%~?oVG)*&IyL-ws5pK=0r9;coQ0eC?Y&27Y8W_`5B+DJCbbvkPt-te{0{&B~P3u&SeH{n^jz^Pr%0V}~j5(-XNkeAs zh|>t`e)Xr{vf!4iYYY19RbPmxLTDEG5t&2{(Ri_NF4skbKH~lA+vrv*&}yphc1kpc zRaGs}N4VSh6X=J_89*arO6*CPto&HsUNRdm=ngN{uJ+LRCvL^F+6Xy&Br!oZ{kO$A zkwp6fc(V9^1ngbPgKr2{BqAp(t(ffWzZ719^YDADL)^EqO;DDRP1Lx8f}sX7=$7Ot zKHM|^$tR*n?|Js%H>ipxRD)CaX4#>&1V>Kq9iPN=Q(f`G)J7U&e6dRv5m(Q@<4$Fm?06#`Y6OQ-Flv?8SmV5=xob1wZZ5Z!6Vf$-g|5 zrQ_J96luasgO7kFys;)l8e>kD`x35~1((fNQjtm0;z!DwzM|O!tQ4AAx3O~K^Kta* zmN@9gVi$`S0IA;7w}(AphRMbRc$DB0jd1fg@aenvOTdNLrxRYYBrB6hQs*q*a)$n4 zBc)MS$x})AG zl^fRS>?FYo!{TCj=3Ao~PFj4?NxkJ9c_TWm1CMdY>G^xrDxJEe41T64j8!3O6G$#< zVs(pCr|B63AyQB;e~77Zo-u1mArzUzL$I;S9tKmlA+N#i>j>c3<4CjTA}(T4V}(vvh^xcUBm@EF{2`jTqmMLfADS7JBzA!XqN=s+jp}?%GHHKhT=9uV=Td`u3+maZ zH=wgYy_`ImR`+&DF|5W3>bJF7`^e2O#+;rk&o+Tx&KJ8) zgnGzMEcPurPaFuZR8m{)7>~Pl#I=%3K0>iLwc|lDLd8acr{j`S1k5(45x2oD_EhQc zbaC4)R3vx<6T1R>!(J2~^q-QHA!69+lyEOjDNpNLLY^S4=j?J z?Xw?v**$J|Yzc=ZeH7UnhEuH>_Yzu1s3Gv$jMs$SxboJwz8K>tvQi(6>(gWTayiHn zW#a6tM1{P~94fTtBYv1s{X!}<%tCi*>wca~F}Em5JEv8CJQX-b;$~Ff#yayG`|jhb zhyvxPmf4H>Xq7bfgs{?ii+@oOQ59f!EoUQRs7_~2+-wX6Kowr{1?Ouv^z^hhDQ@50 ziYhzXmSG5#D4q$Z!N4EG;R!MDqWYjNnN++UkJ=qq2}MWd)fWom_YM!lYe?V>>W#5e(P zWe58+QKltItT~C}MYLL@9h1dF&$qSZs@4sP#-mJjqhk_UQQy}%i7-*+NKd!0yXyGZ zH0%MgINQ%@O1J%FIc6b6wMaIc7$BA&N4Lk24)QXeM)t+)jQ45kw-d3S z1}5uD?NsDp{6N+cH;R@yO$AGr>_$-}^95d>uosmjIOEdoK#%NLx=p-L1Cy9Bx{<-* zb$LT{1Zq1EA&LjUZE(6<0Sso}Sd3VHdMv~2R~Hh_G)F@iBxSdbay<#pwI3#+v)bGN zUHB3~*_|1bjjfy|t7pI4qKY5(-(9?xoQ(14eNt0~-6+dXx!b6{2XghBjekHYAN+8e zb-fLImJz8#DIjE$bBDX^ADuNmC~>CgbX3=8*4B)jB^8#Kd%g{G(>SL-3R3GYi?Xv| zIkYu3Hvywv$W<=Rd!wV*K!_Rlf85ZGM$7_cb(KZQ&si+=$uu%0&HukFtmBtz6xoKyVjSlt`11Ys-1M?5&>6N6w=3!pI^T8dItA!W}_D%3cYESd2b1}w5mJhLN5oa2e)*nXA*GcDE4+p$f51&(2y5ZmBy|+0s^pe6` z2jGRZ)wQ{%-?FfWTNl=cM&$s+kxqYlyqQ>hd$1|I-}}2^tbB=Tbe60B&_>+&sG&>d zq4WK(DrR8l|BO+Bv2!v3&^3$UnskY?u7%#nBL_E(E*h=4=}xCW+*QlBNJoSEhH)L& z+TRwNL4Sa9D>l?*av_}K_I`vS_@WT>F?@SKlfmz|UlfF}W294h*_nwt9n($fO@FT% z;F6(gxI&6VN$5vtuJNU==~@H1>8LIYmK>F=+7B(v#BP6Qys3N#ou*-QdO%ml7Ppb9 zcy=rFX?}kbd_7(*s{x&QtP@H_1>wbQGB$%4!c7Km^m@AyE?bQ z>k5{CmIE%f5483q5unHR8T;1KUXH@9y80&3E77h%1r47b(oy>gTIfDARsA$Ge%ezn z($}mvARzpy=5&qK^MOKCmqs-nE{&iNH3QLJ$J7F5hcakc9{`%`_wob05n`^C_Yg+X z@j)zF0oe>2mhZPf=*eIB?a2S5<8L z_06IFJ;QY4v5rP+LbW4*M=t0rWv288f)lB8C7qE80mr1(S@tUwd=pXL9M+E;HW1}^Yjo?cta zCGVD=24?k~T@@_JTflM_(x4FuK+pbjKnsUF9+4)2SVvHB+XRX$Ls+jF0MDU;-nkPk z{8U4GQk4r6RXy>%p+UoByN71Sus4%uF)vy)(R-*;Um&qA$OUGwJ6^y2bWQxnr`Bd; zoWTm0<5l6$BJK1hB5?}&%2p`$oR0_1Tty}%8TCUwp`@4ri-0XWL1h%1;QR{fcYGeN7T2Eu7QUM@ z+W{TFYFotXWm4KGLH>scFt^mCHCH&o3SBlefAl|qfJlX>dVzAC{>NQAj?}iv*?TMP3oBm8X&jB-9Qb>qD1yM zX56YQwuucC+;21|y&MB<{=kJthu4`>Ye)pq-FJCpd2TfvLjVDq{w8WcUdwd6>!lw6 z0(@b|%ObM8VvZ^dw?hs2*T|>5%{^#X20e`RnfS1GAVUx=aSd3>(90k^ir|@CCeB*ma!JgGbH%31F?^S)=$$Gdjt^XszG`NnQG(MC{>k zXkh0a=?!pv{nH!b+hdj^9854Ta?wVnRLcZC({NS0SHm;;&2rhETWvf$w%DG|YcBPa zI{6(+AIJhtkb`eoq{teJEU2+ykWukbE5iBIha(_dk1B5=*k;s2n{f2a+uYE+CZ#2e z-XND!=uin94#8f#a%blF_L-jgkOXt0Sg z?};1i;Qp49)jiEcRY>u`t~!Rf>&czYhS zPb`ROvK%gTnBS}u@3|ekj7iF@ScKSg2h;l?V>cHPUkjtKv|fn4AVF|zK~d2g_7B^`q|ru< z;0VXP{`*j{TyZ~W{p;EoBxQel4kF69>|Tgj2Z44Q(97%Vhp)f5vB3jv^cgzo`1(o# zfXWXS7S#um=aNj?Whb=7D935AHw&x509$xBQv2yhng7y&RziRf>vO^Z=t%iYf?L$T zEkqtrmTWl-K5m$6Ir6IE0nXEEqmLLUctiiMA8;FlsAsk%Kvr=ydm6D&cI&EM?RktvTaf-XWEh7#j4F0G3!A!_+hYW_>2%NQq4JFREiteWzyCS z3_TYVu#NX^LDNfsH!2g}=jX(|SFTd)D}9ly{vRlHcMYSG`u<(KZ+I<{C)!I}v4BRK z`~Zc<@TRyrrNX)z91K^v4EX)rVk=x*V$10BLL%8KFsPOyPnK|7iw*G)(9!ZoXu(d1 z4$S>%WztXRFdB0Bo!L3lG9&b4wBY^m2Xo1b+PCz3o+|`v2Otm7vti+ca*Uqvc_OY6 z_{%Lgo%(Od?PCO>Q})M_v4cK&ey;Zvm6MlKZKaKEfU*c@4TYqHEwQo{m4%Z0Xut`4&8U9S5X&gDnu_eTXAb zv1D+d28{l)&6EOUY;o!|dGeQ+i`twfjyJcIG5ig#>KV~3FdqwSxk|zp(4yf5ZItxK z{#-{M$HOH$blTw{41oXu1tkHW+*qVSUrHWZ$GlB8EHEJ-C;@K-!JUN~=lmhR5%RRT znpGd?zHnf*9{c~;gujLwsgZq5E;377uHU#z-MA%0WfyzyRl=l`!PtM zgAE#W@mdT?$IOmTbfQ{4WhV>k;saw-%)pIfyK+g1YbZ&#ZfqriPZaV44^^&0)j%wr zMiHxlKuI^oV)wFrm+2Z7PoZmWc;#ldD7B4BC}6watq4^R2{BHwQ+|ZG!3Q=BF6Ux2 zh+kH@L&oP*YyKR~A?bec1xt3b5!ow`JficwQ2hnTDqCCSB&_; zH#0h14HN!(n~0~BA0Om8T)tSt1EF$MT5u$#mb|Ytu7yEp3pMv8aC}^Ugj)C=Q~EZ) zsU@9jn0h6V10o8bLQxDNKDc{wuVuQMH`4jZbjAL7j$&!uGax~Va2ymKa&`QIx@&%I z7*$Bl4%z|WpQb(JJI%l#JVK3I2;1oPK?(jgB)~mV4ta_)vCF|<1WG+z%{ZE@`9^)^ zv3`kGP|K>uSDRlEIqSe!U~aMri_2$^3Xpu?9c}znP1{1rb5lVWKy6x#IUsIj=#b|t zoW#nNg)|vS;L;_X#L%#L+(c~N6TvGphmKC95?E06FnE9c#UaS|k`PNM4_46vRdEow zGbelXLCjeNeHE*zGb2Dbt{A2d`)y)w^n>6#`{FtBko0NYhJOoNvd96(6I=ugbWGA| zxtz0VDnWdkX9icbivFPP+$g2w48lZ!_(IQTA+PdCwC}n0LJv62E1r_SkZ34jUa!SR zoUWF#sE3oBiR#C>3%iUI`v>A-geKHit7kyJD z4O|s>(iVpfa9L`}y!0?mYHr!+nLSW`lxChucUsk%CP?QlEtB+kW`@-h^ppP7;`_Ah zuHjtDU1NL}m@f6;D`7y((QKbdvgBbgBN|U``bXlDOHxZ={FniQ#3VqeOiu({DL!WFOeT@YWu(U#2@fN- zYjMzdX&kYF890=nsijf;+ezsqijk z$al4+I;oyle{GSIaO^mA6!twk0sz?UV0QM;L<&o3Zj8bbS6su*(=9++uoDZIt_4&x z)o#Q%B7>CX##GJUdHf8xO|Ez|0_+AuaSVz7D>xtQeHjZyG!%?>l7mFj3B1t;~; zgWh#+qw2;MV#~+OI)qr!o8HTt+m3Y>M|^MANX*7N42Ir5*%$&O!2cy;hx7rFrOawN zKHU*JXNfoO0pM?gZ(o)P>2dYL`4P`Dpi(i66Fq%*!>Mfm00l(>pWN8F34cx=Tpe*X zJllP4Agd0$K*OZe2>{e`${1&OYb`*7PSm$gzG6j39<$H+kY(TSv`vtw}bnL9m5s?$B(V?4i3K6mi9y376i6>wpBsHqCm(YD@*YR2)y#~g+WgD_6--c<68 z9a1%*EQCYo9c3#@nXYG-6s!r|$7gu^8H{H9DB*ozf!8KPYmjR;!gv6^rtx`O05K8^ zC|M5z;p?Qyw1ST_Mx!N)AO+)dK11j({5oY40|l(}S?}N6AmdJsATTBqq>y~Xn}YvM z3;w%U1f9@Z`=vfe@80pKUTada77k#E!Jnz*GY)$){(4zHr=`9deXM=}CtUDLO;Bt% z8&Xj9%D?41r`B>TMh|7J3sdOu;)>P+A#+py5jbH`AkDtj_0~_^_@m5JfQs0^$sPP1 z8p%z$t`W*QE3p^O@X)9g8gd~XV$+At91eR_DnaC9Tfs2`pxn(6~eq31~-OZooQ052Q zhTG~d3F62e8=1++UdBqet;|^pkbK_-zfK2U+AGCU!RU7%(Zk^$vQj+?h{l0td2>(e ziabJGQ!Ri&)Vng~QL_SooX&Q8s{dhIGEF!VI<(aZb#z7SzeZfsXVKI#s@On~IO%oo zuoy?|bhV#rb&``($YX;ivc zIoL|@+$b?r{>g-yJS7PCAOk!2^xnBo*u3+Is|lKX9-27gD}*@AhNht3X=jK032|`5 z-Y#hkSmbAz1HoZ^6**6l&0;G#DDT5fN>?ABlK3iWB_uc3#?_&s3=10a@)-#*fRm zduN7N*i9_NHq}kC3PJ~I{Xq12qQ&W_q-OpTJ3y}H>>bav-%{834h)mGMnPfv2wwam z4ZOcWnmPf(+3&DgF>R~XZK2Sj8ZT7#SHP-J>HYKp7NMN${p%}xubW7^uVdu$$Q-86 zyyH?e){CnLnqzD;8T>iGd@O#yrkXA{Y>&9W3;;7yH8dlvLLC*sW5=Zv5-gkH^`1Fv zbWTH}=?M}5_s}%*YrLYFxPfP}4?#{82WUa8wbyS+%FOtMSfSPqNi@#U8gXy;mYF8nmoPoV=K+?Akp6X+|xqTBQE((KPu}cZpYf67(SlN%w zMwnDpZPMk3m*F55oTnAkfse#TU zXRFu@ndWUEfv5n@*eMsjag!rE7x5QKDmhqZd^TFrnt+ZH1xcEHW2LMvKQoW#ys&80 zbP<7*txPk;J|&ftEpo2r17qZfyVdfr4q$B%|GSiuPNbcv+SCBHgqs}#kBralS;|= z>rHlihI_Y-EObn$lVciyr~R%_G0s7uy_&qBm@`aWm#gwUZN@^w;BF73E11O7Sxg$tx6{usS-x|(`*$$C(4U=9#@$AyeQpWvsbTa8k zk$^~DVI~pBdA~dH;=lDj#I0u*eo1UW!?9Lu^8MDGv9qZurQfe|=`{@^yqj0AU!7}c zwtk{_9Us6=(!wWnrHiVz_MdM2Q7FqRM_HrGI3#pMcX$0;JcpZKi#{?)tXfv z2fqb#s-rC&#(lbW?&6Vra@kI<5YtFN@0oWsg^e)Durti|xZ0ZMZ;)u0Ox-u2(Gc%0 z%tADRH2?XUQzk5Grjd=GSS%S<{k~;32pY~*wa2-@6vqmr#t(PY58&W*75B}?Y(1sqMQADNHd{Jc z88L>C(>7U)0dP+CLqTo*cHmi{3k?pt!r7YU8;esU-QWFDNyp@3arDwIgl7@Wlg)T< zECKsFaeXUwV6mHLVStlsvN$>=_U?ZIHM!Qh4v z1Y|%^l@JTxB$Gn;wK;i{BW99(Sp9Nv@8GlJSq?mRF<^V)l$`yqj^iW6WJ6vmrqSo~ zNwb@`J|z3HzS;Sc2{=y7Szur^mep=d&D}bI zIaK_zvqceG+8b$Sbn~EoiIgG&bkxp@izWgA=ZFO^z}L%KYnDY14<;;Hq?>D?mwbO_AM%Q|n zror`q_cf~lA(^f^^o5!G^M*Oo}ziaaC@YjuA zh}Z2~XGmKf5Wn_VP`+9hluU7%BpSVh3l;=hEY9#`J@v%?uCzc^Sno5HXKse;oAmG7 z<;E9_#hSIF*{9@9`Q>u;wbZKG#=e!+H zjb?erJF%Pemr$TeiZ->j3^VNEKcbH9z&i#!OU`2Iy(;`aajB%;!v@MKeOKidmb}kI zY>`74Gvt_oQh*mtKEiDEkKY?;H`NUw92E@UyJ&Ap>U5Cq1x88KS@UCocP! zsr6x=k+RG!nu=`P&2{IXibl+QP5OmY%fFhj4qi^%fmrg333y7$biW$Rna&22Q>pH4 zY&?zzVeN(TTLTUoL(l(sxQ3MeP<{pgPR|s~8fD8ZhUiec;XPhYy)=9I2FsElnwcTB z@4klh@OgZJ-S^560fAE{d;1QnOZd;UTm&Vl7$fYjO)K90;Ro`oae0n)StHFdk59_4@mrZ!{Ms%mqHud^J~_b491 zu=e#iwg*jbZ^d68UkjsZ2pZ+cgtM;uG71l$cs?EAA~UJFnin^twtgc&3FU%lW)!|9 z;N*BM`@kw6os-%YM8%cU55wD6*>GP)4H;Haw;1%U?afs7SfyzTj5xFzCW=|cpLCPz zeYxVElg9*1Ux_AOZVH8QSc049hi4JHsoY6NoV=U)?~tong5NF9dRenhNoz>E>ZgwyxI5jIiO%{smH66t=XosndE3(tY3 zgAggoMuTusl^dg3DguPHnPb5J#1Z!`5nfxK3_iw5Wfly55>O^312$5SpP+*Gm|+4P zl^;*gq2gv5K$}QHa)r-=DG2n4-_x0NO{150*>%wT3AsZX9t-7B z!t)oPvV)gnh7{D~!u8tr?()MqJnT6U3Q!84Obq(FY<6F-FNZ03ls> zkjryH9!4hI5oNXzYt2w0w));YPnZf00bco(d zYLpE;W)gToJLl#L7wKmT+H`qjH#zh4l#_t!!;;yKD})>#D9_hJAwHd*hfr}n7iW|ztjriM51o^YajsnCmbI%Te7+^4 z?o;W#ESa%S2Wh6$n}#{e)JHV%nKJT0Mcc1m=o|umXxYboI0i7XAzD1>avJJ)p_@f% zZ6Dj;Xyy0u#2_*3(~zDrq9wS26^dmuM?w5p{&?O6q<3J{SHe6P{CvIgZKynUVLGL- z;W={Xb2}cl@c=!gVxwdM|FpW;L;&Iv_r=kX6fdKU7rk+f22OP#vw|TIa}%%F5};i7 z#QqFl17|F((hu_HpCo)|Qz_}#vn)uQAL|T}b7elmwzn|+X|*bY@cr#%(mWpJz3l*< z62)$+)D+;9D6qt=V`eENxh_S?LVdTrOz>Pff|}=GtvkA++vhdno7u}smPnGD-im1r zPJHsn%I^GD^?~)lzuGlK?DD6*%~}!JT(bfdKh3N3>*eziYAIAuXb@$sEq63U*{g{; zirANXZKFCFuhqF(X0N0*e=;M9XIS4*&{&BH49*^vU|AC`k}>i&D(nT zj@7#AnY9jXB88`sL^AC)mJWEZa=dwzoy(l5$dlWthoKFD-9j^i$W*?Bk ztsgH1Um(tctnk@64!3f6kuU##_%cmItc8{pDH_|Q7$R7Sf~de>hLsZ7d-+lh+)E>dsCBKY}#uD1?)x2}r%; z8%m27KHal^UvO44KR?=C>>QZV38#N#V=lqL000H+L7(kd$wQFLcU3}xnl?In?n~}H z-mX6fvFVYea!($9=V+h^w>Lz*h48eCn7jDe!8c%X<2`QI)v{&8Aes)#ZgaivJR1iU-FByL z%9F@j==q6@$A&}926f)UiYV=hM~hLNgyT6)7)b$+dhhTeXa`2{b39umIp4=y#}Kgc zyw)z;&VAQaT?-)(7?)S!KfN_vpy8voh7mh=Cz^1XGjjv7M}C=itL`deK%Ba^y)Wghz&pyOR%sLqUlZorwJ$W_B=F!%>kj{f^#Q>k4$|TKtBq1i#tpKL zZY#|rF0K1B@^|AelbOvAmFED!JL>LWk?QWf-4Qn^W-^6^1sRW=yIfy%E00S}r}x`n zU9dKG)6;?(A7D5|0y&&83>JED&JXtf&;jEQKiyU3`Nh#0LZhbk&0W1n_x$P=0|r8c zgHo*l{7(v_3xLxY(%R&2F^eOjA`Hhjve4~B(ke2RN!8XDACes^0crlPjoeu_QV{Jb zDC8-JA7$dwYYX{3?!GAGStPlR{&QH?;pL{M3@$h&in^A5|G}F5r!qnLLy|;(KUFS3 zvq1eJLrWpHlV5A3*ny>8>;BCFbZH*mi?8asUX^RKdbY65=hF{QaK7 z#o*k?MxRQXNpp_{or=wPh*_zPNk7NJ9wgRXDdsN zgC1It4a4sZDPLWD-gk=Lqgw4)UPhZ#&B_fvkFE8zkG-U;Ev^CWoL6hOeRwyA^ezhu4km2i11rqb z#%mwRluGkZ6z3o1Y(QtvfV3h-O$ED`G9Pk zjocJh)O%f`$#0DHimbHEr+6cXaC=4g|^Hp+u25F~P zWZSqePgQYtI>wClfR&Y3irj0*=5QI}={2qkwq+Z|(6WlIqhhC{!$LgP{nGe971V1* z6!TILIU0*++u;AZoW!@(9G>Zib^7W^Tw20=s;&IipvMSE-yTp=H4018oZO*ppnecc zvBd)5`vF=-2%=L2OCu&_s`coxKQG*Ovn7k8{EH}Ot&*bw_t=bt2M+iK0KvKBZ8Y#` z?zs5vke$?`J;&X@h*_Ey&(dx=1mgSVvTs2s!s+XZ&UKDWf;KT_5@O82-;n+#4x4FM zjh2@QtxFOo58l7DbX_M{^d@3mliWTig(s+krg0`y%K+!V=bgzBh1?Tzyf=2_6j%$< zh=N-*a}wK9+fNgQx%=F(r;zmossn}J5&~({f8D7_u8*Ps0T3Vn00ij)pZ%D*34d%C zh7YrRD7Nc38a=@VQO$%9m^%Ksj%|@g#>3wZZn>qDii9x2dlC&qlyQvq0 zZ3Xvl_=OsmTW{V>Rp>PwmS^)a^`l5@5Z`AZ%lwu2)Oj?THhsdMDc-C|TR=9Z4G0@? z(8Y>?wkC*{ZqZf*w)${#<`-7`$45}Uu3-~uQ%Yz!6x~@lv`XanwZ=H1Pc>0Dzo|^l z%jzJ&jgZSR86lU7LB2Yh@@OuRiSEF2zCH?)P23$k^1hgDs*XF=PY ztM016#Q)M5t#mv8C98bK;?skk1WPqRTqrqUGnM#@tWV@xx1J)<{L)Z5BLogj!#n}x zsSz!}?K!uj%h9F6y!+>Y6Y$b9XE=0T*86}Npai2bF4nhi!8t+wL3_v!=!4&`2BLJ6 z#`G{H#qt4$Z8_jDPJ*Rtw9yEI{Pa@j5NuO@Y}mXuhmT(FSUNRRLEmppDaW=tUkl`; zYICrCYXLb)q-#M3x*#ML%d`59PF^#A95aqiBYF`?%#!JNq39Clln~I>yi6wHjU0J- ze^D56oY34OnL0+Td+WcYWDnLlGqXKiRb}4Zzp$7ZVdYlN7dn2RI9T7 z^(J3A2nuUT**Jhy`=_p*6f#ZMOi%LVwqD(YIO%?`GJ(e$dM9AsN!LG64dD$o?R5KE z@y+X*GhHou*D-&Eq>9sHlBV9m)xX`^`?XB~9l8o3MzdDF^?dhfEAb8b^Pct{M->=W z(6&5y{;0D!ZZdiVF&>9Sw%dJ!12+!UD)gRU+KvldT6FMiG^)813_m3Eq5l@u-ov=N z1%{mxH-im7K`n?)ri;8dXOS_?Lc|3I{E7&i-d}?OfP3;h)-OH&(~U};+H1N60xa6U zX8~gTS(B?1ajV$GS_g6i=flz+@IvRCum$0B{(mO22S;~=*g=C_magRmCruq9MIM*2 zR@8Alk$pUCtPY4;Nxbx8$y#f^()DL&lV#bLF|`~P;fPyCN%;mb-dkMbcI0i4>1`^i zG?NE#{%p$#eJBalaUWD4pyJxcZ3jFiS>Cl)YC7d?eXc|nnNTldBrsjC=?FytdJUd@;rR@sO zdl^5tej^aCoB9HqKQKX4X(|8|>n}qyJKXovWiuMNyt_zpNvcrIQwlImi3;g5YtlKd9uz^jZ4$vJ2_*yZHIaf9+n4AdQ^$ zRg-puFUheSy${xuH>iFx*szjzR9X)|bA7`QY<$M{;=?9e4K*qfjW22y?IpuItNVd! z$`D7qeDgMS+IjiKuze*B;V^K0_<2*?I9x)FIeBLw*e_$xhAd&6I84_2H(Qxlu<=UB2xXjpBrG;$FSil?|sM)Gd#olOf z000xBL7V=~K?2&^+S=NaDS!X~N&l8V?kwn$d_9SuEP$TJZDWF8CJ7J%=L~14qr!_Q z!&XedHQ^R-!&|Hv@ADNI+qqw9wqkm4Ebqy>u$tXb4-7bk^>I01Q)kQ>$t0x5xWR^u zNiwuXDeR>^=cKQ2R$8|OhkephtG)B^L@kRr8uIz_XlELFy9&3v1%463JXku)W^psY z*qE9zJL!hh(*hBVx%!qv!!jBg@{=>*P>SwC92Rd z=dpKp$TdO-AyQJPwX^W)X4z&db&c%P)EQUvcr0Gw7R#pig6I(rRD`(RKX}g~@&$VS zm{`fNFJuD0q=QSNDBqrs!%wE6;S`CQE#9|aR9z3K2+w%7tGva>>Gl-l<&y6*p#y7% zdOLj()J=@y4sNY)bH{jQ5r?&>T8af{?w{z4dt{;&9)*2#0T|AlW}lC*p1k_^d@APx zewd}lqQj9YgXcrgJRDvymt9rz5uN{moA}2BPpX@7z+Q^C->*4l^AHRCyW+!)y4%{iS%|@Wr5Y z);y7z&3p;l4c^s^ZzeGx{9sltZBR%`{~M(_yYtNR@7y3RgFQfPKtTgog7^`~XH~$J zE=o_=eE3$-4o^^GNq~poc6Q)*U?@z(H$sG-SEB(LpdqSy%yyj*s z!$P&JB&x1fkS25>Kt=P}byFV2&QvU$bC{LwGme8v7ak|Wm@~?b4$;P zgPy3!S@VFT2^01OPshZWEKT@dmNP(ZvXdpzsaVdu!TizLI94^`2{m&6XXfY0dV7JLZWg(w z-op>3ds9fN(4x|mrS}pk z9MYqkA<_AX7_TRW3e=J2@9kQbf(4SR2BdeHV?E z(qARI3aFg3*>Jc#ICY-3jShgNpTa2D6piDRW0mGmn+CG!46IRL#>F|T%@xymszxwU+yc?zxwi4Vn^cW8&$;vV|F#isHsRWx z5!T6R3n^k2g%3McTyI;yzmxuBv6KYf!uQDiMRS7|`h0>{Y{A)H{l4_*R~(y-3JJD} zbkf^G9I_MF7dqevCMn$fKT2pDPQe3g0dB*jSEqR{s9(6ZtvYaFPlaOzi+|e8blUs$ z_r#{?lH@+4l%Feum^&X`U?2*B5T-&zd<-83q4xm@JB)2StF!ik-aSlA&E4>)E{Ngv z(NIDY61;HqMig3z$>1{3gyfAmekzg;AM@jV^oDqvhb}mvv`8NEX5gcb@w#S z=7+R~4|tUhw>8`>Os*}dK~bDoF5c<#6tt#NSpTBltStikL>GgoIBCu7HP^`NZacjY z3ol>3kZr=oRy9CGA8B2r>a++;SP?%7nRJi-`0Lq?&anSbFnw;A$`izDwb-RNyVt8QgEIK>{8EF^+j_WocrUX0 zI|;&k*}`IyvUgrR+b@ihb&VU0tOb?@R%L@w0S08o=broB6+n*8_WJKS8zY$ERe`_<1QCR8#he zkE&*{pj9XXqS406A~4PX%2!_$fEzUJ0!y#-$Uy5G69BKi1zoLj6}0*lH-&kU%3H9R z-2$XhkEc~{%>NWlqdutlaYI$@65l{LSZDAO?oa;!&e1mu?gfO`$}j_a(LgH4=r zm~2hiQ>8kqLt;ts6T0=fm;aObtJsAmI0}UpTE$roTA1EErj?FrFjgNLlBNmfbGuo} z0>fr~-@LOuBolRm7unvR@Xxq|#J3Pjx7ZNQ_f=Kh#EQK=ykM3Fb<{%eclN`_yG)zd zdwsx41Vg{hbSODn_| zx05NZ$M)(xSCfnGO?rT#cmBG4{&QKG^BdKqhn_i`QT4=xC~f|%XpyZ4484jA8?#Hg ztzwC2-#owEakTFTdQ2dJbh-Q-U`|5eXs`CFk?HoyS|*s$e|yf8xE2epY7#aI!w3yw z;8fJ;1Jg(&N?g{nzkdY$i6ZaA?AdcI=i66;va^L}iN-?A8mo@3%@S zX@DHnl9O{nmXWBOuB)CULB=XHq7P5o>^<(=VwNGQ)0wy;16N&$u4mgD|CGl4TxwT=leD4}`~; zgd!l(De|i!uv_fXdd`I^{f#`$uD!kT%>1*DN)%hV#p8Dl71Ao?J=m9`cpBv_O) zW1F{e#W6Nk2Ok3B0PSxL=%Y`|6bJoVa?67$*O^C?f4|nfOvp!rGJXLNz1Z@RTv0UP zOz7Cn0kTvhqxXj8&V~1V?OPdy*sBYQxX`KP^PBg$sy#h1B)aryflSpjgMCYp>sa3*s_MAHJP)wff)fO(^k3ns; zfaL!>h41QYN;j6$O_lN2h~2NRr?Ht|XJ+)lY)$K6^}nmho@uYcPiN}!vG}C4uAgVt z-~!A#v;?=yNO(zW*eounH+SW<$-XrPHBa;xzjx^ebB0NTRp5E7#m^&-9-?32h+Z~D zuYn%*S`^_cmYx1nh`i`^c5>!VHuIV;-8zgSVnYjal!$0@zQLn06H%6>Gw`)h@hc?g z*j%4d$>^ABaj7b#m0ERrO0V;F7-}&;sa}4;V8Pc|_O#{nU%4fjMbWehYQ(R9q|I(7&u%G%F);)1EggP`uSnc$n9g zwz!y8n`94A1TH8vnFu^?e*y(2f@C~SmG&Yg1^YQ+f8uUBJOrG4(itp01E0kb>7bhw zJC<$UF!fa5ZL&Z=nw1k3wFh(D*8I{s*1ge_)svHxqN#C-WA@GnYmhK)^X7G+SC<{5?UxU}oG{ieRO`y!2 zXj!poIQIQ2-Xq^mYKE}AN`=@AYhOvU4fE0eS(5-h)2%Z2e}Pmp5PI;!$>6Ru=U!GC z-)5)W1g(@Xke@x=6*rhsf9eJNAQE&-UAe=?zU;`Y$K|aOV}M!M=a>|0tyz=iA#d%MbK{%Lq|I}~E=b53v7V;`QG3tG%6+U~7okIVqu`V@ zvGs8AKlHO+?K6)wk0hiw?hR3|lw4D6y4lr^XZg@Wh;R#AL>_G%v!$oQ9BmF$`TfcP zTuOPHsgnIl&X$9 zYfe8pF?s|nogd`-^x;=GrLqY9O%tswSdv_o(Z>lTHBiMjM|R(c+L z+2;2}+Rq>aPK{&2@lcPe{2UVLziTyvNyAVm3U*g+QEtFx55DM4%=jhNIlXD{Un~<# z3VS&55(M*OY~uUE_o=b?Pu9FQo2Bg!gqB-xgZzeqeZY`=6ZiW!pcF=~IIAGx3C?nrs^BDMnS6Z z)J^xe;{puhcyFluA$l_D14rX4>O;?EHkZaEhlX1P+Yz?u>|V-SWai#Gmf3W#t~NFLjmrnR zbMLlUii-D8{dvnO`!OQ(H%j;E*BOb0ZSI>*)%f-e-LTeQKd*BJvaYKbKj3tTdREK~ z(N+mdgpRWnlzMTxM7d=nAXhmLHHQ&ZDakl>Iv^!2UEw?&j3bAg(|jcF{Wv{mvWYC`L~2kCx#cauC%FrPh$iHLt{ zJwbdyv|nltD=)+@nZ;w7*hq6+wYigF0Wx71B4)@Z$OkMcoJMCIp+aS@s{qf8vA+{P zJ`BEl!=d2#qzPY)D@}G-kdKKqbD17Jjqk87v!R_v>e8fx9W4v4NdN zQSLF0xD9YGWE%A?`T$X6HZIYNfBd)0VX$Ohzhfs=uU*aKi1Xw)Xz(I@J5Af{$e0*w zbhDbzH>bQVygiuZ$B|u7AW;jI3J~e6#2~f^3}WYqiakRF^8k1LDEqd29%hbP2BIzIZ0eEaG$V^i=3$Uv z>TRlqqO_tMSP2vk6XfjQILAxHUr;OxQ$$Td5FzLLQDEo3LG92uD0QKX@q)wE;e30^ znvHT{Z-zz-U8-pwC0s@g*i&}AJ+X$RyjqA4^0_!^Q39XFFqjw>{|IPOK5gg`n^kWc z^!?-)jnlAWYM%pWI(us2d+V$4p_-U5Zq^1 z0sP=DwXxt?g9x0ScNKskNglFT$&{IEG>u_V=-}DOl25_A>C48u4Y7sERF84#IqpYp z=e|!6j}5o&r=Hn)^tg?+K9c+^Y#7B?AEJ?lR`Ha6125D)laTNVh836?x4*{)z&Eu9 zchUrA-_i?PLNyxhSr2eV>Gp0fmSmZp#lKt?gWAo#)KH(3Xng$=T*;*7zs8L~A|N=& zMys`NV`<2&P`&`><3Ei(Sob@2UPCJW?)(&~xadR}D)H<;#j&rD98X5Xv#DeUV>qAT z7GU}H23`$b5!TbmSd=Em{Hq!f+2+KP1tH;efL9%lPIf*6pfq|<8c2@$VTBHmq zA0bmaV~dMs8T=q2)B&$iw(9xN`TDqP&+((`4|Q84gMDGs+i2TeG%0Mvs#%U`U1sWu zAMU|iU=RL@3Iynxp(5sk7Q5N7^th>7#KKb0jwpW0V{WsKrFUFwf&}j`zNCtRrzPSj zAnG&zzbcqGygl(dKUCiClVb$Q`T7R!v<1ANdEf58ysraX`^wT*dZ^Z5`B+n&MXRtp ze1}U&p4E0+ZeKK$?)X`11G2|5023dObnP+R`%w82E1l@rYo?L8YKH@OO+!XskOBBf z-@+5+gd`rHS!dJeaT>BP>2KHMu10s@t^aG}N~e|aU(G{g1zarIJhx>Er1RbL|JILASOFCl!sD z@?uE085Bi72UX>cmx9mtNcEW|pN_xXg7Zk9jpCvz;(;*BX8H033g}sxJ{cXD4Yx3V z(89!tX0v;g6%k|Yk`>2SS~L>pW`V{RFVU1{omhBrW9C))`5!&3dN5^G>qF7=PfPjd zc!pSefkZ>Vo~|EY&-RxcLQQL{20IgeTod8L=uan>-3vEG=z@;=*en+1m9lLwgT~Y? z%#AC=TECjL+gCdk_X$#C>UCHp? z0Ant@lS=Lai>O~>b-nT4k%^5iZt5xMxo$1v`TOW0-0;_!J`a+ghaM~v(5?QASD;Y~ zU~?>1jbP=&SnCZTG$}xrqDzk;ZOST}scO^DUyH;2;8~`}GA$uU;?EweBp5Ozh7!MI z?WDhyiATGi2&p+IHGLwDRV05*AJq}z`Q60$UD+-v7NMhhP<%-QPJo0Ta7`^8 zVaY>lcfhYVUJQVPiL;b?)F6IWQV@4`w`~a9~xN1AOb++xPumK6t zz9rk73Bg>;+M2W-KRo-}Ny&j3(rwK-TsB{$z>VA=I}Do|s0(itVfq}@lYOAO2*j|* z+u-(kMm0-Y_M)!F1r19WL_|f)<6%ESOqX7r;nuKf>9omUJYne8iD45VP!Mx|qkPik z3IfE8I8gOc)O>yIaT7FU56o}go4#0KO7J3tK_$W%iAx^E2NM~Z7!=Z_(O?j%c{}DI zW32f3#6{2$Nj3cz=55Hc-;HB@p(vMX0@{EG~CGxGGGu>m!dBf*m zUud_QklxxEo{|B2yBZP#cA-)@3N(D#qY5!b z!@%jsD2@^k#BKCMB77q(BVkaMkCIDD%YaEBYIrpqS(#rq0li^sZD>#QsoFYxkyWgW zf$N|2fqQ0KD37P8MPT`f7ogAhjk5wrM^SNk4@ibX; zjeYd&@p!cG(R3L9shqHE1$B>`OJ%QwW>U|37M$H!=TGXjh3u$U_SR#D%V)f+FUPI2 zrYItx4<;?i>(eB%vU1UufW2z9B%>pNADE*Pr;|Q?IGTx}$%h|H=|JZA+oDbA-Y`2_ zQ`>%gInC@Hp`YSxE0A~bMw~wJe&~%|dE#DTkie@*PcCC#XPMgdz~ZjcSPzKYc&0Z1 z?*Z?rl<7*<%K2xCQz2MiA-^x!-{DSyv{Ua)@Cts<^b$9Nz^z+)MFTP{+&Y zA!kWAO-@btw3nmD5+SAa3ZMY;Or#R7kOPvyA21*f^wN1XAwaqxkB>*G}z$eACw1F_rdI z*VZSRGQB{|xy>C9{#exUWHyA6z^~n6hq{5(yz2SzbKZ0-U7*xxYVKxQ1mUACS+Kgg zdFI~A9Q>U|f#U?)h5c6r^Uq3WL3j&?a-#1)jOS<;qxtsVlMUg84=R4R&5_goayP%isvY#eG9zN-o=p##M(N82+uXR$%nF1!1dZoX7&+ zDJ9Q@Zkqbp*#@Wy4kGM5fD^y@%y`q7H0bb zLHA$f4tyi;X@}<9DewRE`yk+PvmN%j={fCNjwfSfcQ!b;G{REE%qjEvCxYxFO4X{$ z$Rcm*cc!?IT*^3A%FAETgPKAO7aHeD3jLe>?Zj&%PFumxf5|=;0C%aoLIx|;NUfar z#nv)LfPZh#1v5#R@@}d~uR5eL;ya9AUBn%)EYdEFs6T2Y%_Ah15m-P9#KGP`aCg<> zG0X?R?K5G#&Sm>3vY1j>MGWB?nGT#$`*KKl90jZ9V6<}LZg~lM8ZOIzl0qEZoQET< z3b?<8mfWb&NTxR|T@Fc(@HFV~rt;{)L8(*NR&q{drnKb}1;o;Z|NLaCKK&Ts6o2N* zXU@u@(+;H27|1*zPQ1$qoM9qi82J`unmPWntgYV#HME?=WbUueV~knDhv$~Bp_j4i zW^{e;f!&eITgjqMsg!aBK+`&ZRg!wdr7 zk6hYwb1#(+jt;m*I_^Pl*VH%m7n$|JIEwivo(#Mb5arg7uyMCT*e&E98)w2F=y_A& zqb)t6o-5DA?Oxh)y-LHP4_|M*DR{uE?pqZG9|*^#FdOpbufL<>j(EYWL;5S#jy$+> zJ^GBzer1NDZ;eS`E;mJjyRc{9xC3752o+`uX7_UCD$mqYH*K;j#4e<&APo9vT3pZ6 z!R=9Qd`>d^pIGV(*KzV)^=J9S?;N3!$MmZ{)0oZ`f_VfKjR{qMm{_$szuTM0KZ*Sx zYlg5{XYmfx&7!J3pIGYw-x8I?unhqIW>=07wEs3*;h@MDZEmbA(>l#?DKpKiHXp!n z2=cMIbfzZ0;y))`0L1S)*N>E0W^{Fss1h!$9nFUCW|L4;5?%a~0;&^-$mP<_R9{JQ z3yv^MHOdVUAqNQ5U748aTwU`LduXKBf>h?h9(rkJQQJ>}*7?$MK%8AEZD7lTWxEu0 zKkj<-UahA-UXoBtSl9u7OZSNh|MWJ&TOnW67%LLr_o#9TBTvpmrM38Qz8u1hqZ*bO zc-hqqkhqAC5O*hSSvSwZ$KIZ>g_$C6zXE!I%b!~V%vDDuxWCP9OD!H`k8tZl+h!+!q*fT}oF^bU{i8}MUDyzD8U+a(qL*-Wi65f9%5Fz5Je4H=8} zBgL!Mcv5s@M`-{rUeO_39Y*;2HWCvP!VzJ8b`I}{_CF+bQi8&z{@X=(xahm5r-&2P z1rA42<^Vm5V0CNpxIF#W;CS+zT_k|;v@1Qqi@~k<3&2`(P)!s!aBrcD zx%?EU0Ud|Z+Ao~kMzpehF`Xc0H3;(`<#_#UP)BQDJP?6PJk?@XM5ST(Ht&Dwua5ZB zK07p{8JnJv@Evr?;6Vb_6H?>ny_rcX<^{8LxEdb(y=OD}B1H$A`Qp%Zonf-?!~#y^ z?DRy_zt-SW1-b9*hV5Ich#7` zgcuYwz%$3J)51L;b#J{<&nZP`^`uY!L|iz%v_io6AyK3^;;|!F_~cM3SLZ7n!y_~O zaZ$maw{u*@R+4`up8+;>9aV^$hx=~QA2 z>*s&^HDxQGyi`gOekCs4;x$4R26SRznzuxzn0K%oI$JJum2eL)le6B8Gz&>=Cc}~> zP?Aw6={PcAIL_h-TsbK*CvPVgtR+Y9a9-M z{&7J;m8la?Hf{#)oER_vc%2Q+yHI26?5)gZ5Vd_?MSLor2)2L_h zv{j#C-{y*v^Kj1_KDr!cq{H_0GT6c5D+a+@E@LEN z+jsNA@MHe=dq%YFS{sq26fX5vGW*ibJYj7+RZH_UY6By;o}zqw`^ZS>-!76Chl$xJw1nz3 zs9TPi$EhjmE9==a+Bu{!$sfg}&~#h?nhu~AwxCO+o!lGxn5>SmKe)lYW(z=(Rhz66 zgTxXz19$*as%AjQ+V3!T$gD20q;lPpq1wy#qY_x7plEx;OWvD;NXAX^_v#wqx&snhMCSnpY7EwmJ<<3&`-G8`p03ibSn~74b*xj03U}K!)eTIwmt4TyB%MOP zUth0LkbRs;F4s)~+6(Ow*23)TEW!PYOUD>9u{A$sG)XKsd@`ZVb{kvajrZ>5bH||e z*TBomokw;+k>fz;J(B%o|Jmqh#`CPZ#v^>llRJdnwau?wumKs2O|4OrSVVB3p^SQX zGiS{uH=nwG>f#$Tti$(zGyo6Iq>X#%fgf-hBA0e8#b&{(U|RS^=tZjB<`lK*s?QIE zdSwMz+YSHhM zdbN{eR4W74=Q||83PU@cTKxZ4X{<`tl4Q2$>It-i@YEZk3%=Sz)2qj1Ix(wu$Q(^5 zUE>^i-pW+vazAE4?^^mC!nUwAM#r(Sz)jp&Tv6HIjqQT1Q7W4_n42${!DU{i6ZS#o zU5;5PZMD_UC3hu&LR_eRINpCc(kT~HaIHmX^oorF>PEtRu}+?VgDmA|Bp2TTl@2#f@ezmoGn8&1(0k{Dd)T$X}<|peZIwANbsA^ z@OR&$>tm8hKEMC~6Rbg+ACcOE2q0TqTU%RFbktA)00RO~XVg`3Y_*0`Oiw8(1DKBU z;}s!Y=dl=zJ;nxdY!Q{90iMm#j!6WJ>A=e)KNBOkh)?evJS++fbYy<(SW1A!;!&py zW4E6`Gy+$d)DU|JH>7z?LN~*s_f$6GkO;_2nop`#-VM4$KqE!DTAd_KL<1XHtX}Cc zL{*^06bw5m(Gg8>$h znQF}VWew%^%J3;vUFZNBe;pb8?6K}uNA%Ypb7?mW{Wawph)q1U}JET5Ah@&Gb zkaj*S?rY_2CV^dl2I&!g_mI$2HHlf@7?6Hv=}<+xoS7tcmZ%iRF@QKz9@Wr%IaPtZ zqVgB6OL-8RjqOXq)R=Dw9*KmX<`G?--uoV>)LmqdM=eP~^(&|0VbAdXD;tu(1_O2$ zLcAsp_PT6~W8OQ%8DaqNtwB!LS5xR0CR&01pji{FyUo+bPONs!XY^vAwP4i;jV1K~ z4B?Rr6ua7$bD0?qDHHGVv-Ma4X>dMH#L6E;Cb#EUe9nH6427O=N5l0PmVj%glXZH~ z)wT11WsH2-#;Cvoo6`~W$a4W&-f^5=C%^s<5LUl$R)#bL(A#1&2wq;w*qPk`B_~P3 zPjR~k-53F>W9ZhCc@PKG*U`y!h{OEvn%ojYcgt>X_hV02X5CYrvT>efJ&_}vvB1Q* zExYpJJ2Dy>51AFcR_&!8jAv4KOxPr;)$GDm`*1QI>`#0 z*)o#Rg>fY-g<0Fz43dV0q!@oPFkOt6faCEC-B~ypr4V5)p1q~pd5=~bk~yt8ElDY+ zy#e&>Fp;>3sXAi}YQiH3#XNviT*Ryc5aQ~((pTb>>?QK*J3Pv2K%?IV;D%!a@;4Jw zEQ3+lDLe0wV82_>QzjJi3!6B}Y_KKqO@64(P{`m!kHb*u(%m1{EcQfsg4QXj$R;SNZF0#&@-fqh}(5UJ={caX5VQ?6M z32mwn?p4fN$f9L8 zuyxCp_XWJC(}Ou&#jy~)EARBp;bt~D^JX`d4IHwJ9(sTwBXIfTERJlmQbVZ{<9avg zZu#wl>&;ye=_`Ez9B@@Cc;96efjTg0_7&O)?CeVUR+iPeci`NJBy}fjKfy;bXb@)g z_M8wOU()`FMB(U49H4Kv6`Uy}#p1sjOuQXOr3Qw7%4t?{676-7EvT)*Jc`&SOq#z& z7W`31+3q6z^GAD8Z^6biHQg(hYLQtqTlw@7x&~zB4r!`53bQ1*4&W2PwGuArrXLB; zFMrWIoBCNC#)c<_;beiW9i?V!5bM6$5F;lrvGR?q4rd;DK_G_w)Ia<%hLpc2P;JJ9w-LKweJ}r)) zQ(<%Q`K|YR1&L+qLVx9VgM#4P_H&p*%K0&g8ajE#U42(hNP}!;GlEzQ*O5D&jS|ba zYWR%tu9TD#$UpIpcCYO>LF$rpn1et-J#g` z34Ud_q!!U8{|{I$(k4F!vtz1on#6Eps;N9IJ!K}4wJdl8niNkwD zp8R|fSe@ja-pXv(bgsLrWzp+!2)AbCh9yL-wi<-w_*2kMTlV!XUXTZH@v(mIMamw~%a0pPUWLlmX_n zWl=q7Cju0@$TmS|_u#)=@-P`YM-pP{p7BnQFo}JwUxAU(XglBsT@dz!A#?1LmD6Ge zyHxJ}t&aIr4xnsZt7BxgAI3Eeo&jSDZy<8V+2pJA_#uxWr3d`dZ&<%jGXwiZ6#o>4 zrUkZqDlP$E;hF%}=$ifPIP9H{(EKRj=mkK)7`ng_>Oy?kOWWBj{ z<97`fvhHe%L}hjJMCHAMlI#jE{*`)l*qBKC`=8Vhm2>qvL7-+Hd_bx9ZL}=MW_QrH zpjUZJ6>#|@E@&g9Xm#mT=9pz2SMQ=tzT#-sa^l6?J*KOA*A6*UvHFEI=W`-Pv0G&A z(psT8e&f$HA?DKh0TiN<3uYaj{0&@FGe}0Uwd0`L zF<~@uAUy5`kW>P4J4z+Xl(_wpjmPZSV&~G%P&mzpy8-(t32~*wn;M*sfH2Q71wRir_my8Dw++FMWVPvT<<+&GFKEUt z7)jKNKbY54;|>h*&d;D1NwL#71Hz$=kAZ~(+UTl%?a)>M-4RHuXdD8KpJN~ZJfMcr zWHUgnaHUb>B+$15Qqn;PH8Oz^RtSDFbkaTv-RESYbKH|WX^PGSd#c}}p9&c$s^k+eJ_M-27)v}= zCtLgmgh*9`eBjI4`egNnM;dHRri5K{^SGPsAlwX!{X6j=^1m!VphsmwaVErhy~7zH zj4XhXTSJpcI@M}hoDUog&h-8I9nPUR{YZp%gARS`F2ATl zAklUpv2i7D&lafPy&jNZ#q|}pm9>XB6U-AU63wvL(-3l_@$RpLlH6oTD@xE%O)su_ z&Y@APf$u@fsW(f#)s2DI6s68EB``b}tsZye;Wp>CF?4tLEv~F`;}P=%1pJZy=%2^3 zf}%F3NY{~*>kNu8_iNhxFUB%D+^I8&|`%I7#MV>;L2B8&$|{Q^;tKW z7hNz(r#djS=ZV zTJ!%7aFP(vPt+|8pWZF3G>NJV;O3VvTr=}-q%U&2;Ih{4P+)3P=f?B%>4lUQm?ArK z8{nt@@PWIbn9@BPXuw52cvfjb9{I!9b{FA_oU-dt)q{hoFv&}Fe|sgz-hOBk&MskI zU)@UhY7hC&QV+oo;5{`|%`}v=7S_N{_9QDiZJvg^#5xQAi<1%zUa0tS-ReDfi7z%B z5lSK*y&Xx(Xb%Q=9xj<3lAly+A~vi?B!8fOGKT`a@7jqbV5}{BasT9bIj6vA4>P7wWdxLK!9Sonm) zG~G&sR;@LS#Vgy4tOh$Y4Vw9K1LGJ6WKL&(I7#v-67k9g+lkyeW0pUu~GG)bp0QR04#>wo5mi z9Y}8Ki2P;DOCNWIHmHLZ$$W#F+$p1VH=ewNZ(uLK$kA=7+_DAz(rqcC11mWI z6lEC*srCOECaM%n5)7q(fep09LW+e|Y^BhzRI{njNb#*5)07U1|7!CM`(S)SU3W5< zPny)*Pn|gfqv3*#B+fChnY9twWoMPmuNg5G$6C?k@jF32&mLd!G;YWx@t^eJbx2Wp zcahVpWtdR?FQz{&=(+rGGP6)S5mgEf{kJh{_($mh#;GjRxi)~O-@uy1Q)o;5m~M}PgAMOoC1u=*W<^XSTQIwtXghKp?{N=4&yLVs zi^oCFBXUg^_$qVUc9n_O|GV=C2pnEX8ww$MQvi2Bh`&AyY$WQRZ}r9+9#FZ<2aaT$ zc0=}pE=i98s;(-2G96u_>Xv34cq!jv)ry^x&Ii{tgN#B~YYW0;qGh275&YEuvVvtR z&#-k5z*_1(LjZT?+*yOCnTjd}16YCfD>!w;>yx$FB6c$K4-!*jGjtz{mY0O50=AZT z){kZjpg%3-onwr$k9x9Y>A2WS>k=9@^V+1WQj651yv&7r1eyzZpz*BE!E_7-Ev`#} zSmdo(k+C>i1o){d&@H@AoNBrRvKV5jj6Zt6#4)4Q5|2dXe^~DsD9seZse*oU4XlxW zOoYX4&9(Yjs>ZZultSzpzVAcpaB2+u+yUnB+&IuGr)XT6J=mEae!bj#^~+U-~e_e3B5}SEYcxFl{j`;Tvf?PKyP^r{Hy1C()@X9aD^uL5VuwX`>Co9X4=U9nm&OT3i;mfGv=fG#GE zf|S>x*QzbI9Gg@2^l3n1W}1|=nmg>A!fjD6{~my7RDZeBEU^j_$E^{f(UvA}>pCR# zZpsHKQO`qbRF5E$#yG$-qeZ?&L_tm+Xzq5bv5eL>T)ICs=P2S3OT_635fO#e&1? z7+gGfLM_T3Jvop`)F)T?>Y0>dDfUyj*o?Mz)cFNSJBAUVEVQF`6clQxODNC-_LUuw zy4p8{a9_e{fIiIf1>v+mAJM{~XH&%0Q;fw_pT1a=)oE|+y$oN34E?p4X$RKsK;`6i z+H}GNGz2YZA{`5hbuDKAEYX>7@vaLO!l9wU9^Xzz0FJo?M^wE(-+EDK@R=9&3&Bp* z_lgfIcscc4;C7UrT)Wb-IjvrjJgvY%T9GOehTMt7J+EF8t6i@pT4@C7TAWF*U&XH@*F0Rxo@K%L6 zFAEPPAx-WA0j8IVU!f*4O4x*ulC?T*K-}c$9-gT@$8ZZv`5vw{*J?8T5nc2#6Adli%yseP{ z^fTaAqM=r9Oeu?!kct3tGFH?86yCOWxVDFR1vZZkOf+~fc)lKR49Qs0p-v2^nmYa@ zX$wU@aCGq60emrzKyiuNwIGf}>!dLumbE_uX?8=9_u?3Rz{mB+U$Y#RYfdvr*9hFe zGb49g-6>=gJEuITP*W;s!a ztl9<)N*BIr6O(&3!IzEQHM$3sOsD{POkCx22g&TYX_5!JZ_2En1NVQ=6*uIXLgFtb zo@5y>K>k-=zG=sz zC?!_i7GH#3YYd$gj^X4^#DpNPbpEYH*MrN^o7~rp8B5uy6i0?KR5v%|n^dot=fL+a zf#wYHezBmq1YJml{=^5u5tYf}_MVwSN%qERxj5m*p?bmEtsD)S{#kv1(k{YJK-4zp!Qe0e9IarLfu1+BUzbVW7hSbv-&H@f z_}HX6qlo>EaDQ2?{Sv-fU^6pyYb4%o^F|QWwF}mK5!wwMa~b$?+>L>b7ib%Z9*Vt& zs^Qb!3Ccu91TaAW00(11o-Y{5LlE2{|HFg4Dm~~l0yLYckh#~^3gV0w#}H!Lnh+HG z`^X1CliT|1T;il8_6bT>rWd`W%lSjiKQ(g8q`iUc;K4lXJPS+0bJ=fTA(7CEi|UxztoO19B&(J+UaSyVLb%MF z@DxSQQNaOO>t5g0KDr~gFsr`fQ1fmv4tV4UdRdfZ7? zvted3JcVioh(LhB+V-1+cAwfCV|8fcTV}AVniHVd)3qD% z^YYK<=9ZFT7QTu$$&7xU!9xzPQg!Hc|NG{Z-6~$+hETRx3R5$(Z#PGWM$hfJ`6xMl z4PISWBWljhS^*&=NyHBaHm}%D%&(jrUP9gQfys8mpU+H}Zu`6zn{at!aY}>*;Sq`f z++HT!LLm%IiRYMZhf>fn{b(A-RSeC;2fe1g(GCPk4MVM{7e4|U?lpo2Xe}H}(<>nH zq6N0$Gt1rN3z%&Ttjn^}I<>>;DA^1t^Q)hEAF zeIj@v%-O%Xq$C!(A(KxR3d(D<(`M1?AP>M9%8se8DjY1l+VlH+gYt_5yIlHU#hgA4 zQ6ISwFuQmD>i)7U1?1+v5vqW%Nw`;emQn-r;ok2&zyNTa;Pwp2eMbpV#-P{);^>40 zN^!@(FrC(}6lvSOAPz#U+fF492+URF5QVggOCG}6HM*1$GJ1UhwGffiMS6+V{ikS_+7%@)rr~vU@}abbGRgmTcp(}#ia(6GAiJR2 zt`nH$je}HqPILBkOl?&c1VQDCWuT2aLs_kX{&Exyhu!L2KN)de71&>2K zdgn=G=jIw=6013~__|LYN>l#V`sZHXEHcg&!9#=BxUE%?4Z<+9C6kotZX7eHH+LvA zoy;#SOoS*l0cE23)1G(Hv%qW*?yIDNUnj6tIC7Bg+G4v$jCswy1!2?2J5A=@($PfP z?MbT&eT3akDL-zgLRY4`k6^?}TocFr;y}N^5)$T3f)+HhkNB+|JEU`I>Kw5DzWD>( zK^g0E^(2Ow<&ugc{qxH-yl|b2Mw7}b$g#fwez-wb!KO{pl_(D>j+gC8%z_h8*Fy+f z9q~l3Z$p3Ip?IrT!!K;LCl7QaWz?Z`QWOc*sUaM>l<>3TD<0d$aDtd?#w_1fq-D6+j;w`M=Y#%SQ`8(#DT@oz>l8vXFlkkCL~4a#kdB>w zo9W01Bu5uw0IN+F+93D-h9*SPPXI?e%~Y(~P=;N}q@ywNn2aYD^Pixqr<8wiMKr-I zw&1sUUYU$4vNh&!<_8&kg40M6Of6)R?1}^~D$j|Fe?!Tjl<3TEov1FeEzGW=R>N1E z-^wTDEK&)?!&1f?Fo0pa_c)l<6a;ILmfAArv~^ZFNYA(b6L%QJZLX z^Rrjb?F-n?l|i+3?R=?PhLYHM00OBd0pjae$hLb6V@Bt1l&#~QKN7OL3Tu1=DG|;u zYkJ?N%H5l^pp9rPW2IUEzSRJeK%L^gCT^AmXDHpbtWzVDZ16H8F{oeN(dB5tP182X zvd9&IOd#^jiBcKdjFwT(I~nqVzuP1KI?0xiU7fv*Dk{$E&Z?M6qP+6U4!ppH`Fx@h znX?;RBe;CJMR6E4!zE@TC#rc4?ZIprIFSQtDI%7|F0mD87D=slA-LcrBC+!=Ht)KZ?nR zXxoufoH)qo?XYc;*q$1sL7r=NJSx}5JCg@-G>y1&9GY&HR@qiose_*Hc2`9^jNDJ6 zhJVi zPn9bI53OO%KzYvV-y5`k=eZ(8{Abr<%(g@We!agD=n%v-Vt4k;;|f~2zFh6@dAq0<}HPb3jHA(Dg)`t z*&8VYr{ZT17TG9Jy9UA%?EBgO+qc|EAUY{T3jol?pYe235zc-RP%oH$X<53W_RmQO zx)-2p4??gO%?yvxT&FI`VUAmYQy#SwMtKKiY={`n_u5Nq$O^; zSZzUv8L>6=>(s^m4#!4C?HPEIM!!O1_>aj_%WCITRf5+hQtkUBVIhv~mwcJCwomK4 zT;sJzQ>&Q;snBDsS*i$&L<90Q+)5a-38JvQ`QbJUi3v>ORk;5`v1Yx6Lp>Q#W|Q%2c4d98OV)vI>YyD7~-OX;GNU!o=15O?ja4ZQql};!sNJ$c4UR zK9$|$!tAIxTlJ055Y?fInmTkR=@LRA4O#Ysqnb4l&Pslyz?o6SXe z=J(=$0bhGw*i{emk*zn{C4v6=vSdBdDnezJ;ei)FXBAB)6_@*TB;~I)^-uieqJVSV zaAcx$!OMx|vrX}?qk(g_3w*s$4IH5Z?%xZqzuQu=r6@GGKU;9O8h~bj=xPNkBPaLZ z;a~IUUm2q~syNxs?2~49-={!|c>BH%T?ESBj!XHphtV zP4w6>Y(VyPS?_f}dSucSvnaTfmZEblpN+_uB1-rrqVJNk*z8v?hGuN6p6|utsJOLj zRK7eIkge*QU81;N5m0K&LbR{%bwC2~25&Vn-C?+QTMHn2pOh<^pry|Ds5)f;LMp%l znL1*OLhnIt6*tqltl<1o@THk4y`0YUgCVApJE~<}=rXH>-QsBjoT@6m)k||o#f&R5 zQUwGys1-|-mlJje+XG`pUAQZ2zlQoxhnUywx>vBvs~MCUM%MI_w4%!ikE5tAH8=yD zvdApRLpSzfXm-S;(no2F6IH8LDs5-OA=krnin8sKDW4Z*v*Cbku~wo3?VrJ&-k6YfjZyj^M*t|Qrg1}5 z`~p0mr>B>}j%aD%CTW=mGCbn{EYtK_J5g1Sk%6TY?O1#Ffx7JLfLyeQEctsc+td~0 zGH(?~kdpfHzEKfvbt$|ii+JvulmAheW!pR}fk4o+G&~`#M<_CTazpa!q$B%1Qq2L2 z>=%*qiJbA^{l>Amn&{RN1-SM*w{=jK_Z;35DaB2(j1M=$+9^!wGl-RDs+k5m6=&2G zjvpcq4HpY@vN^?uN0I35M8O zH}H82@l-CVzNR5>ANSn@7v@Dps2v2ResZX*>%y@Nn*LuYf*Japi^GpePO2iET9ov) zTm;F&-AWQ^`qz#a*Z2Sc7U)5mFpWV1+S=OM+LI}O002$@^`(D9fI%@yi7Cs$klWP7 z7zn7qA5E6!O%Jk<>MfO9_?PX}Wr&Be;g3mp&pfC)JvH(Cia{YF`0M^oCBlqOAa#Uk$hw``C((4s)>wc6CrKe?uS{qkFFBv zjLd+Gf8Ce~{6kIHyW36eXD*jPgnNP4$=*;^w`=WjRr^j5-m@+7V81oFuBj9u*~GwY z$dT!s^nuHI9**138EKIThWn~dbHkrYzlL4o7}izRQ~;UI^p`FYY26InP>O#RFZ@>O zH5YDsG7e2)Z$PfRI|b%OpRan=W}v)0f2X+&Sx7B*WnoWAf~`(YqaI$*+zO=zyZXCd zHiAXXW%SX?X(7;^9cq_=gF2-sVc&AUFh(4?w=7?^mPWDr!nk zmU`PIk>a1|}uD=>nLxk_^+Hn4Ww;8$>da&H+qn!g4%Y5!N(-yFFJ%T=_CI-33M?V`E0;Xmwzzf+V`l4%*R!oD}= zv4Qk&r2APTO1)b@=>la`ZtmM*_l7yO3&7jdpZna92Gd~O=%&9eN|!SF8dn?uNny@! zs#2YW=K5^YSLoyPMDGiT*cZ6RtbK?}bCv{_zF-PpCp zU`%ASwoivHYP835K|bpQv&(**x|1MFT~ojXg^aEqWUt&f9* z8W;@W6f4g+oJ5q>Vxe|TyX+y~3zuHcAPNCHzsJNx2z_`BY%Hj8Z6fry1uOaYP(2%_|x3OfVtWSpu|5hn+yj z~bU z;VYN5)adnH8{T$&%1{8w>!2KPhux7gy^u7LMAq?lz(RQp1aGw@vjqk(IDI37W&hdA8rTt-1(R-n>Y6- z?$>6i_aejOVi9LP5uaBj{amNZrTP$V5JGe@N)h_>?IbzHvje9rSbAuFV;ae9zZ}Mf zeBreQT5wmsL3IiuNnS2ut@RF2H64U10oe|)y4EH8uQ1vzaZ85-{j z2YxLs+>Nc7i-xzR_~*~Rt1WPuZ+0tXi|m{N;lu|Q={VHnzrR8na$75yoxMG;{Cn6a z{sN*--mH{ua=B%S+-~(SDn*b&8p+2Oj`4V9_c_P#3xi%$~a z0=-Q#>{jk5zx9#GUO%J?9>kc;GC$5*$a;v`MQ$cEzP=n~ZBAwRtzMP0hb1#bS5YcO z9HQbBxbVo@iA7Z}3M$1a6pQWui0Sx5Y+5jj9G0mDuzbOABo$ut+ukZxG3tfAOmJyZ zrtp9+H-3)?Fy70O$vre~1P*xAa<{_FFQNIZ5tLBLlGAO^vb7hIBp4 z@yG|+uA6EBYx^`LAd!R*7KWh>zg?sfnGcbZJW~FP>D7MH-bJS^0Tuc5rBJp*bIku^_RMs zCuVQ*eBMuaaMXi!CR4O>4Zp%MY_Zo-6<6zz+#lUyOYdAj2y${pHFpD$}wre zgmTTRFL$EFMDNpSOc59f<#wBYJw_wDADd(1_NIR8hu{{*6}SR-4=b>tu{e}AC>vpA zV8@+`6&Kzf8(Tbge*#}z5`CLe=QQMM_7+24;>&zjRfw z>aqCcxEV?BJG$JwfETTX*iynHz$1Mgm#M58Pk6^1U!|DTaPHNsa&)L^P{f8ld)`?qKd&g$g+5ScqGuwbzPII0Xohs4Wg4$*iUl0bFefR6*j_$wwuZ>K*;FZ zAU6XSeEa)%2JpU(w!7FCBpQdXO1wL!n?i~^?*DiGz$}F^0YkJiP#O;ODd-Ad*g&){ zpBI*ngh4_K7Y9Y2hjVJ=DWIjBHc7{Wc`v&`q}jSoC_{W6!oR=}J+E^3y^m!n6d|PA z`Q$0HhLe=NC2Lp4_!+iXi+iIIC4v<}uha_<`$#3*Zu5YrNHUBW0K9)+n27@gxMxT3)(s1!2 zgHKBLGsa|ac@nqAZ>$^gwic+j1~2{-NQ`|8C$-n@TnjyU9EexaaM0)Mn_pFUx(rD^ zNk~?)f1gS$WjQ!!=XP(6-u6_VnvML9^7m(Pt}+_Y4l($>K;GR^F>mHJSt@HTQ+rYI zC-4OUq!Q~6Rq`cmH760A!;)4##x-)*vt+BKC^Z8L5Jj|@iy;TM1lKx!EVGG6B3m+# z+pti(Zd4dxXLi7-MYI`?IHv+oG^`U~`26>lhy%Gu#_j$df7|SdO6eK3O9BGEBh{Eg zY)%$!)Ix>bIGFG1)O7IPiS(5*8i219fl5+pPITED7gptL*0pZ7p*VcsC?f9ElPP}0 zg>|tk)K);OPGg%z`R6jE>JdU7gCqM z3niKEY7CXNr5AAr%RDZK8KUXKSZBns_E?XP5r(qF59cd0&bAnf zc+!JFjatw?`mRZ>v^C~(dkIr0XtjoZTuf_uEAYQekk(8Q`nTH~M)J2`{C)-ZV(ml4 z{Aw(9$RQrYM0o>fSypemgh^UJde)GI(!V z2Q05rKbEZmbl#O%2>xhfs0rD5Tfj&PFYO*qL?_cF)0F$SVPn~3Nhj6&vh1q=u_{ig z6jJ|=J^c?*H^jF+>Q0iXVqq|=HE~bHT6rVyOX4wp=~f{$yJKFWsxP>81()tr;(~v+ zs12Cp-LHc(m`raaUKyjHQGxy;u>}J*{}*`S+3&?j7R6YQPv9V#OEJ&>JQabT6#3%i z2Ue)WB>9Zj9V&_+M`3t=mmS6SRc&P;XZPfOyr?Z+1|i7q(xP8$hq49(f0O%-tZ z3xi;Wvzo!N7FAM2poR!%_b@7)MzgvJoEoMj4+VDnfPscVExdCjY$LE6SzCY)zP-!l zQ;WxbH}9^+{j13x&5{35Z@_nohnD3ztq+OUn5ZW(Mfv$tFk*w`bBCzHJF{AAfIr=o zyx`lsGW|G`#`<01jBs2FA$3@~u6{(|McrjP)QFj!YwmnzZe6nniih49++(y=LG>XZ z42&-PyF?xqY&xth;wNHDEs(jwuIeArgaU$`lk%~o_BRplYOD2;cANP6o>6SMtjRQ^ zo@Q}!rH}cL0quYP%caJI(3!eIxGyM)Qy;F3_QtC)&ouP`! zHeS1K4m-P4f>IiERjYm{qY4)4nB042JcAk0$K-~Woy+S;;s+Rr%JLs2`OF_eN;TuG zT>VRD0??lfDjS7r^exfJ9=xSIzQewjT@0gicThOaN1rdbhq3dvuaXVQQGI*pJr3I2 z5a$H7BLhvGDS0h&Hx}+5hOQDehz?1?9Pli4Gw_6o0JMULxr(Sf5Rgvr4HSw>600FrWP0 zQ5Tl!jeSE*E}N;4pZD1wT#3AJ3A8;+{g%Q79u>G)@@dwD7Wbkvs3}qS<*py+CiWi3 zm_f`kQi}Ax!{S}~SV*;bCCMR=ICPxyfkhrnmUCLeV9~ADG8n2$hq&VxMRI zh4}XVfq^b;aXMh`GB#CUIj?A6F{dNv>~r{Nh>~)dZr-F?fbZ_JeXY&7Kt0ceJqg_f zl=?plVFVOa8IL9joBV_5)+7&iKP7Oz-OKcYVD^Mfgm>aP@)TO{bhf6n(fm8`Vd&AY z8OEa?F`10z)h;V15{|{tLd2ArX%wuquFe-Rsm?r`Wgl`Lg$R6$fzt}D1K8zTXa>*Ck6ZLa~H;B)s$OJ<-6aow>WJr{WGmJ~C+1&x7pHf|MQ z)h>8ue_dEY?f0>s{Q{TJwPL%F1=YLK9`G{HX}eq9mJqJe!gD`R=aS3W_g-|LCkFb9 zT^Jz*Q-d1t$UY3QQPV@`f3=9{8ko*%8<9y>&<#*13&zj07hDS!dIej9Z z#Hr@7ySEx4Zx8r)h~R7c`=L!fy2_1zLd>yGa&PnkgnuG6B%mTqXVG~-ox#>SKf=p3 zW1hJh{1cUnw_q`ft9G(*Uw?vwrG@F=4xd`2DT(q zdwuOyt}De{_uT?L7DyXn{fLD01Rds+p-Ytq8gFQ;2~w;I4zVWZ2`dTvH*cpEnB8Lm z(Wv?QpN7OQ9PBFH8m@vfE~ltLr77X`uS17Y?O>@8uxj6p{v!-{Xce!q-m144!q~F? z1I^#lljAu_@_@Ngs`~rs&%^s&w8A*TEdZ?z?Q*H&NdbD|04)Pv${JDTpam7=N&Y9E zDyl3^L{6a&Lg>3IvX3{Ki$aBIR5_gAw*!`}y%*?l(k0t#D3v{a@@Ll1K>fJ0gw5@A z6YV81*YS}|!-ZXW;gI{rW}gFNs8%oLub}C4gE~pKZdL64fp$W>%Tphq07ceqOhs~f z-_Ca(q~MB#$8&uvG^2GLrN1=5kY*sSJB5iUWIFvGrbNFseRqz{8#y=iu2=q-&E>+H znSR&A`joC|$Z$?KUN6uLEi`C!jRcacsCwC4U%(F1YRtnpsKxyxoRZ~{DcTJ9boeMD z2UG3Zsz-zG5-w?)X%_DNTwA!uQlcrASCgco7~<*K6WzMrpbAzzqhWl3e36j;&khY( zl(C(9zhL)s2G}B!A*2r^kUiTWGtJ}W_Rts}3TK~|6UDtZ=Gl#aOhPZveNM~@<-V%- z)Ise2J1gbtB|p*bNI=>V7Et3Bm`5V*Y&sGZa`^dagqak@cSZL@_XdPJ#}NCF=^BN$ zWKcW&kq%{yQP&kIYEkxh7(l6Nd35A$zBqFtRtVk+b&fbYO~eJ?jqY%gd@N4wYVb6w z!bW%%QN|Ut$55GBK7~u2t>YQ7a5(qgGeHoe!ZaaKc6wiTkg1oDhZ}1LRp^xQFBk2q zI)pRJj%x<+qDzPrJ|7oRo42)9phIPD)JQvJ|zIoU=8FL(j&GSbx_<0CX%2 z4Z&$)>8wB0S8*@vAxc0JO6O%DG_@LZbry4xg+eMs`>Vvwex`;Xgs)0h5SILE2(k-x znD&Cr7Rr}^-07SESgsP#quz78uOX|Fw#JzjR*Q9}Q^6=OBi+UgIn|!G6Jj>lM}_ON zNuI?dzHtSLxq_Tc(i%u&9}`R@%7f?+#kxrF+Yo1-bQVd~Y#NW-1FC z32I?6?iFh{K_T`=qP~{-Z3?3RY{=i*(iSv?LB&0Y-Z|5r(jxP_{#?Gs6Gnt`{TuReL@HPLqWKl?i)OF(f@c17izv#|^_QR-ZcuIE8qxq;3MTnTJ-T{=$tqf!( z<|+kByQ-WI3UIT68ltz3J!LwHRC$2}K>`b|;GOzk{wT{9w%#UgYZ{GvXsTWA53m_U zO7T76z%oL60_Rfmn2k}jMTp8?zVvl_cd*B4q!gf1c|5)2>En$TX2?jp-w}_BRej`B zu<9Y{bDBbO22C=-NC38`G>k-QWsz!&k8|9UdH=;)n_BCmTUJ|gf``qbcvp{|zJLwt zb&Yxe3}U(gJ%g-jd9O*q`D{Y#wDm!CO#>Xz)sSTEHzAA4*cGXD3h%KEQ_pB`ag{ZtPpEwZAc%U*e(!r*rZKjT^@zN+*TtmT; z=%uaFrLGp6xf)e_T*WvAESBL2^?Q!V&LxoKR9X&}JCx5FHO!3Et@fwHzA5Y2S6D(r zV5NA>|KRLdlgJQ>V$3W(Ii!2@oC1O|n+#bV3waDlMw-X{o}|Z^5uQ+oqTz+dM<^DU zqUYb35e{$d$<%l!8$~Pbu4>6`8X{DXwDP(%(uroX^AN}M=LDpLu`*wnak@m7$iY{_ z&x6gy<)m@FV;XUp-k2Y0o!9R5HkIv3$$-mL13djzRA)pC?3=vUwOh*cow|_&g6l3k zvSFM;P@`LiJFnBN(9c9YI=M`4L@j((eNA`2TnEl#rm7*X#elf*_N#c)3HW&}xW_)P zr>{Taz8!D#H1W6%bKytAz@D)Ca5)KVBgp(M4)ywFPI?XrCu`XOCB$i+a&~Xl{I3;e zst&>yE&QtE$DQXORqeS;s8k6+9&&}cbcKTG-V_$R8R3iYZI;_E@hT2{oA1=$u-_-f zX~1_k^H-|qNOYTHR%u^G?*c+W)X#m!fELKycRwd4!L+g+G`=1dQkH3Oc15BaU^r~| z$_hq5@yw%pP*Ddc>-S*uTk0P_H+!!X!Tl_UUjW^5-iPz#;m!Tvsi1rXal3-5%4sgD z(Uyj9#!Y+fePo9n9fh?uBC?#Jy?{0AzFk=F5cTKGrabd40K6%t@tqw#xZKV4D;|a7 zn>&?l9S=QsXQs?Y7>q&5-!BpTKd6P*!|065EK!T696V;Rn|u7vi;$Oum_)Z;%!F{q z`=c2LTMHjxg)cYu9ng6&8CQwZJoZ3Pi!_bQ{t>-FopwEeK9P!lWXhww{%(Nf*0Dt_ zG12K)rMEwmErbbq#l8k_McrW-E)OFL-kCFv=-PQ>%<@l;b>0Q%2{g+JZ_N;>LQ=tD zFCwJ##40<5l}mVu_$p=HH*mk|MQOMhUSE@LyxiwV`(rfp$n+pUgM)_6wN|MZ@SoHD zSEZ@hU(25rq^;{;(|QSw~Wn54p3^o>rgd=a4|?zM)?mUUUFHqjR?;Ev`jYPZ44 z>_+t+%?6VYABtE|Ss^5Q@!nozR!5Q_0`M%d>~4XzN=%ZW3dtAl6FxP)_7fCrMeD zkrfuEeyG?I=iMcXPTA^n?Se(aZTo;|q0LeTq`zA%MbdftZ1R#Y-lfNtMt{b zu;EFKRtwgRx4^dgzWO4_P4qhE+LC14O5ep<*k{#aVC@RTQTOt@eD+_FZRcfHbiz!t zy(O6W?ln!~3s&kSnqE@#|x8F5HN?}_t;)d|-wPNJv1lYq08H@Dy*U1hV@(&QL>rvI6TA%Jd) zZl{zr7Vc+MK+X|XmUR#fK(vY>W$&dZEaI!{d0bE1Wr-Aftc$_wCP^{@DF)p-Hpe4t zK)eot#5Q<3nYJKx>{Qdr*ka%I{Po)T#AZlX7i5psjL-g}7~V1X|6Sfm;t??0p7aob zU1pCHVPK$yZwzb|kY;RfN4&T+T=DX;_?rk+>!@*D7)3K#TXkiQjsOb(BY@EBY97)` z8qiuu?TT9!Ri13lQiCc}k_LDxdV9!_b6r`2DY*U@BOyyLo;?XZFH=|ARc&pt+a~Wj z_tK7|J)*yl@S*v?!YiVvk1QjJ09;9Zf*rfbj{r>*mbh-2 z6x;H@SxAfTq(V-V(1SDEIwnNiY7HeSpxN&fSFbBy3KcG-`XF=BJjcu-ekQ>73MYlr z+XtbeyrYY;OoPRAQYDgf>MZlGlAb>{+`)IhU+lcEx>Gwy=*K^k$PLW&Z&|2DS^9q1 zR8GOQrrZACFEIm@2-(1%Qn$JaTorx69@jDpWU^ziG9etmzf4>7=cW*ywJXI79?0z^ z30`I94Etl*eJ2%so$F}+zr^aYeMO9QO6{X`11#67vlQyl5=XD8#jX_!dRi6i+2n=WO5eSX5-+`)0-sEcd}6`_hQS3M*y}~C zD{b!>rf-K-E#R(?=ykng^|@TBc8)th7{Ny=SdNYEhHjl4FF{+iMl@Jgz{0FIbCl6` z)SO4a1M+r{iH@D8hs$7!W`)~}F+!lgpMM`J5a)1yetQ_H=n@9Pbf?_ilAaW{RVor~ zh2(;F!1iy(IhEQrsZy&kzSOH&KSm}mZ9P+)ZV(wjgd4$08Mt}_QG1dY52_#17vdz8 zVX*o+&s6n$h#o%~-bxr&n0_Aa?+dR&^o0}&2 zjK*C_m1YWUmP^4=dsO|8CE^gM-iq$p9*~rkCOO#$=qd+qG(|j^nXr~L#5!&u0wul} zl>YC%=e|6oBziK>{GWy2E)Y}6^m;vGmpr7U+`U}rzq^eJE$iTw{AB&n%mt~JGzylzewR;I62JfFWs zt)di}x*%CPiI^Otz!9o+|3z6oXa^oDiMq3RWEwigSlBn6|EkS&442)IfJJQY2q(C4 z+%at+?fui9^G2erEWIM@9jFJsdc+S+mN--H zo9&$kd_UKD8HV^TSX1Fl_fYp{%&qcTv9Y_*=089i2>}6N!vu%{yfk9DYWdv3qJA$f zM9Ox~ngcx#0LtmvXYPc;tQ*h=&mYo7Po@byKb7usm7;J&}8zosDcOBCFIZz$2kxTf>8w5+N#gAV=>}zD{F1%_DIUYq3d< zGL~#%b`v}2+Yc_k>$p9abpD(=g={|K`q3(d3*oZF^0My#%bc%OWD%;Om5!EIIZ3H6 zj9)PNcZt<*d;FG%xxF{_6RtOwjtYnWf`Rbg>+&ig-&aAJqLX(^v%I0R+2abIMJ#QA zRi>Jn9PU>j&Yb657OCRlpW3?*6+6g|`~!u4<;d&1nAa9q_&J`ETRu&eT6BPcGGx(X zT(B#z$tg{Q)nW#IG-n9(g7W>A8LSBN%MQ<6!gG}08rC+|W^fn3^zjXw?fH(#pxJn~ zeZ(svY+|*Vhwz8$aS0lNgYU%>IiA@oe9=$HLH3NuFVIa8`~SkIEYT^H4+^bO2$0X# zf^G&DJ;?>WTl|#(Ak6fa0Zbevo(SqX`F;va(M#C&*<)zX# zr`9{Bcpk$ND*hqP0aRuPZlr!(vO3wCsymcFzECk#ltYJj5p>9wcN;P`Xk+_GL*#A_ z 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%0A7C1sXW2I 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 z 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

  • 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 @r~;SUkfLeULu{~ecIbR? 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 z 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ℑ> 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 literal 0 HcmV?d00001 diff --git a/examples/inference/yolo-python-onnx/pixi.toml b/examples/inference/yolo-python-onnx/pixi.toml new file mode 100644 index 0000000000..1e29df1564 --- /dev/null +++ b/examples/inference/yolo-python-onnx/pixi.toml @@ -0,0 +1,12 @@ +[project] +name = "YOLO Python Onnx" +version = "1.0.0" +description = "MAX Examples" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python =">=3.9,<3.13" +max = "*" +pip = ">=24.0,<25" diff --git a/examples/inference/yolo-python-onnx/requirements.txt b/examples/inference/yolo-python-onnx/requirements.txt new file mode 100644 index 0000000000..f1a8034a23 --- /dev/null +++ b/examples/inference/yolo-python-onnx/requirements.txt @@ -0,0 +1,8 @@ +--extra-index-url https://download.pytorch.org/whl/cpu + +networkx==3.1 +torch==2.5.1 +onnxruntime==1.17.3 +opencv-python==4.9.0.80 +ultralytics==8.2.5 +numpy<2.0 diff --git a/examples/inference/yolo-python-onnx/run.sh b/examples/inference/yolo-python-onnx/run.sh new file mode 100755 index 0000000000..42b9126556 --- /dev/null +++ b/examples/inference/yolo-python-onnx/run.sh @@ -0,0 +1,32 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +# If anything goes wrong, stop running the script. +set -e + +MODEL_DIR="../../models/yolo" + +# Make sure we're running from inside the directory containing this file. +cd "$(dirname "$0")" + +# If CONDA_PREFIX is set, install requirements +if [[ -n "$CONDA_PREFIX" ]]; then + python3 -m pip install -r requirements.txt +fi + +# Download model +python3 download-model.py -o "$MODEL_DIR" + +# Execute model +python3 segment.py diff --git a/examples/inference/yolo-python-onnx/segment.py b/examples/inference/yolo-python-onnx/segment.py new file mode 100755 index 0000000000..b64cedd533 --- /dev/null +++ b/examples/inference/yolo-python-onnx/segment.py @@ -0,0 +1,382 @@ +#!/usr/bin/env python3 +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +import os +import platform +import shutil +import signal +import subprocess +import time +from argparse import ArgumentParser + +import cv2 +import numpy as np +import onnxruntime +import torch +from constants import CLASS_NAMES +from max.engine import InferenceSession +from ultralytics.engine.results import Results +from ultralytics.models.yolo.segment.predict import ops + +DESCRIPTION = "Segment images from a webcam or video file using YOLO." +DEFAULT_MODEL_DIR = "../../models/yolo" +DEFAULT_INPUT_FILE = "input.mp4" +DEFAULT_OUTPUT_FILE = "output.mp4" +WINDOW_NAME = "YOLOv8 Segmentation" + + +def resize_and_pad(image, shape): + # Grab shape sizes. + (h, w, _) = image.shape + (target_h, target_w) = shape + + # Resize to fully fit within `shape`. + min_ratio = min(target_h / h, target_w / w) + unpadded_h = int(round(min_ratio * h)) + unpadded_w = int(round(min_ratio * w)) + image = cv2.resize( + image, (unpadded_w, unpadded_h), interpolation=cv2.INTER_LINEAR + ) + + # Pad to be the same size as `shape`. + delta_h = (target_h - unpadded_h) / 2 + delta_w = (target_w - unpadded_w) / 2 + top, bottom = int(round(delta_h - 0.1)), int(round(delta_h + 0.1)) + left, right = int(round(delta_w - 0.1)), int(round(delta_w + 0.1)) + return cv2.copyMakeBorder( + image, + top, + bottom, + left, + right, + cv2.BORDER_CONSTANT, + value=(114, 114, 114), + ) + + +def postprocess(out0, out1, input, frame): + out0 = torch.from_numpy(out0) + out1 = torch.from_numpy(out1) + + pred = ops.non_max_suppression( + out0, + conf_thres=0.25, + iou_thres=0.70, + agnostic=False, + max_det=10, + nc=len(CLASS_NAMES), + classes=None, + )[0] + + if not len(pred): + result = Results( + orig_img=frame, + path="", + names=CLASS_NAMES, + boxes=pred[:, :6], + ) + else: + masks = ops.process_mask( + out1[0], + pred[:, 6:], + pred[:, :4], + input.shape[2:], + upsample=True, + ) # HWC + pred[:, :4] = ops.scale_boxes(input.shape[2:], pred[:, :4], frame.shape) + result = Results( + orig_img=frame, + path="", + names=CLASS_NAMES, + boxes=pred[:, :6], + masks=masks, + ) + return result + + +def camera_functional(): + cap = cv2.VideoCapture(0) + if cap is None: + return False + if not cap.isOpened(): + cap.release() + return False + + can_read_frame, _ = cap.read() + cap.release() + return can_read_frame + + +def process_webcam(args): + # Compile & load models - this may take a few minutes. + print("Loading and compiling model...") + if args.onnx: + engine_name = "ONNX Runtime" + yolo = onnxruntime.InferenceSession( + f"{args.model_dir}/yolov8n-seg.onnx" + ) + else: + engine_name = "MAX Engine" + session = InferenceSession() + yolo = session.load(f"{args.model_dir}/yolov8n-seg.onnx") + print("Model compiled.\n") + + # Setup camera. + print("Grabbing camera input...") + print("Press escape or q to quit") + cap = cv2.VideoCapture(0) + + if cap is None or not cap.isOpened(): + print("Failed to open stream from webcam.") + print( + "If you don't have a webcam, try running with the `video`" + " subcommand instead." + ) + if cap is not None: + cap.release() + exit(1) + + previous_elapsed_ms = [] + + # Loop camera frames running yolo. + while cap.isOpened(): + # Load frame from camera. + success, frame = cap.read() + + if not success: + print("Can't load frame. Camera stream ended?") + break + + # Resize to 640x480 + frame = resize_and_pad(frame, (480, 640)) + + # Preprocess inputs. + input = ( + frame[np.newaxis, :, :, ::-1] + .transpose(0, 3, 1, 2) + .astype(np.float32) + / 255 + ).copy() + + # Run prediction. + start = time.time() + if args.onnx: + outputs = yolo.run(None, {"images": input}) + else: + outputs = list(yolo.execute(images=input).values()) + elapsed_ms = (time.time() - start) * 1000 + + # Postprocess outputs. + result = postprocess(outputs[0], outputs[1], input, frame) + + # Annotate and display frame. + annotated_frame = result.plot() + try: + cv2.imshow(WINDOW_NAME, annotated_frame) + except: + print("Failed to open window to display the annotated frame.") + print( + "If you don't have a gui, try running with the `video`" + " subcommand instead." + ) + break + + # Calculated average fps and update window title. + previous_elapsed_ms.append(elapsed_ms) + previous_elapsed_ms = previous_elapsed_ms[-100:] + average_elapsed_ms = np.average(previous_elapsed_ms) + cv2.setWindowTitle( + WINDOW_NAME, + ( + f"{engine_name}: YOLOv8 Segmentation (Average Model Time:" + f" {average_elapsed_ms:0.1f}ms)" + ), + ) + + # Exit on escape or q. + ESC = 27 + key = cv2.waitKey(1) & 0xFF + if key in [ord("q"), ESC]: + break + + # Clean up resources. + cap.release() + cv2.destroyAllWindows() + + +def process_video(args): + if not os.path.exists(args.input): + print(f"Input file not found: {args.input}") + print("You can use your own video file with the --input flag") + exit(1) + + # Compile & load models - this may take a few minutes. + print("Loading and compiling model...") + session = InferenceSession() + yolo = session.load(f"{args.model_dir}/yolov8n-seg.onnx") + print("Model compiled.\n") + + # Setup video capture. + print("Processing input video...") + cap = cv2.VideoCapture(args.input) + + fourcc = cv2.VideoWriter_fourcc(*"mp4v") + fps = cap.get(cv2.CAP_PROP_FPS) + out = cv2.VideoWriter(args.output, fourcc, fps, (640, 480)) + + # Loop camera frames running yolo. + while cap.isOpened(): + # Load frame from camera. + success, frame = cap.read() + + if not success: + # Out of frames. Everything is done. + break + + # Resize to 640x480 + frame = resize_and_pad(frame, (480, 640)) + + # Preprocess inputs. + input = ( + frame[np.newaxis, :, :, ::-1] + .transpose(0, 3, 1, 2) + .astype(np.float32) + / 255 + ).copy() + + # Run prediction. + outputs = list(yolo.execute(images=input).values()) + + # Postprocess outputs. + result = postprocess(outputs[0], outputs[1], input, frame) + + # Annotate and output frame. + annotated_frame = result.plot() + out.write(annotated_frame) + + # Clean up resources. + cap.release() + out.release() + + # Full path so users can find video easily + output_name = f"{os.getcwd()}/{args.output}" + + # Workaround for linux python-opencv/ffmpeg not being able to encode h264 + if shutil.which("ffmpeg"): + print("Changing video encoding for wider video player support.") + result = subprocess.run( + [ + "ffmpeg", + "-y", + "-loglevel", + "error", + "-i", + output_name, + "-vcodec", + "libx264", + "encoded.mp4", + ] + ) + + # If succesfully encoded write over original file + if result.returncode == 0: + subprocess.run(["mv", "encoded.mp4", output_name]) + else: + print("\nFailed to encode video, but video may still be playable.") + + # Open the video if running in vscode and `code` is on path + if "TERM_PROGRAM" in os.environ and os.environ["TERM_PROGRAM"] == "vscode": + if shutil.which("code"): + result = subprocess.run(["code", output_name]) + + print("Video saved to:", output_name) + + +def main(): + # Parse args. + parser = ArgumentParser(description=DESCRIPTION) + subparsers = parser.add_subparsers(title="Commands", dest="command") + webcam_parser = subparsers.add_parser( + "webcam", help="Segment images from the webcam and display them" + ) + webcam_parser.add_argument( + "--model-dir", + type=str, + default=DEFAULT_MODEL_DIR, + help="Directory for the downloaded model", + ) + webcam_parser.add_argument( + "--onnx", + "--onnx-runtime", + action="store_true", + default=False, + help=( + "Run video segmentation with the ONNX Runtime to compare" + " performance" + ), + ) + video_parser = subparsers.add_parser("video", help="Segment a video file") + video_parser.add_argument( + "--model-dir", + type=str, + default=DEFAULT_MODEL_DIR, + help="Directory for the downloaded model", + ) + video_parser.add_argument( + "--input", + "-i", + type=str, + default=DEFAULT_INPUT_FILE, + help="Input video file to segment", + ) + video_parser.add_argument( + "--output", + "-o", + type=str, + default=DEFAULT_OUTPUT_FILE, + help="Output video file to write to", + ) + args = parser.parse_args() + + # Improves model compilation speed dramatically on intel CPUs + if "Intel" in platform.processor(): + os.environ["OMP_NUM_THREADS"] = "1" + os.environ["MKL_NUM_THREADS"] = "1" + + signal.signal(signal.SIGINT, signal.SIG_DFL) + + if args.command == "webcam": + process_webcam(args) + elif args.command == "video": + process_video(args) + else: + # No command was given. First attempt to run webcam with default value. + # If there is no webcam, run video segmentation with default values. + args.model_dir = DEFAULT_MODEL_DIR + args.input = DEFAULT_INPUT_FILE + args.output = DEFAULT_OUTPUT_FILE + args.onnx = False + + # Check if a webcam is available. + if camera_functional(): + print("Webcam is available.") + print("Running live segmentation.\n") + process_webcam(args) + else: + print("Webcam was not available.") + print("Falling back to video file segmentation.\n") + process_video(args) + + +if __name__ == "__main__": + main() diff --git a/examples/lit.cfg.py b/examples/lit.cfg.py deleted file mode 100644 index 1c3516870d..0000000000 --- a/examples/lit.cfg.py +++ /dev/null @@ -1,71 +0,0 @@ -# ===----------------------------------------------------------------------=== # -# Copyright (c) 2024, Modular Inc. All rights reserved. -# -# Licensed under the Apache License v2.0 with LLVM Exceptions: -# https://llvm.org/LICENSE.txt -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ===----------------------------------------------------------------------=== # - -import os -from pathlib import Path - -import lit.formats -import lit.llvm - -config.test_format = lit.formats.ShTest(True) - -# name: The name of this test suite. -config.name = "Mojo Public Examples" - -# suffixes: A list of file extensions to treat as test files. -# TODO: Enable notebooks -config.suffixes = [".mojo", ".🔥"] - -config.excludes = [ - # No RUN: directive, just bare examples - "hello_interop.mojo", - "matmul.mojo", -] + [path.name for path in os.scandir("examples") if path.is_dir()] - -# Have the examples run in the build directory. -# The `run-examples.sh` script creates the build directory. -build_root = Path.cwd().parent / "build" - -# Execute the examples inside this part of the build -# directory to avoid polluting the source tree. -config.test_exec_root = build_root / "examples" - -# test_source_root: The root path where tests are located. -config.test_source_root = Path(__file__).parent.resolve() - -# Substitute %mojo for just `mojo` itself. -config.substitutions.insert(0, ("%mojo", "mojo")) - -pre_built_packages_path = os.environ.get( - "MODULAR_MOJO_NIGHTLY_IMPORT_PATH", - Path(os.environ["MODULAR_HOME"]) - / "pkg" - / "packages.modular.com_nightly_mojo" - / "lib" - / "mojo", -) - -os.environ[ - "MODULAR_MOJO_NIGHTLY_IMPORT_PATH" -] = f"{build_root},{pre_built_packages_path}" - -# Pass through several environment variables -# to the underlying subprocesses that run the tests. -lit.llvm.initialize(lit_config, config) -lit.llvm.llvm_config.with_system_environment( - [ - "MODULAR_HOME", - "MODULAR_MOJO_NIGHTLY_IMPORT_PATH", - "PATH", - ] -) diff --git a/examples/models/README.md b/examples/models/README.md new file mode 100644 index 0000000000..8784898ce8 --- /dev/null +++ b/examples/models/README.md @@ -0,0 +1,4 @@ +# Downloaded Example Models + +This is where we store downloaded models used across different examples in this +repository. diff --git a/examples/.gitignore b/examples/mojo/.gitignore similarity index 100% rename from examples/.gitignore rename to examples/mojo/.gitignore diff --git a/examples/mojo/README.md b/examples/mojo/README.md new file mode 100644 index 0000000000..6c651cd92d --- /dev/null +++ b/examples/mojo/README.md @@ -0,0 +1,48 @@ +# Mojo code examples + +A collection of sample programs written in the +[Mojo](https://docs.modular.com/mojo/manual/) programming language. + +## Getting Started + +The easiest way to get started with Mojo is to install the Magic package and +virtual environment manager. By following the instructions in [Get started with +Magic](https://docs.modular.com/magic/), you can quickly install Magic and use +it to create a virtual environment for Mojo programming. Alternatively, you can +follow the instructions for how to [Add MAX/Mojo to a conda +project](https://docs.modular.com/magic/conda). + +After you have set up a Mojo programming environment, you can then use `git` to +clone this repository of Mojo samples using the command below: + +```bash +git clone https://github.com/modular/mojo.git +``` + +## Running + +If you're using [`magic`](https://docs.modular.com/magic), navigate into +the `examples` directory and use `magic run` to invoke `mojo` and run the basic +example programs. For example: + +```bash +magic run mojo matmul.mojo +``` + +You'll also find several complete Mojo projects as subdirectories of the +`examples` directory. + +## License + +The Mojo examples in this repository are licensed under the Apache License v2.0 +with LLVM Exceptions (see the LLVM [License](https://llvm.org/LICENSE.txt)). + +## Contributing + +As a contributor, your efforts and expertise are invaluable in driving the +evolution of the Mojo programming language. The [Mojo contributor +guide](../CONTRIBUTING.md) provides all the information necessary to make +meaningful contributions—from understanding the submission process to +adhering to best practices: + +- [Mojo contributor guide](../CONTRIBUTING.md) diff --git a/examples/check_mod.py b/examples/mojo/check_mod.py similarity index 100% rename from examples/check_mod.py rename to examples/mojo/check_mod.py diff --git a/examples/deviceinfo.mojo b/examples/mojo/deviceinfo.mojo similarity index 100% rename from examples/deviceinfo.mojo rename to examples/mojo/deviceinfo.mojo diff --git "a/examples/hello.\360\237\224\245" "b/examples/mojo/hello.\360\237\224\245" similarity index 100% rename from "examples/hello.\360\237\224\245" rename to "examples/mojo/hello.\360\237\224\245" diff --git a/examples/hello_interop.mojo b/examples/mojo/hello_interop.mojo similarity index 100% rename from examples/hello_interop.mojo rename to examples/mojo/hello_interop.mojo diff --git a/examples/life/README.md b/examples/mojo/life/README.md similarity index 100% rename from examples/life/README.md rename to examples/mojo/life/README.md diff --git a/examples/life/benchmark.mojo b/examples/mojo/life/benchmark.mojo similarity index 100% rename from examples/life/benchmark.mojo rename to examples/mojo/life/benchmark.mojo diff --git a/examples/life/gridv1.mojo b/examples/mojo/life/gridv1.mojo similarity index 100% rename from examples/life/gridv1.mojo rename to examples/mojo/life/gridv1.mojo diff --git a/examples/life/gridv2.mojo b/examples/mojo/life/gridv2.mojo similarity index 100% rename from examples/life/gridv2.mojo rename to examples/mojo/life/gridv2.mojo diff --git a/examples/life/lifev1.mojo b/examples/mojo/life/lifev1.mojo similarity index 100% rename from examples/life/lifev1.mojo rename to examples/mojo/life/lifev1.mojo diff --git a/examples/life/lifev2.mojo b/examples/mojo/life/lifev2.mojo similarity index 100% rename from examples/life/lifev2.mojo rename to examples/mojo/life/lifev2.mojo diff --git a/examples/life/mojoproject.toml b/examples/mojo/life/mojoproject.toml similarity index 100% rename from examples/life/mojoproject.toml rename to examples/mojo/life/mojoproject.toml diff --git a/examples/life/test/test_gridv1.mojo b/examples/mojo/life/test/test_gridv1.mojo similarity index 100% rename from examples/life/test/test_gridv1.mojo rename to examples/mojo/life/test/test_gridv1.mojo diff --git a/examples/life/test/test_gridv2.mojo b/examples/mojo/life/test/test_gridv2.mojo similarity index 100% rename from examples/life/test/test_gridv2.mojo rename to examples/mojo/life/test/test_gridv2.mojo diff --git a/examples/mandelbrot.mojo b/examples/mojo/mandelbrot.mojo similarity index 100% rename from examples/mandelbrot.mojo rename to examples/mojo/mandelbrot.mojo diff --git a/examples/matmul.mojo b/examples/mojo/matmul.mojo similarity index 100% rename from examples/matmul.mojo rename to examples/mojo/matmul.mojo diff --git a/examples/mojoproject.toml b/examples/mojo/mojoproject.toml similarity index 100% rename from examples/mojoproject.toml rename to examples/mojo/mojoproject.toml diff --git a/examples/nbody.mojo b/examples/mojo/nbody.mojo similarity index 100% rename from examples/nbody.mojo rename to examples/mojo/nbody.mojo diff --git a/examples/operators/README.md b/examples/mojo/operators/README.md similarity index 100% rename from examples/operators/README.md rename to examples/mojo/operators/README.md diff --git a/examples/operators/main.mojo b/examples/mojo/operators/main.mojo similarity index 100% rename from examples/operators/main.mojo rename to examples/mojo/operators/main.mojo diff --git a/examples/operators/mojoproject.toml b/examples/mojo/operators/mojoproject.toml similarity index 100% rename from examples/operators/mojoproject.toml rename to examples/mojo/operators/mojoproject.toml diff --git a/examples/operators/my_complex.mojo b/examples/mojo/operators/my_complex.mojo similarity index 100% rename from examples/operators/my_complex.mojo rename to examples/mojo/operators/my_complex.mojo diff --git a/examples/operators/test_my_complex.mojo b/examples/mojo/operators/test_my_complex.mojo similarity index 100% rename from examples/operators/test_my_complex.mojo rename to examples/mojo/operators/test_my_complex.mojo diff --git a/examples/pymatmul.py b/examples/mojo/pymatmul.py similarity index 100% rename from examples/pymatmul.py rename to examples/mojo/pymatmul.py diff --git a/examples/reduce.mojo b/examples/mojo/reduce.mojo similarity index 100% rename from examples/reduce.mojo rename to examples/mojo/reduce.mojo diff --git a/examples/simple_interop.py b/examples/mojo/simple_interop.py similarity index 100% rename from examples/simple_interop.py rename to examples/mojo/simple_interop.py diff --git a/examples/mojo/testing/.gitattributes b/examples/mojo/testing/.gitattributes new file mode 100644 index 0000000000..8f61a8e774 --- /dev/null +++ b/examples/mojo/testing/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/examples/testing/.gitignore b/examples/mojo/testing/.gitignore similarity index 100% rename from examples/testing/.gitignore rename to examples/mojo/testing/.gitignore diff --git a/examples/testing/README.md b/examples/mojo/testing/README.md similarity index 100% rename from examples/testing/README.md rename to examples/mojo/testing/README.md diff --git a/examples/testing/mojoproject.toml b/examples/mojo/testing/mojoproject.toml similarity index 100% rename from examples/testing/mojoproject.toml rename to examples/mojo/testing/mojoproject.toml diff --git a/examples/testing/src/example.mojo b/examples/mojo/testing/src/example.mojo similarity index 100% rename from examples/testing/src/example.mojo rename to examples/mojo/testing/src/example.mojo diff --git a/examples/testing/src/my_math/__init__.mojo b/examples/mojo/testing/src/my_math/__init__.mojo similarity index 100% rename from examples/testing/src/my_math/__init__.mojo rename to examples/mojo/testing/src/my_math/__init__.mojo diff --git a/examples/testing/src/my_math/utils.mojo b/examples/mojo/testing/src/my_math/utils.mojo similarity index 100% rename from examples/testing/src/my_math/utils.mojo rename to examples/mojo/testing/src/my_math/utils.mojo diff --git a/examples/testing/test/my_math/test_dec.mojo b/examples/mojo/testing/test/my_math/test_dec.mojo similarity index 100% rename from examples/testing/test/my_math/test_dec.mojo rename to examples/mojo/testing/test/my_math/test_dec.mojo diff --git a/examples/testing/test/my_math/test_inc.mojo b/examples/mojo/testing/test/my_math/test_inc.mojo similarity index 100% rename from examples/testing/test/my_math/test_inc.mojo rename to examples/mojo/testing/test/my_math/test_inc.mojo diff --git a/examples/notebooks/.gitignore b/examples/notebooks/.gitignore new file mode 100644 index 0000000000..eb804ba88a --- /dev/null +++ b/examples/notebooks/.gitignore @@ -0,0 +1,3 @@ +roberta/ +roberta.torchscript +onnx diff --git a/examples/notebooks/README.md b/examples/notebooks/README.md new file mode 100644 index 0000000000..b2c895bb95 --- /dev/null +++ b/examples/notebooks/README.md @@ -0,0 +1,68 @@ +# MAX Jupyter notebooks + +This page explains how to get started with MAX example notebooks, and this +repo directory contains notebooks that demonstrate some of MAX features. + +If you're not familiar with Jupyter notebooks, they're files that allow you to +create documents with live code, equations, visualizations, and explanatory +text. They're basically documents with executable code blocks, making them +great for sharing code experiments and programming tutorials. + +## Get started in VS Code + +Visual Studio Code is a great environment for programming with Jupyter notebooks. +Especially if you're developing with MAX on a remote system, using VS +Code is ideal because it allows you to edit and interact with notebooks on the +remote machine where you've installed MAX. + +All you need is MAX (via Magic) and the Jupyter VS Code extension: + +1. [Install Magic](https://docs.modular.com/magic). + +2. Install [Visual Studio Code](https://code.visualstudio.com/) and the + [Jupyter extension](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter). + +3. Open any `.ipynb` file in this repo and start running the code. + +## Get started with JupyterLab + +You can also run MAX notebooks in a local instance of JupyterLab. The following +is just a quick setup guide for Linux users, but it might not work with your +system (these instructions don't support remote access to the JupyterLab). For +more details about using JupyterLab, see the complete [JupyterLab installation +guide](https://jupyterlab.readthedocs.io/en/latest/getting_started/installation.html). + +### 1. Launch JupyterLab + +You can use either Magic or conda. + +#### Using Magic + +If you have [`magic`](https://docs.modular.com/magic) you can run the following +command to launch JupyterLab from this directory: + +```sh +magic run jupyter lab +``` + +After a moment, it will open a browser window with JupterLab running. + +#### Using conda + +Create a Conda environment, activate that enviroment, and install JupyterLab. + +``` sh +# Create a Conda environment if you don't have one +conda create -n max-repo +# Activate the environment +conda env update -n max-repo -f environment.yml --prune +# run JupyterLab +conda run -n max-repo jupyter lab +``` + +After a moment, it will open a browser window with JupterLab running. + +### 2. Run the .ipynb notebooks + +The left nav bar should show all the notebooks in this directory. +Open any `.ipynb` file and start running the code. diff --git a/examples/notebooks/gemma2b-python-onnx.ipynb b/examples/notebooks/gemma2b-python-onnx.ipynb new file mode 100644 index 0000000000..16423dcad6 --- /dev/null +++ b/examples/notebooks/gemma2b-python-onnx.ipynb @@ -0,0 +1,425 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using Gemma-2B with MAX Engine 🏎️ on CPU\n", + "\n", + "**In this notebook we will walk through an example of using [Gemma-2B](https://huggingface.co/google/gemma-2b) model with MAX Engine 🏎️ on CPU and float32. Check out the [roadmap](https://docs.modular.com/max/roadmap) for quantization and the GPU support.**\n", + "\n", + "The Gemma-2B Large Language Model (LLM) is a pretrained generative text model with 2 billion parameters. Generative text models generate the next token iteratively given a sequence of past tokens representing the input prompt plus already generated response tokens.\n", + "\n", + "Thus the underlying transformer model is invoked in each iteration of this loop until we reach the stopping condition (either the maximum number of generated tokens or a token designated as the end).\n", + "\n", + "\n", + "### Requirements\n", + "\n", + "1. Please make sure you have installed `max` as described in our [getting started](https://docs.modular.com/max/get-started/) guide\n", + "2. Valid [huggingface access token](https://huggingface.co/docs/hub/security-tokens)\n", + "3. Gemma-2b is a gated model. Make sure you have accepted the [terms of use](https://huggingface.co/google/gemma-2b) to be able to continue\n", + "4. **The model size is 13G**. Please make sure you have enough disk space to download the model and for the converted ONNX counterpart as we will use them later in this tutorial.\n", + "5. The runtime memory requirement is around **24G** at minimum (skipping the optional part 👇) and **50G** to run all the cells\n", + "\n", + "With all that, we install the required packages as follows" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!python3 -m pip install -q torch --index-url https://download.pytorch.org/whl/cpu\n", + "!python3 -m pip install -q transformers onnx huggingface_hub" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Huggingface hub login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "from huggingface_hub import login\n", + "\n", + "access_token = getpass.getpass('Enter your Hugging Face Access Token')\n", + "login(token=access_token)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vanilla transformers\n", + "\n", + "Let's first see how the model generates a response using the vanilla `transformers`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "import torch\n", + "from transformers import AutoTokenizer, AutoModelForCausalLM\n", + "\n", + "PROMPT = \"Why did the chicken cross the road?\"\n", + "hf_path = \"google/gemma-2b\"\n", + "hfmodel = AutoModelForCausalLM.from_pretrained(hf_path)\n", + "hftokenizer = AutoTokenizer.from_pretrained(hf_path)\n", + "hftokenizer.pad_token = hftokenizer.eos_token\n", + "\n", + "# Tokenize the text prompt\n", + "input_ids = hftokenizer(PROMPT, return_tensors=\"pt\", max_length=128, truncation=True)\n", + "\n", + "# Run generation\n", + "out_ids = hfmodel.generate(**input_ids, max_new_tokens=15, do_sample=False)\n", + "\n", + "# De-tokenize the generated response\n", + "response = hftokenizer.batch_decode(out_ids, skip_special_tokens=True)[0][len(PROMPT):]\n", + "print(\"Response:\", response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next token generation\n", + "\n", + "Now that we see that the model works, let's try to decompose its `hfmodel.generate` method because we will encounter it later. We should be able to get the same output as before, but by only using `forward` method of the model.\n", + "\n", + "The code below is a simplified version of the actual loop you can find in the transformer's source code. It starts by initializing the current sequense to the given prompt and then generates 10 subsequent tokens - these tokens constitute the response of the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from time import time\n", + "from transformers.generation.logits_process import LogitsProcessorList\n", + "\n", + "logits_processor = LogitsProcessorList()\n", + "\n", + "time_start = time()\n", + "current_seq = input_ids.input_ids\n", + "N_TOKENS = 10\n", + "for idx in range(N_TOKENS):\n", + " # Run model's `forward` on the current sequence.\n", + " # 'logits' output would let us determine the next token for this sequence\n", + " outputs = hfmodel(current_seq, return_dict=True).logits\n", + "\n", + " # Get the newly generated next token\n", + " next_token_logits = outputs[:, -1, :]\n", + " next_tokens_scores = logits_processor(current_seq, next_token_logits)\n", + " next_tokens = torch.argmax(next_tokens_scores, dim=-1)\n", + "\n", + " print(hftokenizer.decode(next_tokens), end=' ', flush=True)\n", + "\n", + " # Append the new token to our sequence\n", + " current_seq = torch.cat([current_seq, next_tokens[:, None]], dim=-1)\n", + "\n", + "time_finish = time()\n", + "print(f\"Prompt: {PROMPT}\")\n", + "print(\"Response:\", hftokenizer.batch_decode(current_seq, skip_special_tokens=True)[0][len(PROMPT):])\n", + "print(f\"Tokens per second: {N_TOKENS / (time_finish - time_start):.2f}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert to ONNX with optimum\n", + "\n", + "Great! We were able to see the same response now with using only `forward` method of our model. We're now ready to use MAX Engine 🏎️ inference.\n", + "To do that, we start by getting an ONNX version of the model. The easiest way to do it is to use HuggingFace `optimum` tool which you can install as follows.\n", + "At the moment of writing this notebook, optimum gemma support is unreleased and but is included in the upstream [here](https://github.com/huggingface/optimum/pull/1714)\n", + "which we can get as follows" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!python3 -m pip install -q git+https://github.com/huggingface/optimum.git@e0cbf7dea2531603ecd0f36dfce0657baa4310ec" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then the conversion to ONNX. This part can take a while. Also please make sure you've enough disk space." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!optimum-cli export onnx --model \"google/gemma-2b\" \"./onnx/gemma-2b-onnx\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Optional: Examine the ONNX model\n", + "\n", + "**Caveat: 📢 if you want to run this 👇 part you will need around 50G of memory to be able to continue finishing the notebook. Otherwise, check out the included results below.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "import onnx\n", + "\n", + "onnxmodel = onnx.load(\"./onnx/gemma-2b-onnx/model.onnx\")\n", + "\n", + "def print_dims(tensor):\n", + " dims = []\n", + " for dim in tensor.type.tensor_type.shape.dim:\n", + " if dim.HasField(\"dim_value\"):\n", + " dims.append(String(dim.dim_value))\n", + " elif dim.HasField(\"dim_param\"):\n", + " dims.append(String(dim.dim_param))\n", + " print(onnx.TensorProto.DataType.Name(tensor.type.tensor_type.elem_type), end=\" \")\n", + " print(\"[\", \", \".join(dims), \"]\")\n", + "\n", + "print(\"=== Inputs ===\")\n", + "for input_tensor in onnxmodel.graph.input:\n", + " print(input_tensor.name, end=\": \")\n", + " print_dims(input_tensor)\n", + "\n", + "print(\"\\n=== Outputs ===\")\n", + "for output_tensor in onnxmodel.graph.output:\n", + " print(output_tensor.name, end=\": \")\n", + " print_dims(output_tensor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "=== Inputs ===\n", + "input_ids: INT64 [ batch_size, sequence_length ]\n", + "attention_mask: INT64 [ batch_size, past_sequence_length + 1 ]\n", + "position_ids: INT64 [ batch_size, sequence_length ]\n", + "past_key_values.0.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.0.value: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.1.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.1.value: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.2.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.2.value: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.3.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.3.value: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.4.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.4.value: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.5.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "past_key_values.5.value: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "\n", + "...\n", + "\n", + "=== Outputs ===\n", + "logits: FLOAT [ batch_size, sequence_length, 256000 ]\n", + "present.0.key: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.0.value: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.1.key: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.1.value: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.2.key: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.2.value: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.3.key: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.3.value: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.4.key: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.4.value: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.5.key: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "present.5.value: FLOAT [ batch_size, 1, past_sequence_length + 1, 256 ]\n", + "\n", + "...\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It might be quite surprising to see so many inputs and outputs in the model!\n", + "\n", + "\n", + "In short, we have the following inputs:\n", + "* input_ids\n", + "* position_ids\n", + "* attention_mask\n", + "* past_key_values\n", + "\n", + "And the outputs will be:\n", + "* logits\n", + "* present_key_value\n", + "\n", + "**Note** that since ONNX doesn't support dictionaries as a input/output type, the `key_value` is expanded into 18 pairs of individual tensors (18 is the number of attention layers). The number of KV heads is 1 and the size of each key/value vector is 256.\n", + "\n", + "```\n", + "past_key_values.0.key: FLOAT [ batch_size, 1, past_sequence_length, 256 ]\n", + "```\n", + "\n", + "\n", + "\n", + "In order to use this model we will need to slightly modify our glue code to correctly weave all these values from each iteration to the next.\n", + "Specifically, we will need to pass the `key_values` from previous iteration to the current (for the first iteration they are initializes as empty tensors).\n", + "We will also need to correctly fill in `position_ids` and `attention_mask` tensors and update them on each iteration. We will not get into all the details of how exactly all these tensors affect the model behavior and should be used - this is an extremely interesting topic, but it lays beyond the scope of this walkthrough." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## MAX Engine 🏎️\n", + "\n", + "With that we're finally ready to use the MAX Engine 🏎️ for inference.\n", + "\n", + "The code modifications follows our previous approach and is quite minimal. All we need to do is to load the ONNX model (whch can take a while) into an `InferenceSession` object and instead of using the `hfmodel` we will need to use `maxmodel.execute`, and pack the input values into a dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "from max import engine\n", + "# Create an InferenceSession and load the ONNX model\n", + "session = engine.InferenceSession()\n", + "maxmodel = session.load(\"./onnx/gemma-2b-onnx/model.onnx\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also quickly inspect the input and output metadata that match the ONNX version above" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for tensor in maxmodel.input_metadata:\n", + " print(f'name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}')\n", + "\n", + "for tensor in maxmodel.output_metadata:\n", + " print(f'name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is the how to get the response from our `maxmodel`. The token per second can be up to **2X** faster comparing to the PyTorch version. Note that this tutorial doesn't provide an accurate benchmark. For more, please check out our [performance dashboard](https://performance.modular.com/)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "inputs = {}\n", + "N_BATCH = 1\n", + "N_LAYERS = 18\n", + "N_HEADS = 1\n", + "KV_LEN = 256\n", + "# Initialize the additional layer to 0 for the first iteration:\n", + "for i in range(N_LAYERS):\n", + " inputs[f\"past_key_values.{i}.key\"] = torch.zeros([N_BATCH, N_HEADS, 0, KV_LEN], dtype=torch.float).numpy()\n", + " inputs[f\"past_key_values.{i}.value\"] = torch.zeros([N_BATCH, N_HEADS, 0, KV_LEN], dtype=torch.float).numpy()\n", + "\n", + "current_seq = input_ids.input_ids\n", + "\n", + "time_start = time()\n", + "for idx in range(N_TOKENS):\n", + " # Prepare inputs dictionary\n", + " inputs[\"input_ids\"] = current_seq.numpy()\n", + " inputs[\"position_ids\"] = torch.arange(inputs[\"input_ids\"].shape[1], dtype=torch.long).unsqueeze(0).numpy()\n", + " inputs[\"attention_mask\"] = torch.ones([1, inputs[\"past_key_values.0.key\"].shape[2] + inputs[\"input_ids\"].shape[1]], dtype=torch.int64).numpy()\n", + "\n", + " # Run the model with MAX engine\n", + " max_outputs = maxmodel.execute(**inputs)\n", + " outputs = torch.from_numpy(max_outputs[\"logits\"])\n", + "\n", + " # Get the newly generated next token\n", + " next_token_logits = outputs[:, -1, :]\n", + " next_tokens_scores = logits_processor(current_seq, next_token_logits)\n", + " next_tokens = torch.argmax(next_tokens_scores, dim=-1)\n", + "\n", + " print(hftokenizer.decode(next_tokens), end=' ', flush=True)\n", + "\n", + " # Append the new token to our sequence\n", + " current_seq = torch.cat([current_seq, next_tokens[:, None]], dim=-1)\n", + "\n", + " # Update the KV cache for the next iteration\n", + " for i in range(N_LAYERS):\n", + " inputs[f\"past_key_values.{i}.key\"] = max_outputs[f\"present.{i}.key\"]\n", + " inputs[f\"past_key_values.{i}.value\"] = max_outputs[f\"present.{i}.value\"]\n", + "\n", + "time_finish = time()\n", + "\n", + "print(f\"Prompt: {PROMPT}\")\n", + "print(\"Response:\", hftokenizer.batch_decode(current_seq.numpy(), skip_special_tokens=True)[0][len(PROMPT):])\n", + "print(f\"Tokens per second: {idx/(time_finish-time_start):.2f}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is it! 🎉\n", + "\n", + "Serving an LLM has historically been not an easy task, but hopefully this example lifts the curtain on how this can be done. MAX Engine 🏎️ doesn't (yet) make this process easier, however, if you've already gone this path with ONNX or TorchScript, switching to MAX should be trivial and bring easy performance wins." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebooks/mistral7b-python-onnx.ipynb b/examples/notebooks/mistral7b-python-onnx.ipynb new file mode 100644 index 0000000000..400a4dae53 --- /dev/null +++ b/examples/notebooks/mistral7b-python-onnx.ipynb @@ -0,0 +1,404 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using Mistral-7B with MAX Engine 🏎️ on CPU\n", + "\n", + "**In this notebook we will walk through an example of using [Mistral-7B](https://huggingface.co/mistralai/Mistral-7B-v0.1) model with MAX Engine 🏎️ on CPU and float32. Check out the [roadmap](https://docs.modular.com/max/roadmap) for quantization and the GPU support.**\n", + "\n", + "The Mistral-7B-v0.1 Large Language Model (LLM) is a pretrained generative text model with 7 billion parameters. Generative text models generate the next token iteratively given a sequence of past tokens representing the input prompt plus already generated response tokens.\n", + "\n", + "Thus the underlying transformer model is invoked in each iteration of this loop until we reach the stopping condition (either the maximum number of generated tokens or a token designated as the end).\n", + "\n", + "**Caveats:**\n", + "\n", + "* **The model size is 28G**. Please make sure you have enough disk space to download the model and for the converted ONNX counterpart as we will use them later in this tutorial.\n", + "* **The runtime memory requirement is around 65G** to be able finish the notebook and run all the cells.\n", + "\n", + "First, make sure you have installed `max` as described in the [getting started](https://docs.modular.com/max/get-started/) as well as `PyTorch` and `transformers` packages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!python3 -m pip install -q torch --index-url https://download.pytorch.org/whl/cpu\n", + "!python3 -m pip install -q transformers onnx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vanilla transformers\n", + "\n", + "Let's first see how the model generates a response using the vanilla `transformers`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "import torch\n", + "from transformers import AutoTokenizer, AutoModelForCausalLM\n", + "\n", + "PROMPT = \"Why did the chicken cross the road?\"\n", + "\n", + "hf_path = \"mistralai/Mistral-7B-v0.1\"\n", + "hfmodel = AutoModelForCausalLM.from_pretrained(hf_path)\n", + "hftokenizer = AutoTokenizer.from_pretrained(hf_path)\n", + "hftokenizer.pad_token = hftokenizer.eos_token\n", + "\n", + "# Tokenize the text prompt\n", + "input_ids = hftokenizer(PROMPT, return_tensors=\"pt\", max_length=128, truncation=True).input_ids\n", + "\n", + "# Run generation\n", + "out_ids = hfmodel.generate(input_ids=input_ids, max_new_tokens=15, do_sample=False)\n", + "\n", + "# De-tokenize the generated response\n", + "response = hftokenizer.batch_decode(out_ids.numpy(), skip_special_tokens=True)[0][len(PROMPT):]\n", + "print(\"Response:\", response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next token generation\n", + "\n", + "Now that we see that the model works, let's try to decompose its `hfmodel.generate` method because we will encounter it later. We should be able to get the same output as before, but by only using `forward` method of the model.\n", + "\n", + "The code below is a simplified version of the actual loop you can find in the transformer's source code. It starts by initializing the current sequense to the given prompt and then generates 10 subsequent tokens - these tokens constitute the response of the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from time import time\n", + "from transformers.generation.logits_process import LogitsProcessorList\n", + "\n", + "logits_processor = LogitsProcessorList()\n", + "\n", + "time_start = time()\n", + "current_seq = input_ids\n", + "N_TOKENS = 10\n", + "for idx in range(N_TOKENS):\n", + " # Run model's `forward` on the current sequence.\n", + " # 'logits' output would let us determine the next token for this sequence\n", + " outputs = hfmodel(current_seq, return_dict=True).logits\n", + "\n", + " # Get the newly generated next token\n", + " next_token_logits = outputs[:, -1, :]\n", + " next_tokens_scores = logits_processor(current_seq, next_token_logits)\n", + " next_tokens = torch.argmax(next_tokens_scores, dim=-1)\n", + "\n", + " print(hftokenizer.decode(next_tokens), end=' ', flush=True)\n", + "\n", + " # Append the new token to our sequence\n", + " current_seq = torch.cat([current_seq, next_tokens[:, None]], dim=-1)\n", + "\n", + "time_finish = time()\n", + "print(f\"Prompt: {PROMPT}\")\n", + "print(\"Response:\", hftokenizer.batch_decode(current_seq.numpy(), skip_special_tokens=True)[0][len(PROMPT):])\n", + "print(f\"Tokens per second: {N_TOKENS / (time_finish - time_start):.2f}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert to ONNX with optimum\n", + "\n", + "Great! We were able to see the same response now with using only `forward` method of our model. We're now ready to use MAX Engine 🏎️ inference.\n", + "To do that, we start by getting an ONNX version of the model. The easiest way to do it is to use HuggingFace `optimum` tool which you can install as follows" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!python3 -m pip install -q optimum" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then the conversion to ONNX. This part can take a while. Also please make sure you've enough disk space." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!optimum-cli export onnx --model \"mistralai/Mistral-7B-v0.1\" \"./onnx/mistral-7b-onnx\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Optional: Examine the ONNX model\n", + "\n", + "**Caveat: 📢 if you want to run this 👇 part you will need around 95G of memory to be able to continue finishing the notebook. Otherwise, check out the included results below.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "import onnx\n", + "\n", + "# It will take a while to load in ONNX as well as occupying 28G more memory!\n", + "onnxmodel = onnx.load(\"./onnx/mistral-7b-onnx/model.onnx\")\n", + "\n", + "def print_dims(tensor):\n", + " dims = []\n", + " for dim in tensor.type.tensor_type.shape.dim:\n", + " if dim.HasField(\"dim_value\"):\n", + " dims.append(String(dim.dim_value))\n", + " elif dim.HasField(\"dim_param\"):\n", + " dims.append(String(dim.dim_param))\n", + " print(onnx.TensorProto.DataType.Name(tensor.type.tensor_type.elem_type), end=\" \")\n", + " print(\"[\", \", \".join(dims), \"]\")\n", + "\n", + "print(\"=== Inputs ===\")\n", + "for input_tensor in onnxmodel.graph.input:\n", + " print(input_tensor.name, end=\": \")\n", + " print_dims(input_tensor)\n", + "\n", + "print(\"\\n=== Outputs ===\")\n", + "for output_tensor in onnxmodel.graph.output:\n", + " print(output_tensor.name, end=\": \")\n", + " print_dims(output_tensor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "=== Inputs ===\n", + "input_ids: INT64 [ batch_size, sequence_length ]\n", + "attention_mask: INT64 [ batch_size, past_sequence_length + 1 ]\n", + "position_ids: INT64 [ batch_size, sequence_length ]\n", + "past_key_values.0.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.0.value: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.1.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.1.value: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.2.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.2.value: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.3.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.3.value: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.4.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.4.value: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.5.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "past_key_values.5.value: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "\n", + "...\n", + "\n", + "=== Outputs ===\n", + "logits: FLOAT [ batch_size, sequence_length, 32000 ]\n", + "present.0.key: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.0.value: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.1.key: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.1.value: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.2.key: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.2.value: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.3.key: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.3.value: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.4.key: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.4.value: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.5.key: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "present.5.value: FLOAT [ batch_size, 8, past_sequence_length + 1, 128 ]\n", + "\n", + "...\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It might be quite surprising to see so many inputs and outputs in the model!\n", + "\n", + "To decode what they all mean and how they should be used we will need to look into the [documentation of the MistralModel](https://huggingface.co/docs/transformers/v4.38.2/en/model_doc/mistral#transformers.MistralModel).\n", + "\n", + "In short, we have the following inputs:\n", + "* input_ids\n", + "* position_ids\n", + "* attention_mask\n", + "* past_key_values\n", + "\n", + "And the outputs will be:\n", + "* logits\n", + "* present_key_value\n", + "\n", + "The `past_key_values.n.key` and `past_key_values.n.value` represents cached states from previous tokens in the sequence to avoid redundant recalculations, thus speeding up the generation process.\n", + "\n", + "**Note** that since ONNX doesn't support dictionaries as a input/output type, the `key_value` is expanded into 32 pairs of individual tensors (32 is the number of attention layers). The number of KV heads is 8 which are part of its [Grouped Query Attention (GQA)](https://arxiv.org/abs/2305.13245) mechanism. The GQA mechanism allows the model to achieve faster inference times by optimizing the attention mechanism.\n", + "\n", + "```\n", + "past_key_values.0.key: FLOAT [ batch_size, 8, past_sequence_length, 128 ]\n", + "```\n", + "\n", + "Moreover, the size of each key/value vector is 128.\n", + "\n", + "In order to use this model we will need to slightly modify our glue code to correctly weave all these values from each iteration to the next.\n", + "Specifically, we will need to pass the `key_values` from previous iteration to the current (for the first iteration they are initializes as empty tensors).\n", + "We will also need to correctly fill in `position_ids` and `attention_mask` tensors and update them on each iteration. We will not get into all the details of how exactly all these tensors affect the model behavior and should be used - this is an extremely interesting topic, but it is beyond the scope of this walkthrough." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## MAX Engine 🏎️\n", + "\n", + "With that we're finally ready to use the MAX Engine 🏎️ for inference.\n", + "\n", + "The code modifications follows our previous approach and is quite minimal. All we need to do is to load the ONNX model (whch can take a while) into an `InferenceSession` object and instead of using the `hfmodel` we will need to use `maxmodel.execute`, and pack the input values into a dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "from max import engine\n", + "# Create an InferenceSession and load the ONNX model\n", + "session = engine.InferenceSession()\n", + "maxmodel = session.load(\"./onnx/mistral-7b-onnx/model.onnx\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also quickly inspect the input and output metadata that match the ONNX version above" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for tensor in maxmodel.input_metadata:\n", + " print(f'name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}')\n", + "\n", + "for tensor in maxmodel.output_metadata:\n", + " print(f'name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is the how to get the response from our `maxmodel`. The token per second can be up to **2X** faster comparing to the PyTorch version. Note that this tutorial doesn't provide an accurate benchmark. For more, please check out our [performance dashboard](https://performance.modular.com/)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "inputs = {}\n", + "N_BATCH = 1\n", + "N_LAYERS = 32\n", + "N_HEADS = 8\n", + "KV_LEN = 128\n", + "# Initialize the additional layer to 0 for the first iteration:\n", + "for i in range(N_LAYERS):\n", + " inputs[f\"past_key_values.{i}.key\"] = torch.zeros([N_BATCH, N_HEADS, 0, KV_LEN], dtype=torch.float).numpy()\n", + " inputs[f\"past_key_values.{i}.value\"] = torch.zeros([N_BATCH, N_HEADS, 0, KV_LEN], dtype=torch.float).numpy()\n", + "\n", + "current_seq = input_ids\n", + "\n", + "time_start = time()\n", + "for idx in range(N_TOKENS):\n", + " # Prepare inputs dictionary\n", + " inputs[\"input_ids\"] = current_seq.numpy()\n", + " inputs[\"position_ids\"] = torch.arange(inputs[\"input_ids\"].shape[1], dtype=torch.long).unsqueeze(0).numpy()\n", + " inputs[\"attention_mask\"] = torch.ones([1, inputs[\"past_key_values.0.key\"].shape[2] + inputs[\"input_ids\"].shape[1]], dtype=torch.int64).numpy()\n", + "\n", + " # Run the model with MAX engine\n", + " max_outputs = maxmodel.execute(**inputs)\n", + " outputs = torch.from_numpy(max_outputs[\"logits\"])\n", + "\n", + " # Get the newly generated next token\n", + " next_token_logits = outputs[:, -1, :]\n", + " next_tokens_scores = logits_processor(current_seq, next_token_logits)\n", + " next_tokens = torch.argmax(next_tokens_scores, dim=-1)\n", + "\n", + " print(hftokenizer.decode(next_tokens), end=' ', flush=True)\n", + "\n", + " # Append the new token to our sequence\n", + " current_seq = torch.cat([current_seq, next_tokens[:, None]], dim=-1)\n", + "\n", + " # Update the KV cache for the next iteration\n", + " for i in range(N_LAYERS):\n", + " inputs[f\"past_key_values.{i}.key\"] = max_outputs[f\"present.{i}.key\"]\n", + " inputs[f\"past_key_values.{i}.value\"] = max_outputs[f\"present.{i}.value\"]\n", + "\n", + "time_finish = time()\n", + "\n", + "print(f\"Prompt: {PROMPT}\")\n", + "print(\"Response:\", hftokenizer.batch_decode(current_seq.numpy(), skip_special_tokens=True)[0][len(PROMPT):])\n", + "print(f\"Tokens per second: {idx/(time_finish-time_start):.2f}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That is it! 🎉\n", + "\n", + "Serving an LLM has historically been not an easy task, but hopefully this example lifts the curtain on how this can be done. MAX Engine 🏎️ doesn't (yet) make this process easier, however, if you've already gone this path with ONNX or TorchScript, switching to MAX should be trivial and bring easy performance wins." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebooks/pixi.toml b/examples/notebooks/pixi.toml new file mode 100644 index 0000000000..a6ad3f7694 --- /dev/null +++ b/examples/notebooks/pixi.toml @@ -0,0 +1,13 @@ +[project] +name = "MAX notebooks" +version = "1.0.0" +description = "Environment for running JupyterLab" +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +python = ">=3.9,<3.13" +max = "*" +pip = ">=24.0,<25" +jupyterlab = ">=4.2.5,<5" diff --git a/examples/notebooks/roberta-python-pytorch.ipynb b/examples/notebooks/roberta-python-pytorch.ipynb new file mode 100644 index 0000000000..683efa156e --- /dev/null +++ b/examples/notebooks/roberta-python-pytorch.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Copyright 2025 Modular, Inc: Licensed under the Apache License v2.0 with LLVM Exceptions.*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MAX Engine and PyTorch model example" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The [Python API for MAX Engine](https://docs.modular.com/engine/reference/python/engine) enables you\n", + "to upgrade your runtime performance for PyTorch, TensorFlow, and ONNX models,\n", + "on a wide range of hardware, with just three lines of code (not counting the\n", + "import):\n", + "\n", + "```python\n", + "from max import engine\n", + "\n", + "# Load your model:\n", + "session = engine.InferenceSession()\n", + "model = session.load(model_path)\n", + "\n", + "# Prepare the inputs, then run an inference:\n", + "outputs = model.execute(**inputs)\n", + "\n", + "# Process the output here.\n", + "```\n", + "\n", + "That's all you need! Everything else is the usual code to prepare your\n", + "inputs and process the outputs.\n", + "\n", + "But, it's always nice to see a fully working example. So the\n", + "rest of this page shows how to run an inference using a version of\n", + "[RoBERTa from Cardiff\n", + "NLP](https://huggingface.co/cardiffnlp/twitter-roberta-base-emotion-multilabel-latest),\n", + "which is a language model trained on tweets to perform sentiment analysis.\n", + "\n", + "This example uses is a PyTorch model (which must be converted to TorchScript\n", + "format), and it's just as easy to load a model from ONNX or TensorFlow (in\n", + "SavedModel format)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Install the MAX Engine Python package" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Naturally, you first need to install the `max` Python package.\n", + "This package is not hosted in a package repository (PyPI), and can only be\n", + "installed with the `modular` CLI tool.\n", + "\n", + "For instructions, see\n", + "[Get started with MAX Engine](https://docs.modular.com/max/get-started)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Install the MAX Engine Python package\n", + "!python3 -m pip install -q --find-links \"$(modular config max.path)/wheels\" max-engine\n", + "# Install other packages\n", + "!python3 -m pip install -q transformers\n", + "!python3 -m pip install -q torch --index-url https://download.pytorch.org/whl/cpu" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Python modules" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To start coding, we need some libraries that help us get the model and process\n", + "the input/output data.\n", + "\n", + "NOTE: Make sure you have these packages installed:\n", + "\n", + "```sh\n", + "python3 -m pip install torch transformers\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# suppress extraneous logging\n", + "import os\n", + "os.environ[\"TRANSFORMERS_VERBOSITY\"] = \"critical\"\n", + "os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "import torch\n", + "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n", + "\n", + "from max import engine\n", + "from max.dtype import DType" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Download the model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we download the [RoBERTa model](https://huggingface.co/cardiffnlp/twitter-roberta-base-emotion-multilabel-latest)\n", + "from HuggingFace and save it in the PyTorch TorchScript format." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "HF_MODEL_NAME = \"cardiffnlp/twitter-roberta-base-emotion-multilabel-latest\"\n", + "hf_model = AutoModelForSequenceClassification.from_pretrained(HF_MODEL_NAME)\n", + "hf_model.config.return_dict = False\n", + "\n", + "# Converting model to TorchScript\n", + "model_path = Path(\"roberta.torchscript\")\n", + "batch = 1\n", + "seqlen = 128\n", + "inputs = {\n", + " \"input_ids\": torch.zeros((batch, seqlen), dtype=torch.int64),\n", + " \"attention_mask\": torch.zeros((batch, seqlen), dtype=torch.int64),\n", + "}\n", + "with torch.no_grad():\n", + " traced_model = torch.jit.trace(\n", + " hf_model, example_kwarg_inputs=inputs, strict=False\n", + " )\n", + "\n", + "torch.jit.save(traced_model, model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load and compile the model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, we load and compile the model in MAX Engine using an\n", + "[`InferenceSession`](https://docs.modular.com/engine/reference/python/engine.html#max.engine.InferenceSession).\n", + "\n", + "When loading a TorchScript model, you need to specify the shape and data type\n", + "for all input tensors. This is required because TorchScript models do not\n", + "include input spec annotations (unlike TensorFlow and ONNX models), which MAX\n", + "Engine needs to compile the model.\n", + "\n", + "To define the input specs, you need to create a list of\n", + "[`TorchInputSpec`](https://docs.modular.com/engine/reference/python/engine#max.engine.TorchInputSpec)\n", + "objects (one item for each input), and pass the list to\n", + "[`InferenceSession.load`](https://docs.modular.com/engine/reference/python/engine.html#max.engine.InferenceSession.load).\n", + "For example, here's how to declare the input specs for the RoBERTa TorchScript\n", + "model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# We use the same `inputs` that we used above to trace the model\n", + "input_spec_list = [\n", + " engine.TorchInputSpec(shape=tensor.size(), dtype=DType.int64)\n", + " for tensor in inputs.values()\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can load the model: (If you're loading a TensorFlow SavedModel or ONNX\n", + "model, then you don't need the `input_specs` argument.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "session = engine.InferenceSession()\n", + "model = session.load(model_path, input_specs=input_spec_list)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's two lines down, just one to go.\n", + "\n", + "NOTE: The first time you load a model, it might take a few minutes to compile it,\n", + "but this up-front cost will pay dividends in latency savings provided by\n", + "our next-generation graph compiler." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare the input" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This part is your usual pre-processing. \n", + "For the RoBERTa model, we need to process the text input into a sequence of tokens, so we'll do that with [`transformers.AutoTokenizer`](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoTokenizer).\n", + "\n", + "First, let's take a look at the model's inputs:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for tensor in model.input_metadata:\n", + " print(f'name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tells us the model needs 2 inputs. (If your model shows a dimension size\n", + "is `None`, that means it's dynamic.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "INPUT=\"There are many exciting developments in the field of AI Infrastructure!\"\n", + "\n", + "tokenizer = AutoTokenizer.from_pretrained(HF_MODEL_NAME)\n", + "inputs = tokenizer(INPUT, return_tensors=\"pt\", padding='max_length', truncation=True, max_length=seqlen)\n", + "print(inputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run an inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now for that third line of code, we pass the inputs to\n", + "[`execute()`](https://docs.modular.com/engine/reference/python/engine#max.engine.Model.execute). This\n", + "function requires all inputs as keyword arguments, so we'll\n", + "unpack the `inputs` dictionary as we pass it through:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "outputs = model.execute(**inputs)\n", + "print(outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's it!\n", + "\n", + "The output from [`execute()`](https://docs.modular.com/engine/reference/python/engine.html#max.engine.Model.execute) is a dictionary of output tensors, each in an `ndarray`. Let's now figure out what they say." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Process the outputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, we'll use some help from the [transformers library](https://huggingface.co/docs/transformers/main/en/model_doc/roberta#transformers.TFRobertaForSequenceClassification) to convert the output ids to labels:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Extract class prediction from output\n", + "predicted_class_id = outputs[\"result0\"].argmax(axis=-1)[0]\n", + "classification = hf_model.config.id2label[predicted_class_id]\n", + "\n", + "print(f\"The sentiment is: {classification}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ta-da! 🎉\n", + "\n", + "If you're running this notebook yourself, beware that this notebook does not\n", + "illustrate MAX Engine's runtime performance. For actual benchmark results,\n", + "check out our [performance dashboard](https://performance.modular.com).\n", + "\n", + "For more details about the inferencing API, see the [Python API reference](https://docs.modular.com/max/api/python/engine)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/offline-inference/README.md b/examples/offline-inference/README.md new file mode 100644 index 0000000000..5362bdbbb8 --- /dev/null +++ b/examples/offline-inference/README.md @@ -0,0 +1,10 @@ +# Using MAX pipelines to run LLMs offline + +Examples of using the MAX stack to directly query LLMs from python +without spinning up a webserver. + +A single Magic command runs the example: + +```sh +magic run basic +``` diff --git a/examples/offline-inference/basic.py b/examples/offline-inference/basic.py new file mode 100644 index 0000000000..028cbf6820 --- /dev/null +++ b/examples/offline-inference/basic.py @@ -0,0 +1,52 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import os + +from max.entrypoints import LLM +from max.pipelines import PipelineConfig +from max.pipelines.architectures import register_all_models +from max.serve.config import Settings + + +def main(): + register_all_models() + + model_path = "modularai/Llama-3.1-8B-Instruct-GGUF" + print(f"Loading model: {model_path}") + pipeline_config = PipelineConfig(model_path) + settings = Settings() + llm = LLM(settings, pipeline_config) + + prompts = [ + "In the beginning, there was", + "I believe the meaning of life is", + "The fastest way to learn python is", + ] + + print("Generating responses...") + responses = llm.generate(prompts, max_new_tokens=50) + + for i, (prompt, response) in enumerate(zip(prompts, responses)): + print(f"========== Response {i} ==========") + print(prompt + response) + print() + + +if __name__ == "__main__": + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + main() diff --git a/examples/offline-inference/pixi.toml b/examples/offline-inference/pixi.toml new file mode 100644 index 0000000000..3115b4596d --- /dev/null +++ b/examples/offline-inference/pixi.toml @@ -0,0 +1,14 @@ +[project] +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +description = "Examples exercising the max stack offline and in python" +name = "Python Offline Inference Examples" +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] +version = "0.1.0" + +[tasks] +basic = "python basic.py" + +[dependencies] +python = ">=3.9,<3.13" +max-pipelines = "*" diff --git a/magic.lock b/magic.lock deleted file mode 100644 index ebf11b183f..0000000000 --- a/magic.lock +++ /dev/null @@ -1,2197 +0,0 @@ -version: 6 -environments: - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - - url: https://conda.modular.com/max-nightly/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022713-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022713-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022713-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022713-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - arch: x86_64 - platform: linux - license: None - size: 2562 - timestamp: 1578324546067 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 23621 - timestamp: 1650670423406 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 - md5: 6168d71addc746e8f2b8d57dfd2edcea - depends: - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 23712 - timestamp: 1650670790230 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d - md5: 62ee74e96c5ebb0af99386de58cf9553 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: bzip2-1.0.6 - license_family: BSD - size: 252783 - timestamp: 1720974456583 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb - md5: 56398c28220513b9ea13d7b450acfb20 - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: bzip2-1.0.6 - license_family: BSD - size: 189884 - timestamp: 1720974504976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: bzip2-1.0.6 - license_family: BSD - size: 122909 - timestamp: 1720974522888 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda - sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 - md5: 19f3a56f68d2fd06c516076bff482c52 - arch: x86_64 - platform: linux - license: ISC - size: 158144 - timestamp: 1738298224464 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda - sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec - md5: 462cb166cd2e26a396f856510a3aff67 - arch: aarch64 - platform: linux - license: ISC - size: 158290 - timestamp: 1738299057652 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda - sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 - md5: 3569d6a9141adc64d2fe4797f3289e06 - arch: arm64 - platform: osx - license: ISC - size: 158425 - timestamp: 1738298167688 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab - md5: f22f4d4970e09d68a10b922cbb0408d3 - depends: - - __unix - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 84705 - timestamp: 1734858922844 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 27011 - timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 - md5: f4b39bf00c69f56ac01e020ebfac066c - depends: - - python >=3.9 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - size: 29141 - timestamp: 1737420302391 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a - md5: 4ebae00eae9705b0c3d6d1018a81d047 - depends: - - importlib-metadata >=4.8.3 - - jupyter_core >=4.12,!=5.0.* - - python >=3.9 - - python-dateutil >=2.8.2 - - pyzmq >=23.0 - - tornado >=6.2 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 106342 - timestamp: 1733441040958 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd - md5: 0a2980dada0dd7fd0998f0342308b1b1 - depends: - - __unix - - platformdirs >=2.5 - - python >=3.8 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 57671 - timestamp: 1727163547058 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb - md5: 30186d27e2c9fa62b45fb1476b7200e3 - depends: - - libgcc-ng >=10.3.0 - arch: x86_64 - platform: linux - license: LGPL-2.1-or-later - size: 117831 - timestamp: 1646151697040 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b - md5: 1f24853e59c68892452ef94ddd8afd4b - depends: - - libgcc-ng >=10.3.0 - arch: aarch64 - platform: linux - license: LGPL-2.1-or-later - size: 112327 - timestamp: 1646166857935 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 - md5: 3f43953b7d3fb3aaa1d0d0723d91e368 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 1370023 - timestamp: 1719463201255 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 - md5: 29c10432a2ca1472b53f299ffb2ffa37 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 1474620 - timestamp: 1719463205834 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b - md5: c6dc8a0fdec13a0565936655c33069a1 - depends: - - __osx >=11.0 - - libcxx >=16 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.3.1,<4.0a0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 1155530 - timestamp: 1719463474401 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda - sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 - md5: 01f8d123c96816249efd255a31ad7712 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - binutils_impl_linux-64 2.43 - arch: x86_64 - platform: linux - license: GPL-3.0-only - license_family: GPL - size: 671240 - timestamp: 1740155456116 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda - sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d - md5: 80c9ad5e05e91bb6c0967af3880c9742 - constrains: - - binutils_impl_linux-aarch64 2.43 - arch: aarch64 - platform: linux - license: GPL-3.0-only - license_family: GPL - size: 699058 - timestamp: 1740155620594 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda - sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 - md5: 488f260ccda0afaf08acb286db439c2f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - constrains: - - libabseil-static =20240722.0=cxx17* - - abseil-cpp =20240722.0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1311599 - timestamp: 1736008414161 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda - sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 - md5: 633b9fe454ffea2aaf29e191d946a83b - depends: - - libgcc >=13 - - libstdcxx >=13 - constrains: - - abseil-cpp =20240722.0 - - libabseil-static =20240722.0=cxx17* - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1334844 - timestamp: 1736008472455 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 - md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 - depends: - - __osx >=11.0 - - libcxx >=18 - constrains: - - libabseil-static =20240722.0=cxx17* - - abseil-cpp =20240722.0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 1178260 - timestamp: 1736008642885 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda - build_number: 31 - sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 - md5: 728dbebd0f7a20337218beacffd37916 - depends: - - libopenblas >=0.3.29,<0.3.30.0a0 - - libopenblas >=0.3.29,<1.0a0 - constrains: - - liblapacke =3.9.0=31*_openblas - - liblapack =3.9.0=31*_openblas - - blas =2.131=openblas - - mkl <2025 - - libcblas =3.9.0=31*_openblas - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 16859 - timestamp: 1740087969120 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda - build_number: 31 - sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a - md5: 48bd5bf15ccf3e409840be9caafc0ad5 - depends: - - libopenblas >=0.3.29,<0.3.30.0a0 - - libopenblas >=0.3.29,<1.0a0 - constrains: - - liblapack =3.9.0=31*_openblas - - blas =2.131=openblas - - libcblas =3.9.0=31*_openblas - - mkl <2025 - - liblapacke =3.9.0=31*_openblas - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 16915 - timestamp: 1740087911042 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda - build_number: 31 - sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f - md5: 39b053da5e7035c6592102280aa7612a - depends: - - libopenblas >=0.3.29,<0.3.30.0a0 - - libopenblas >=0.3.29,<1.0a0 - constrains: - - liblapacke =3.9.0=31*_openblas - - libcblas =3.9.0=31*_openblas - - blas =2.131=openblas - - mkl <2025 - - liblapack =3.9.0=31*_openblas - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 17123 - timestamp: 1740088119350 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda - build_number: 31 - sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d - md5: abb32c727da370c481a1c206f5159ce9 - depends: - - libblas 3.9.0 31_h59b9bed_openblas - constrains: - - liblapacke =3.9.0=31*_openblas - - liblapack =3.9.0=31*_openblas - - blas =2.131=openblas - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 16796 - timestamp: 1740087984429 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda - build_number: 31 - sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba - md5: 6b81dbae56a519f1ec2f25e0ee2f4334 - depends: - - libblas 3.9.0 31_h1a9f1db_openblas - constrains: - - liblapack =3.9.0=31*_openblas - - blas =2.131=openblas - - liblapacke =3.9.0=31*_openblas - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 16824 - timestamp: 1740087917500 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - build_number: 31 - sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 - md5: 7353c2bf0e90834cb70545671996d871 - depends: - - libblas 3.9.0 31_h10e41b3_openblas - constrains: - - liblapacke =3.9.0=31*_openblas - - blas =2.131=openblas - - liblapack =3.9.0=31*_openblas - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 17032 - timestamp: 1740088127097 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 - md5: 5b3e1610ff8bd5443476b91d618f5b77 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 523505 - timestamp: 1736877862502 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 - md5: c277e0a4d549b03ac1e9d6cbbe3d017b - depends: - - ncurses - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 134676 - timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 - md5: fb640d776fc92b682a14e001980825b1 - depends: - - ncurses - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - arch: aarch64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 148125 - timestamp: 1738479808948 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 - md5: 44083d2d2c2025afca315c7a172eab2b - depends: - - ncurses - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 107691 - timestamp: 1738479560845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda - sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 - md5: db833e03127376d461e1e13e76f09b6c - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - expat 2.6.4.* - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 73304 - timestamp: 1730967041968 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda - sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 - md5: f1b3fab36861b3ce945a13f0dfdfc688 - depends: - - libgcc >=13 - constrains: - - expat 2.6.4.* - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 72345 - timestamp: 1730967203789 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 - md5: 38d2656dd914feb0cab8c629370768bf - depends: - - __osx >=11.0 - constrains: - - expat 2.6.4.* - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 64693 - timestamp: 1730967175868 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda - sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da - md5: e3eb7806380bc8bcecba6d749ad5f026 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 53415 - timestamp: 1739260413716 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda - sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 - md5: 966084fccf3ad62a3160666cda869f28 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 51513 - timestamp: 1739260449772 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca - md5: 086914b672be056eb70fd4285b6783b6 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 39020 - timestamp: 1636488587153 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda - sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 - md5: ef504d1acbd74b7cc6849ef8af47dd03 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.2.0 h767d61c_2 - - libgcc-ng ==14.2.0=*_2 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 847885 - timestamp: 1740240653082 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda - sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 - md5: 6b4268a60b10f29257b51b9b67ff8d76 - depends: - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==14.2.0=*_2 - - libgomp 14.2.0 he277a41_2 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 535507 - timestamp: 1740241069780 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda - sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 - md5: a2222a6ada71fb478682efe483ce0f92 - depends: - - libgcc 14.2.0 h767d61c_2 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 53758 - timestamp: 1740240660904 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda - sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 - md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 - depends: - - libgcc 14.2.0 he277a41_2 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 53622 - timestamp: 1740241074834 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda - sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 - md5: fb54c4ea68b460c278d26eea89cfbcc3 - depends: - - libgfortran5 14.2.0 hf1ad2bd_2 - constrains: - - libgfortran-ng ==14.2.0=*_2 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 53733 - timestamp: 1740240690977 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda - sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d - md5: d8b9d9dc0c8cd97d375b48e55947ba70 - depends: - - libgfortran5 14.2.0 hb6113d0_2 - constrains: - - libgfortran-ng ==14.2.0=*_2 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 53611 - timestamp: 1740241100147 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b - md5: 4a55d9e169114b2b90d3ec4604cd7bbf - depends: - - libgfortran5 13.2.0 hf226fd6_3 - arch: arm64 - platform: osx - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 110233 - timestamp: 1707330749033 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda - sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c - md5: 556a4fdfac7287d349b8f09aba899693 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14.2.0 - constrains: - - libgfortran 14.2.0 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1461978 - timestamp: 1740240671964 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda - sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a - md5: cd754566661513808ef2408c4ab99a2f - depends: - - libgcc >=14.2.0 - constrains: - - libgfortran 14.2.0 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1100765 - timestamp: 1740241083241 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a - md5: 66ac81d54e95c534ae488726c1f698ea - depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 5.0.0 13_2_0_*_3 - arch: arm64 - platform: osx - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 997381 - timestamp: 1707330687590 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda - sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e - md5: 06d02030237f4d5b3d9a7e7d348fe3c6 - depends: - - __glibc >=2.17,<3.0.a0 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 459862 - timestamp: 1740240588123 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda - sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 - md5: b11c09d9463daf4cae492d29806b1889 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 462783 - timestamp: 1740241005079 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda - build_number: 31 - sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 - md5: 452b98eafe050ecff932f0ec832dd03f - depends: - - libblas 3.9.0 31_h59b9bed_openblas - constrains: - - libcblas =3.9.0=31*_openblas - - liblapacke =3.9.0=31*_openblas - - blas =2.131=openblas - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 16790 - timestamp: 1740087997375 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda - build_number: 31 - sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 - md5: 41dbff5eb805a75c120a7b7a1c744dc2 - depends: - - libblas 3.9.0 31_h1a9f1db_openblas - constrains: - - blas =2.131=openblas - - libcblas =3.9.0=31*_openblas - - liblapacke =3.9.0=31*_openblas - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 16845 - timestamp: 1740087923843 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda - build_number: 31 - sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 - md5: ff57a55a2cbce171ef5707fb463caf19 - depends: - - libblas 3.9.0 31_h10e41b3_openblas - constrains: - - liblapacke =3.9.0=31*_openblas - - libcblas =3.9.0=31*_openblas - - blas =2.131=openblas - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 17033 - timestamp: 1740088134988 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda - sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f - md5: 42d5b6a0f30d3c10cd88cb8584fda1cb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: 0BSD - size: 111357 - timestamp: 1738525339684 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda - sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 - md5: b88244e0a115cc34f7fbca9b11248e76 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: 0BSD - size: 124197 - timestamp: 1738528201520 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda - sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c - md5: e3fd1f8320a100f2b210e690a57cd615 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: 0BSD - size: 98945 - timestamp: 1738525462560 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: LGPL-2.1-only - license_family: GPL - size: 33408 - timestamp: 1697359010159 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 - md5: c14f32510f694e3185704d89967ec422 - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: LGPL-2.1-only - license_family: GPL - size: 34501 - timestamp: 1697358973269 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda - sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 - md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.2.0 - constrains: - - openblas >=0.3.29,<0.3.30.0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 5919288 - timestamp: 1739825731827 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda - sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c - md5: a99e2bfcb1ad6362544c71281eb617e9 - depends: - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.2.0 - constrains: - - openblas >=0.3.29,<0.3.30.0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 4801657 - timestamp: 1739825308974 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 - md5: 0cd1148c68f09027ee0b0f0179f77c30 - depends: - - __osx >=11.0 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - llvm-openmp >=18.1.8 - constrains: - - openblas >=0.3.29,<0.3.30.0a0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 4168442 - timestamp: 1739825514918 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 - md5: d8703f1ffe5a06356f06467f1d0b9464 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 2960815 - timestamp: 1735577210663 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda - sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 - md5: 68f807f7cc13951652bbe048253fd405 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 2788074 - timestamp: 1735576315676 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 - md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 2271580 - timestamp: 1735576361997 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda - sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 - md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 823649 - timestamp: 1735627841126 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda - sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b - md5: a7a192edc9cfba26a27df3283203e6a1 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 800865 - timestamp: 1735627982895 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda - sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 - md5: 1f67e5e30edd56e0a0bf6df6bb711a9d - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=18 - - libprotobuf >=5.28.3,<5.28.4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 754657 - timestamp: 1735628030895 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 - md5: a587892d3c13b6621a6091be690dbca2 - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: ISC - size: 205978 - timestamp: 1716828628198 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 - md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: ISC - size: 177394 - timestamp: 1716828514515 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 - md5: a7ce36e284c5faaf93c220dfc39e3abd - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: ISC - size: 164972 - timestamp: 1716828607917 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda - sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d - md5: 73cea06049cc4174578b432320a003b8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux - license: Unlicense - size: 915956 - timestamp: 1739953155793 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda - sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e - md5: 150d64241fa27d9d35a7f421ca968a6c - depends: - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - arch: aarch64 - platform: linux - license: Unlicense - size: 915118 - timestamp: 1739953101699 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 - md5: c83357a21092bd952933c36c5cb4f4d6 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - arch: arm64 - platform: osx - license: Unlicense - size: 898767 - timestamp: 1739953312379 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda - sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da - md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 14.2.0 h767d61c_2 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 3884556 - timestamp: 1740240685253 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda - sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 - md5: eadee2cda99697e29411c1013c187b92 - depends: - - libgcc 14.2.0 he277a41_2 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 3810779 - timestamp: 1740241094774 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda - sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 - md5: c75da67f045c2627f59e6fcb5f4e3a9b - depends: - - libstdcxx 14.2.0 h8f9b012_2 - arch: x86_64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 53830 - timestamp: 1740240722530 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda - sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df - md5: c934c1fddad582fcc385b608eb06a70c - depends: - - libstdcxx 14.2.0 h3f4de04_2 - arch: aarch64 - platform: linux - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 53715 - timestamp: 1740241126343 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 - md5: 40b61aab5c7ba9ff276c41cfffe6b80b - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 33601 - timestamp: 1680112270483 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f - md5: 000e30b09db0b7c775b21695dff30969 - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 35720 - timestamp: 1680113474501 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: LGPL-2.1-or-later - size: 100393 - timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f - md5: b4df5d7d4b63579d081fd3a4cf99740e - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: LGPL-2.1-or-later - size: 114269 - timestamp: 1702724369203 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - arch: x86_64 - platform: linux - license: Zlib - license_family: Other - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 - md5: 08aad7cbe9f5a6b460d0976076b6ae64 - depends: - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - arch: aarch64 - platform: linux - license: Zlib - license_family: Other - size: 66657 - timestamp: 1727963199518 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_2 - arch: arm64 - platform: osx - license: Zlib - license_family: Other - size: 46438 - timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - sha256: 57b535a67f59c97302e2bbc60abcbc8d51ef0a4c7b1926049091d7da96da7b3a - md5: c5a4e2d9818fe6551dccd02243765527 - depends: - - python >=3.9 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 128565 - timestamp: 1737789576837 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 - md5: c4d54bfd3817313ce758aa76283b118d - depends: - - __osx >=11.0 - constrains: - - openmp 19.1.7|19.1.7.* - arch: arm64 - platform: osx - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 280830 - timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022713-release.conda - noarch: python - sha256: d2b6c247e736b34c8a6cf0452846a2162b9aa6a3c3fd5d029f2b2e0a7be571d3 - md5: 4db470c401468b43b673548c91a5e94e - depends: - - max-core ==25.2.0.dev2025022713 release - - max-python ==25.2.0.dev2025022713 release - - mojo-jupyter ==25.2.0.dev2025022713 release - - mblack ==25.2.0.dev2025022713 release - license: LicenseRef-Modular-Proprietary - size: 9908 - timestamp: 1740664199928 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022713-release.conda - sha256: 3c0bf4c8f2a6b5400bcbd64032d2c59b9dfcc5ad50432a8a9e1e3d024d3400f5 - md5: 9751487ef2e786e9dcaff28f0628ba03 - depends: - - mblack ==25.2.0.dev2025022713 release - license: LicenseRef-Modular-Proprietary - size: 249813859 - timestamp: 1740664231187 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022713-release.conda - sha256: bea03a1b06c8554504542794822a345735e7847a914af4e9766cb275ab5b3238 - md5: 04b52dac259a6268bc51a78da0aa9f1d - depends: - - mblack ==25.2.0.dev2025022713 release - license: LicenseRef-Modular-Proprietary - size: 252115018 - timestamp: 1740664199928 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022713-release.conda - sha256: eb28bb19ea43f9a63b8f8ca88751c932263ab2134fd651b5e82cd729101b18cb - md5: 9f3a63249667b9e29ba93d7c21e1d679 - depends: - - mblack ==25.2.0.dev2025022713 release - license: LicenseRef-Modular-Proprietary - size: 217216039 - timestamp: 1740665267852 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022713-release.conda - noarch: python - sha256: b555a98a5162485a66cb852674d19b8c65e139ff70ec92451f2130dea741263a - md5: cdaed74f4e9fefcc0bc928598740815c - depends: - - max-core ==25.2.0.dev2025022713 release - - click >=8.0.0 - - numpy >=1.18,<2.0 - - sentencepiece >=0.2.0 - - tqdm >=4.67.1 - constrains: - - aiohttp >=3.11.12 - - fastapi >=0.114.2 - - gguf >=0.14.0 - - hf-transfer >=0.1.9 - - httpx >=0.28.1 - - huggingface_hub >=0.24.0 - - nvitop >=1.4.1 - - opentelemetry-api >=1.29.0 - - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 - - opentelemetry-sdk >=1.29.0,<2.0 - - pillow >=10.3.0 - - prometheus_client >=0.21.0 - - prometheus-async >=22.2.0 - - psutil >=6.1.1 - - pydantic - - pydantic-settings >=2.7.1 - - pyinstrument >=5.0.1 - - python-json-logger >=2.0.7 - - requests >=2.32.3 - - rich >=13.9.4 - - safetensors >=0.5.2 - - scipy >=1.15.1 - - sentinel >=0.3.0 - - sse-starlette >=2.1.2 - - tokenizers >=0.19.0 - - pytorch >=2.2.2,<=2.5.1 - - transformers >=4.40.1 - - uvicorn >=0.34.0 - - uvloop >=0.21.0 - - xgrammar ==0.1.11 - license: LicenseRef-Modular-Proprietary - size: 123534013 - timestamp: 1740664231187 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022713-release.conda - noarch: python - sha256: 71aeaf13405bb7ba613f5336c5e03fbbd158adbfc1a5ddab1bf0b7f248535f15 - md5: 903350b3c6380505cb1cc59556cdcf68 - depends: - - max-core ==25.2.0.dev2025022713 release - - click >=8.0.0 - - numpy >=1.18,<2.0 - - sentencepiece >=0.2.0 - - tqdm >=4.67.1 - constrains: - - aiohttp >=3.11.12 - - fastapi >=0.114.2 - - gguf >=0.14.0 - - hf-transfer >=0.1.9 - - httpx >=0.28.1 - - huggingface_hub >=0.24.0 - - nvitop >=1.4.1 - - opentelemetry-api >=1.29.0 - - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 - - opentelemetry-sdk >=1.29.0,<2.0 - - pillow >=10.3.0 - - prometheus_client >=0.21.0 - - prometheus-async >=22.2.0 - - psutil >=6.1.1 - - pydantic - - pydantic-settings >=2.7.1 - - pyinstrument >=5.0.1 - - python-json-logger >=2.0.7 - - requests >=2.32.3 - - rich >=13.9.4 - - safetensors >=0.5.2 - - scipy >=1.15.1 - - sentinel >=0.3.0 - - sse-starlette >=2.1.2 - - tokenizers >=0.19.0 - - pytorch >=2.2.2,<=2.5.1 - - transformers >=4.40.1 - - uvicorn >=0.34.0 - - uvloop >=0.21.0 - - xgrammar ==0.1.11 - license: LicenseRef-Modular-Proprietary - size: 125927777 - timestamp: 1740664199928 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022713-release.conda - noarch: python - sha256: 829c387dda5a2a52baca2299c67ba511f2039beeec4c2f6e3b16990077cbd0b9 - md5: 4f10a16f087934ec4fd2e87b8326c4d5 - depends: - - max-core ==25.2.0.dev2025022713 release - - click >=8.0.0 - - numpy >=1.18,<2.0 - - sentencepiece >=0.2.0 - - tqdm >=4.67.1 - constrains: - - aiohttp >=3.11.12 - - fastapi >=0.114.2 - - gguf >=0.14.0 - - hf-transfer >=0.1.9 - - httpx >=0.28.1 - - huggingface_hub >=0.24.0 - - nvitop >=1.4.1 - - opentelemetry-api >=1.29.0 - - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 - - opentelemetry-sdk >=1.29.0,<2.0 - - pillow >=10.3.0 - - prometheus_client >=0.21.0 - - prometheus-async >=22.2.0 - - psutil >=6.1.1 - - pydantic - - pydantic-settings >=2.7.1 - - pyinstrument >=5.0.1 - - python-json-logger >=2.0.7 - - requests >=2.32.3 - - rich >=13.9.4 - - safetensors >=0.5.2 - - scipy >=1.15.1 - - sentinel >=0.3.0 - - sse-starlette >=2.1.2 - - tokenizers >=0.19.0 - - pytorch >=2.2.2,<=2.5.1 - - transformers >=4.40.1 - - uvicorn >=0.34.0 - - uvloop >=0.21.0 - - xgrammar ==0.1.11 - license: LicenseRef-Modular-Proprietary - size: 112550091 - timestamp: 1740665267852 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022713-release.conda - noarch: python - sha256: baac376bd7df6e8c4776fc934dd3c7d2566a31908e514ea02180ba638430b379 - md5: 5906489ff8ca5341b676d9001a246ace - depends: - - python >=3.9,<3.13 - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9.0 - - platformdirs >=2 - - typing_extensions >=v4.12.2 - - python - license: MIT - size: 130846 - timestamp: 1740664199927 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022713-release.conda - noarch: python - sha256: ff78ef2596148c1ae0819f53e4ae3266e0003a836bdacba9efee6d4335eef386 - md5: 95972dc5cb3b79fcb9c4d47591cd4c7e - depends: - - max-core ==25.2.0.dev2025022713 release - - python >=3.9,<3.13 - - jupyter_client >=8.6.2,<8.7 - - python - license: LicenseRef-Modular-Proprietary - size: 22991 - timestamp: 1740664199928 -- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe - md5: 29097e7ea634a45cc5386b95cac6568f - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 10854 - timestamp: 1733230986902 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 - md5: 47e340acb35de30501a76c7c799c41d7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: X11 AND BSD-3-Clause - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 - md5: 182afabe009dc78d8b73100255ee6868 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: X11 AND BSD-3-Clause - size: 926034 - timestamp: 1738196018799 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: X11 AND BSD-3-Clause - size: 797030 - timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 - md5: d8285bea2a350f63fab23bf460221f3f - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - numpy-base <0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 7484186 - timestamp: 1707225809722 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 - md5: 9cebf5a06cb87d4569cd68df887af476 - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - numpy-base <0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 6614296 - timestamp: 1707225994762 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 - md5: d83fc83d589e2625a3451c9a7e21047c - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - liblapack >=3.9.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - numpy-base <0a0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 6073136 - timestamp: 1707226249608 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda - sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f - md5: 41adf927e746dc75ecf0ef841c454e48 - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 2939306 - timestamp: 1739301879343 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda - sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c - md5: 09036190605c57eaecf01218e0e9542d - depends: - - ca-certificates - - libgcc >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 3476570 - timestamp: 1739303256089 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda - sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a - md5: 75f9f0c7b1740017e2db83a53ab9a28e - depends: - - __osx >=11.0 - - ca-certificates - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 2934522 - timestamp: 1739301896733 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 - md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa - depends: - - python >=3.8 - license: Apache-2.0 - license_family: APACHE - size: 60164 - timestamp: 1733203368787 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee - md5: 617f15191456cc6a13db418a275435e5 - depends: - - python >=3.9 - license: MPL-2.0 - license_family: MOZILLA - size: 41075 - timestamp: 1733233471940 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 - md5: 577852c7e53901ddccc7e6a9959ddebe - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 20448 - timestamp: 1733232756001 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda - sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a - md5: 5665f0079432f8848079c811cdb537d5 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.4,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - liblzma >=5.6.4,<6.0a0 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.48.0,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.4.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Python-2.0 - size: 31581682 - timestamp: 1739521496324 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda - sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf - md5: 2e7ad70254455e0508adabff10218512 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.6.4,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - liblzma >=5.6.4,<6.0a0 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.48.0,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.4.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Python-2.0 - size: 13804161 - timestamp: 1739519531794 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda - sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 - md5: 1d105a6c46a753e3c0bab54a1ad24063 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.4,<3.0a0 - - libffi >=3.4,<4.0a0 - - liblzma >=5.6.4,<6.0a0 - - libsqlite >=3.48.0,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.4.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Python-2.0 - size: 12947786 - timestamp: 1739520092196 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 - md5: 5ba79d7c71f03c678c8ead841f347d6e - depends: - - python >=3.9 - - six >=1.5 - license: Apache-2.0 - license_family: APACHE - size: 222505 - timestamp: 1733215763718 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 - md5: 0424ae29b104430108f5218a66db7260 - constrains: - - python 3.12.* *_cpython - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 6238 - timestamp: 1723823388266 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 - md5: 62b20f305498284a07dc6c45fd0e5c87 - constrains: - - python 3.12.* *_cpython - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 6329 - timestamp: 1723823366253 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 - md5: b76f9b1c862128e56ac7aa8cd2333de9 - constrains: - - python 3.12.* *_cpython - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 6278 - timestamp: 1723823099686 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda - sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e - md5: 7cec8d0dac15a2d9fea8e49879aa779d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libsodium >=1.0.20,<1.0.21.0a0 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - zeromq >=4.3.5,<4.4.0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 382698 - timestamp: 1738271121975 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda - sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 - md5: 0520da8de6870d8ff63e818e927d1524 - depends: - - libgcc >=13 - - libsodium >=1.0.20,<1.0.21.0a0 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - zeromq >=4.3.5,<4.4.0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 375156 - timestamp: 1738273130727 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda - sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 - md5: bfbefdb140b546a80827ff7c9d5ac7b8 - depends: - - __osx >=11.0 - - libcxx >=18 - - libsodium >=1.0.20,<1.0.21.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - zeromq >=4.3.5,<4.4.0a0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 364649 - timestamp: 1738271263898 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c - md5: 283b96675859b20a825f8fa30f311446 - depends: - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - arch: x86_64 - platform: linux - license: GPL-3.0-only - license_family: GPL - size: 282480 - timestamp: 1740379431762 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 - md5: c0f08fc2737967edde1a272d4bf41ed9 - depends: - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - arch: aarch64 - platform: linux - license: GPL-3.0-only - license_family: GPL - size: 291806 - timestamp: 1740380591358 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 - md5: 63ef3f6e6d6d5c589e64f11263dc5676 - depends: - - ncurses >=6.5,<7.0a0 - arch: arm64 - platform: osx - license: GPL-3.0-only - license_family: GPL - size: 252359 - timestamp: 1740379663071 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda - sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a - md5: 480e915dfc6c592615ef6f217e615aa6 - depends: - - libsentencepiece 0.2.0 h8e10757_10 - - python_abi 3.12.* *_cp312 - - sentencepiece-python 0.2.0 py312hb6b8a2b_10 - - sentencepiece-spm 0.2.0 h8e10757_10 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 19470 - timestamp: 1735628377167 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda - sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb - md5: 33a89eb1dedae8eb7222b0a89856f337 - depends: - - libsentencepiece 0.2.0 h6164ad9_10 - - python_abi 3.12.* *_cp312 - - sentencepiece-python 0.2.0 py312h197ff68_10 - - sentencepiece-spm 0.2.0 h6164ad9_10 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 19686 - timestamp: 1735628718991 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda - sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 - md5: 346abe448f69949a65473b336856860a - depends: - - libsentencepiece 0.2.0 he13a0af_10 - - python_abi 3.12.* *_cp312 - - sentencepiece-python 0.2.0 py312h155166a_10 - - sentencepiece-spm 0.2.0 he13a0af_10 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 19759 - timestamp: 1735628533490 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda - sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 - md5: 7908b7b977e2e123a5f6a29906f2ce44 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libsentencepiece 0.2.0 h8e10757_10 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 2411182 - timestamp: 1735628106455 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda - sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b - md5: 5642e4545a3cf03e446fb3b3e9fd723b - depends: - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libsentencepiece 0.2.0 h6164ad9_10 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 2458076 - timestamp: 1735628298246 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda - sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 - md5: 6e11367ef670296fce01fc9860be944d - depends: - - __osx >=11.0 - - libcxx >=18 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libsentencepiece 0.2.0 he13a0af_10 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 2433303 - timestamp: 1735628083958 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda - sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f - md5: e977b7be5ac26c55825e121e00b90493 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libsentencepiece 0.2.0 h8e10757_10 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 89076 - timestamp: 1735628334078 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda - sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e - md5: a4b75936c01dca3f089f02752b7ee325 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libsentencepiece 0.2.0 h6164ad9_10 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 85983 - timestamp: 1735628693813 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda - sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 - md5: 9b7300f23cd330da8664cd072c162e5f - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=18 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libsentencepiece 0.2.0 he13a0af_10 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 83826 - timestamp: 1735628514667 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db - md5: a451d576819089b0d672f18768be0f65 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 16385 - timestamp: 1733381032766 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - arch: x86_64 - platform: linux - license: TCL - license_family: BSD - size: 3318875 - timestamp: 1699202167581 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 - md5: f75105e0585851f818e0009dd1dde4dc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - arch: aarch64 - platform: linux - license: TCL - license_family: BSD - size: 3351802 - timestamp: 1695506242997 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 - md5: b50a57ba89c32b62428b71a875291c9b - depends: - - libzlib >=1.2.13,<2.0.0a0 - arch: arm64 - platform: osx - license: TCL - license_family: BSD - size: 3145523 - timestamp: 1699202432999 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda - sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 - md5: e417822cb989e80a0d2b1b576fdd1657 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 840414 - timestamp: 1732616043734 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda - sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc - md5: e28996d9d2d44d777b7e6fb12f63715b - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 841662 - timestamp: 1732616934923 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda - sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 - md5: fb0605888a475d6a380ae1d1a819d976 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 842549 - timestamp: 1732616081362 -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 - md5: 9efbfdc37242619130ea42b1cc4ed861 - depends: - - colorama - - python >=3.9 - license: MPL-2.0 or MIT - size: 89498 - timestamp: 1735661472632 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 - md5: 019a7385be9af33791c989871317e1ed - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 110051 - timestamp: 1733367480074 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 - md5: d17f13df8b65464ca316cbc000a3cb64 - depends: - - python >=3.9 - license: PSF-2.0 - license_family: PSF - size: 39637 - timestamp: 1733188758212 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de - md5: dbcace4706afdfb7eb891f7b37d07c04 - license: LicenseRef-Public-Domain - size: 122921 - timestamp: 1737119101255 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 - md5: 3947a35e916fcc6b9825449affbf4214 - depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libsodium >=1.0.20,<1.0.21.0a0 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: MPL-2.0 - license_family: MOZILLA - size: 335400 - timestamp: 1731585026517 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda - sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c - md5: f2f3282559a4b87b7256ecafb4610107 - depends: - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libsodium >=1.0.20,<1.0.21.0a0 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: MPL-2.0 - license_family: MOZILLA - size: 371419 - timestamp: 1731589490850 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a - md5: f7e6b65943cb73bce0143737fded08f1 - depends: - - __osx >=11.0 - - krb5 >=1.21.3,<1.22.0a0 - - libcxx >=18 - - libsodium >=1.0.20,<1.0.21.0a0 - arch: arm64 - platform: osx - license: MPL-2.0 - license_family: MOZILLA - size: 281565 - timestamp: 1731585108039 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 - md5: 0c3cc595284c5e8f0f9900a9b228a332 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 21809 - timestamp: 1732827613585 diff --git a/.github/CODEOWNERS b/mojo/.github/CODEOWNERS similarity index 100% rename from .github/CODEOWNERS rename to mojo/.github/CODEOWNERS diff --git a/mojo/.github/ISSUE_TEMPLATE/doc_issue.yaml b/mojo/.github/ISSUE_TEMPLATE/doc_issue.yaml new file mode 100644 index 0000000000..daf162cefc --- /dev/null +++ b/mojo/.github/ISSUE_TEMPLATE/doc_issue.yaml @@ -0,0 +1,50 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: Documentation issue +description: Report a problem with the Mojo docs +title: "[Docs]" +labels: + - documentation +body: + - type: markdown + attributes: + value: | + Thank you for helping us improve the Mojo docs! + + Please add a title above and fill in the following fields so we can understand the problem. + + - type: input + attributes: + label: Where is the problem? + description: Provide a link to the problematic page (with a heading anchor). + validations: + required: true + + - type: textarea + attributes: + label: What can we do better? + description: Describe the documentation problem and how you suggest we fix it. + validations: + required: true + + - type: textarea + attributes: + label: Anything else? + validations: + required: false + + - type: markdown + attributes: + value: | + Thank you! diff --git a/.github/ISSUE_TEMPLATE/mojo_bug_report.yaml b/mojo/.github/ISSUE_TEMPLATE/mojo_bug_report.yaml similarity index 100% rename from .github/ISSUE_TEMPLATE/mojo_bug_report.yaml rename to mojo/.github/ISSUE_TEMPLATE/mojo_bug_report.yaml diff --git a/.github/ISSUE_TEMPLATE/mojo_feature_request.yaml b/mojo/.github/ISSUE_TEMPLATE/mojo_feature_request.yaml similarity index 100% rename from .github/ISSUE_TEMPLATE/mojo_feature_request.yaml rename to mojo/.github/ISSUE_TEMPLATE/mojo_feature_request.yaml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/mojo/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE.md rename to mojo/.github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/workflows/check_pr_target.yml b/mojo/.github/workflows/check_pr_target.yml similarity index 100% rename from .github/workflows/check_pr_target.yml rename to mojo/.github/workflows/check_pr_target.yml diff --git a/.github/workflows/check_pr_title.yml b/mojo/.github/workflows/check_pr_title.yml similarity index 100% rename from .github/workflows/check_pr_title.yml rename to mojo/.github/workflows/check_pr_title.yml diff --git a/.github/workflows/standard_library_tests_and_examples.yml b/mojo/.github/workflows/standard_library_tests_and_examples.yml similarity index 100% rename from .github/workflows/standard_library_tests_and_examples.yml rename to mojo/.github/workflows/standard_library_tests_and_examples.yml diff --git a/.github/workflows/test_pre_commit.yml b/mojo/.github/workflows/test_pre_commit.yml similarity index 100% rename from .github/workflows/test_pre_commit.yml rename to mojo/.github/workflows/test_pre_commit.yml diff --git a/mojo/CODE_OF_CONDUCT.md b/mojo/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..f4f5ad5a25 --- /dev/null +++ b/mojo/CODE_OF_CONDUCT.md @@ -0,0 +1,71 @@ +# Code of conduct + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, +body size, disability, ethnicity, gender identity and expression, level of +experience, nationality, personal appearance, race, religion, or sexual +identity and orientation. + +## Our standards + +All community forums and spaces are meant for professional interactions that +are friendly, inclusive, helpful, and collaborative. Examples of behavior that +contributes to creating a positive environment include: + +- Using welcoming and inclusive language. +- Being respectful of differing viewpoints and experiences. +- Gracefully accepting constructive criticism. +- Focusing on what is best for the community. +- Showing empathy towards other community members. + +Any behavior that could reasonably be considered inappropriate in a +professional setting is unacceptable. Examples of unacceptable behavior by +participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances. +- Trolling, insulting/derogatory comments, and personal or political attacks. +- Public or private harassment. +- Publishing others' private information, such as a physical or electronic + address, without explicit permission. +- Conduct which could reasonably be considered inappropriate for the forum in + which it occurs. + +## Our responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies to all project content and public spaces on the +Mojo GitHub repo, the rest of Modular’s GitHub organization, and all other +official Mojo community spaces and communication mediums, whether offline or +online. + +## Enforcement + +Instances of abusive, harassment, or otherwise unacceptable behavior should be +reported to the project team at . All complaints will +be reviewed and investigated and will result in a response that is deemed +necessary and appropriate to the circumstances. The project team is obligated +to maintain confidentiality with regard to the reporter of an incident. Further +details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the Contributor Covenant, version 1.4, +available at , and includes some +aspects of the Geek Feminism Code of Conduct and the Drupal Code of Conduct. diff --git a/CONTRIBUTING.md b/mojo/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to mojo/CONTRIBUTING.md diff --git a/mojo/LICENSE b/mojo/LICENSE new file mode 100644 index 0000000000..c1af4075d5 --- /dev/null +++ b/mojo/LICENSE @@ -0,0 +1,235 @@ +============================================================================================== +The Mojo repository is licensed under the Apache License v2.0 with LLVM Exceptions: +============================================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== + +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: + +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. diff --git a/mojo/README.md b/mojo/README.md new file mode 100644 index 0000000000..2a4878c789 --- /dev/null +++ b/mojo/README.md @@ -0,0 +1,113 @@ +
    + + + [Website][Mojo] | [Getting Started] | [API Documentation] | [Contributing] | [Changelog] +
    + +[Mojo]: https://www.modular.com/mojo/ +[Getting Started]: https://docs.modular.com/mojo/manual/get-started/ +[API Documentation]: https://docs.modular.com/mojo/lib +[Contributing]: ./CONTRIBUTING.md +[Changelog]: ./docs/changelog.md + +# Welcome to Mojo 🔥 + +Mojo is a new programming language that bridges the gap between research +and production by combining Python syntax and ecosystem with systems +programming and metaprogramming features. Mojo is still young, but it is +designed to write blazing-fast code for CPUs, GPUs, and more as part of +the [MAX Platform](https://www.modular.com/max). + +This repo includes source code for: + +- Mojo examples +- Mojo documentation hosted at [modular.com](https://docs.modular.com/mojo/) +- The [Mojo standard library](https://docs.modular.com/mojo/lib) + +This repo has two primary branches: + +- The [`stable`](https://github.com/modular/mojo/tree/stable) branch, which +is in sync with the last stable released version of Mojo. Use the examples +here if you’re using a [release build of Mojo](#latest-released). + +- The [`main`](https://github.com/modular/mojo/tree/main) branch, which +is in sync with the Mojo nightly build and subject to breakage. Use this branch +for [contributions](./CONTRIBUTING.md), or if you're using the latest +[nightly build of Mojo](#latest-nightly). + +To learn more about Mojo, see the +[Mojo Manual](https://docs.modular.com/mojo/manual/). + +## Installing Mojo + +### Latest Released + +To install the last released build of Mojo, follow the guide to +[Get started with Mojo](https://docs.modular.com/mojo/manual/get-started). + +### Latest Nightly + +The nightly Mojo builds are subject to breakage and provide an inside +view of how the development of Mojo is progressing. Use at your own risk +and be patient! + +To get nightly builds, see the same instructions to [Get started with +Mojo](https://docs.modular.com/mojo/manual/get-started), but when you create +your project, instead use the following `magic init` command to set the +conda package channel to `max-nightly`: + +```bash +magic init hello-world-nightly --format mojoproject \ + -c conda-forge -c https://conda.modular.com/max-nightly +``` + +Or, if you're [using conda](https://docs.modular.com/magic/conda), add the +`https://conda.modular.com/max-nightly/` channel to your `environment.yaml` +file. For example: + +```yaml +[project] +name = "Mojo nightly example" +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] + +[dependencies] +max = "*" +``` + +When you clone this repo, you'll be on the `main` branch by default, +which includes code matching the latest nightly build: + +```bash +git clone https://github.com/modular/mojo.git +``` + +If you want to instead see the source from the most recent stable +release, then you can switch to the `stable` branch. + +## Contributing + +When you want to report issues or request features, [please create a GitHub +issue here](https://github.com/modular/mojo/issues). +See [here](./CONTRIBUTING.md) for guidelines on filing good bugs. + +We welcome contributions to this repo on the +[`main`](https://github.com/modular/mojo/tree/main) +branch. If you’d like to contribute to Mojo, please first read our [Contributor +Guide](https://github.com/modular/mojo/blob/main/CONTRIBUTING.md). + +For more general questions or to chat with other Mojo developers, check out our +[Discord](https://discord.gg/modular). + +## License + +This repository and its contributions are licensed under the Apache License v2.0 +with LLVM Exceptions (see the LLVM [License](https://llvm.org/LICENSE.txt)). +MAX and Mojo usage and distribution are licensed under the +[MAX & Mojo Community License](https://www.modular.com/legal/max-mojo-license). + +## Thanks to our contributors + +
    + + diff --git a/docs/README.md b/mojo/docs/README.md similarity index 100% rename from docs/README.md rename to mojo/docs/README.md diff --git a/docs/changelog-released.md b/mojo/docs/changelog-released.md similarity index 100% rename from docs/changelog-released.md rename to mojo/docs/changelog-released.md diff --git a/docs/changelog.md b/mojo/docs/changelog.md similarity index 100% rename from docs/changelog.md rename to mojo/docs/changelog.md diff --git a/docs/faq.md b/mojo/docs/faq.md similarity index 100% rename from docs/faq.md rename to mojo/docs/faq.md diff --git a/docs/images/dynamic-vector-capacity.png b/mojo/docs/images/dynamic-vector-capacity.png similarity index 100% rename from docs/images/dynamic-vector-capacity.png rename to mojo/docs/images/dynamic-vector-capacity.png diff --git a/docs/images/let-to-var.png b/mojo/docs/images/let-to-var.png similarity index 100% rename from docs/images/let-to-var.png rename to mojo/docs/images/let-to-var.png diff --git a/docs/images/vectorize-fix.png b/mojo/docs/images/vectorize-fix.png similarity index 100% rename from docs/images/vectorize-fix.png rename to mojo/docs/images/vectorize-fix.png diff --git a/docs/lib.mdx b/mojo/docs/lib.mdx similarity index 100% rename from docs/lib.mdx rename to mojo/docs/lib.mdx diff --git a/docs/manual/basics.mdx b/mojo/docs/manual/basics.mdx similarity index 100% rename from docs/manual/basics.mdx rename to mojo/docs/manual/basics.mdx diff --git a/docs/manual/control-flow.mdx b/mojo/docs/manual/control-flow.mdx similarity index 100% rename from docs/manual/control-flow.mdx rename to mojo/docs/manual/control-flow.mdx diff --git a/docs/manual/decorators/always-inline.md b/mojo/docs/manual/decorators/always-inline.md similarity index 100% rename from docs/manual/decorators/always-inline.md rename to mojo/docs/manual/decorators/always-inline.md diff --git a/docs/manual/decorators/copy-capture.md b/mojo/docs/manual/decorators/copy-capture.md similarity index 100% rename from docs/manual/decorators/copy-capture.md rename to mojo/docs/manual/decorators/copy-capture.md diff --git a/docs/manual/decorators/implicit.md b/mojo/docs/manual/decorators/implicit.md similarity index 100% rename from docs/manual/decorators/implicit.md rename to mojo/docs/manual/decorators/implicit.md diff --git a/docs/manual/decorators/index.mdx b/mojo/docs/manual/decorators/index.mdx similarity index 100% rename from docs/manual/decorators/index.mdx rename to mojo/docs/manual/decorators/index.mdx diff --git a/docs/manual/decorators/nonmaterializable.md b/mojo/docs/manual/decorators/nonmaterializable.md similarity index 100% rename from docs/manual/decorators/nonmaterializable.md rename to mojo/docs/manual/decorators/nonmaterializable.md diff --git a/docs/manual/decorators/parameter.md b/mojo/docs/manual/decorators/parameter.md similarity index 100% rename from docs/manual/decorators/parameter.md rename to mojo/docs/manual/decorators/parameter.md diff --git a/docs/manual/decorators/register-passable.md b/mojo/docs/manual/decorators/register-passable.md similarity index 100% rename from docs/manual/decorators/register-passable.md rename to mojo/docs/manual/decorators/register-passable.md diff --git a/docs/manual/decorators/staticmethod.md b/mojo/docs/manual/decorators/staticmethod.md similarity index 100% rename from docs/manual/decorators/staticmethod.md rename to mojo/docs/manual/decorators/staticmethod.md diff --git a/docs/manual/decorators/value.md b/mojo/docs/manual/decorators/value.md similarity index 100% rename from docs/manual/decorators/value.md rename to mojo/docs/manual/decorators/value.md diff --git a/docs/manual/errors.mdx b/mojo/docs/manual/errors.mdx similarity index 100% rename from docs/manual/errors.mdx rename to mojo/docs/manual/errors.mdx diff --git a/docs/manual/functions.mdx b/mojo/docs/manual/functions.mdx similarity index 100% rename from docs/manual/functions.mdx rename to mojo/docs/manual/functions.mdx diff --git a/docs/manual/get-started.mdx b/mojo/docs/manual/get-started.mdx similarity index 100% rename from docs/manual/get-started.mdx rename to mojo/docs/manual/get-started.mdx diff --git a/docs/manual/images/game-of-life-screen.png b/mojo/docs/manual/images/game-of-life-screen.png similarity index 100% rename from docs/manual/images/game-of-life-screen.png rename to mojo/docs/manual/images/game-of-life-screen.png diff --git a/docs/manual/images/mojo-vscode.png b/mojo/docs/manual/images/mojo-vscode.png similarity index 100% rename from docs/manual/images/mojo-vscode.png rename to mojo/docs/manual/images/mojo-vscode.png diff --git a/docs/manual/images/owned-pointer-diagram-dark.png b/mojo/docs/manual/images/owned-pointer-diagram-dark.png similarity index 100% rename from docs/manual/images/owned-pointer-diagram-dark.png rename to mojo/docs/manual/images/owned-pointer-diagram-dark.png diff --git a/docs/manual/images/owned-pointer-diagram.png b/mojo/docs/manual/images/owned-pointer-diagram.png similarity index 100% rename from docs/manual/images/owned-pointer-diagram.png rename to mojo/docs/manual/images/owned-pointer-diagram.png diff --git a/docs/manual/images/pointer-diagram-dark.png b/mojo/docs/manual/images/pointer-diagram-dark.png similarity index 100% rename from docs/manual/images/pointer-diagram-dark.png rename to mojo/docs/manual/images/pointer-diagram-dark.png diff --git a/docs/manual/images/pointer-diagram.png b/mojo/docs/manual/images/pointer-diagram.png similarity index 100% rename from docs/manual/images/pointer-diagram.png rename to mojo/docs/manual/images/pointer-diagram.png diff --git a/docs/manual/images/pointer-lifecycle-dark.png b/mojo/docs/manual/images/pointer-lifecycle-dark.png similarity index 100% rename from docs/manual/images/pointer-lifecycle-dark.png rename to mojo/docs/manual/images/pointer-lifecycle-dark.png diff --git a/docs/manual/images/pointer-lifecycle.png b/mojo/docs/manual/images/pointer-lifecycle.png similarity index 100% rename from docs/manual/images/pointer-lifecycle.png rename to mojo/docs/manual/images/pointer-lifecycle.png diff --git a/docs/manual/images/pointer-offset-dark.png b/mojo/docs/manual/images/pointer-offset-dark.png similarity index 100% rename from docs/manual/images/pointer-offset-dark.png rename to mojo/docs/manual/images/pointer-offset-dark.png diff --git a/docs/manual/images/pointer-offset.png b/mojo/docs/manual/images/pointer-offset.png similarity index 100% rename from docs/manual/images/pointer-offset.png rename to mojo/docs/manual/images/pointer-offset.png diff --git a/docs/manual/images/strided-load-storage-dark.png b/mojo/docs/manual/images/strided-load-storage-dark.png similarity index 100% rename from docs/manual/images/strided-load-storage-dark.png rename to mojo/docs/manual/images/strided-load-storage-dark.png diff --git a/docs/manual/images/strided-load-storage.png b/mojo/docs/manual/images/strided-load-storage.png similarity index 100% rename from docs/manual/images/strided-load-storage.png rename to mojo/docs/manual/images/strided-load-storage.png diff --git a/docs/manual/index.md b/mojo/docs/manual/index.md similarity index 100% rename from docs/manual/index.md rename to mojo/docs/manual/index.md diff --git a/docs/manual/lifecycle/death.mdx b/mojo/docs/manual/lifecycle/death.mdx similarity index 100% rename from docs/manual/lifecycle/death.mdx rename to mojo/docs/manual/lifecycle/death.mdx diff --git a/docs/manual/lifecycle/index.mdx b/mojo/docs/manual/lifecycle/index.mdx similarity index 100% rename from docs/manual/lifecycle/index.mdx rename to mojo/docs/manual/lifecycle/index.mdx diff --git a/docs/manual/lifecycle/life.mdx b/mojo/docs/manual/lifecycle/life.mdx similarity index 100% rename from docs/manual/lifecycle/life.mdx rename to mojo/docs/manual/lifecycle/life.mdx diff --git a/docs/manual/operators.mdx b/mojo/docs/manual/operators.mdx similarity index 100% rename from docs/manual/operators.mdx rename to mojo/docs/manual/operators.mdx diff --git a/docs/manual/packages.md b/mojo/docs/manual/packages.md similarity index 100% rename from docs/manual/packages.md rename to mojo/docs/manual/packages.md diff --git a/docs/manual/parameters/index.mdx b/mojo/docs/manual/parameters/index.mdx similarity index 100% rename from docs/manual/parameters/index.mdx rename to mojo/docs/manual/parameters/index.mdx diff --git a/docs/manual/pointers/index.mdx b/mojo/docs/manual/pointers/index.mdx similarity index 100% rename from docs/manual/pointers/index.mdx rename to mojo/docs/manual/pointers/index.mdx diff --git a/docs/manual/pointers/unsafe-pointers.mdx b/mojo/docs/manual/pointers/unsafe-pointers.mdx similarity index 100% rename from docs/manual/pointers/unsafe-pointers.mdx rename to mojo/docs/manual/pointers/unsafe-pointers.mdx diff --git a/docs/manual/python/index.mdx b/mojo/docs/manual/python/index.mdx similarity index 100% rename from docs/manual/python/index.mdx rename to mojo/docs/manual/python/index.mdx diff --git a/docs/manual/python/types.mdx b/mojo/docs/manual/python/types.mdx similarity index 100% rename from docs/manual/python/types.mdx rename to mojo/docs/manual/python/types.mdx diff --git a/docs/manual/structs.mdx b/mojo/docs/manual/structs.mdx similarity index 100% rename from docs/manual/structs.mdx rename to mojo/docs/manual/structs.mdx diff --git a/docs/manual/traits.mdx b/mojo/docs/manual/traits.mdx similarity index 100% rename from docs/manual/traits.mdx rename to mojo/docs/manual/traits.mdx diff --git a/docs/manual/types.mdx b/mojo/docs/manual/types.mdx similarity index 100% rename from docs/manual/types.mdx rename to mojo/docs/manual/types.mdx diff --git a/docs/manual/values/index.mdx b/mojo/docs/manual/values/index.mdx similarity index 100% rename from docs/manual/values/index.mdx rename to mojo/docs/manual/values/index.mdx diff --git a/docs/manual/values/lifetimes.mdx b/mojo/docs/manual/values/lifetimes.mdx similarity index 100% rename from docs/manual/values/lifetimes.mdx rename to mojo/docs/manual/values/lifetimes.mdx diff --git a/docs/manual/values/ownership.mdx b/mojo/docs/manual/values/ownership.mdx similarity index 100% rename from docs/manual/values/ownership.mdx rename to mojo/docs/manual/values/ownership.mdx diff --git a/docs/manual/values/value-semantics.mdx b/mojo/docs/manual/values/value-semantics.mdx similarity index 100% rename from docs/manual/values/value-semantics.mdx rename to mojo/docs/manual/values/value-semantics.mdx diff --git a/docs/manual/variables.mdx b/mojo/docs/manual/variables.mdx similarity index 100% rename from docs/manual/variables.mdx rename to mojo/docs/manual/variables.mdx diff --git a/docs/roadmap.md b/mojo/docs/roadmap.md similarity index 100% rename from docs/roadmap.md rename to mojo/docs/roadmap.md diff --git a/docs/tools/debugging.mdx b/mojo/docs/tools/debugging.mdx similarity index 100% rename from docs/tools/debugging.mdx rename to mojo/docs/tools/debugging.mdx diff --git a/docs/tools/images/break-on-raise.png b/mojo/docs/tools/images/break-on-raise.png similarity index 100% rename from docs/tools/images/break-on-raise.png rename to mojo/docs/tools/images/break-on-raise.png diff --git a/docs/tools/images/breakpoint-hit-count.png b/mojo/docs/tools/images/breakpoint-hit-count.png similarity index 100% rename from docs/tools/images/breakpoint-hit-count.png rename to mojo/docs/tools/images/breakpoint-hit-count.png diff --git a/docs/tools/images/debug-toolbar.png b/mojo/docs/tools/images/debug-toolbar.png similarity index 100% rename from docs/tools/images/debug-toolbar.png rename to mojo/docs/tools/images/debug-toolbar.png diff --git a/docs/tools/images/debugger-call-stack-nested1.png b/mojo/docs/tools/images/debugger-call-stack-nested1.png similarity index 100% rename from docs/tools/images/debugger-call-stack-nested1.png rename to mojo/docs/tools/images/debugger-call-stack-nested1.png diff --git a/docs/tools/images/debugger-variables.png b/mojo/docs/tools/images/debugger-variables.png similarity index 100% rename from docs/tools/images/debugger-variables.png rename to mojo/docs/tools/images/debugger-variables.png diff --git a/docs/tools/images/launch-configuration-menu.png b/mojo/docs/tools/images/launch-configuration-menu.png similarity index 100% rename from docs/tools/images/launch-configuration-menu.png rename to mojo/docs/tools/images/launch-configuration-menu.png diff --git a/docs/tools/images/quick-run-or-debug-button-debug.png b/mojo/docs/tools/images/quick-run-or-debug-button-debug.png similarity index 100% rename from docs/tools/images/quick-run-or-debug-button-debug.png rename to mojo/docs/tools/images/quick-run-or-debug-button-debug.png diff --git a/docs/tools/images/quick-run-or-debug-button.png b/mojo/docs/tools/images/quick-run-or-debug-button.png similarity index 100% rename from docs/tools/images/quick-run-or-debug-button.png rename to mojo/docs/tools/images/quick-run-or-debug-button.png diff --git a/docs/tools/images/quick-run-or-debug-menu.png b/mojo/docs/tools/images/quick-run-or-debug-menu.png similarity index 100% rename from docs/tools/images/quick-run-or-debug-menu.png rename to mojo/docs/tools/images/quick-run-or-debug-menu.png diff --git a/docs/tools/images/run-and-debug-icon.png b/mojo/docs/tools/images/run-and-debug-icon.png similarity index 100% rename from docs/tools/images/run-and-debug-icon.png rename to mojo/docs/tools/images/run-and-debug-icon.png diff --git a/docs/tools/images/run-and-debug-view.png b/mojo/docs/tools/images/run-and-debug-view.png similarity index 100% rename from docs/tools/images/run-and-debug-view.png rename to mojo/docs/tools/images/run-and-debug-view.png diff --git a/docs/tools/images/run-start-view.png b/mojo/docs/tools/images/run-start-view.png similarity index 100% rename from docs/tools/images/run-start-view.png rename to mojo/docs/tools/images/run-start-view.png diff --git a/docs/tools/testing.mdx b/mojo/docs/tools/testing.mdx similarity index 100% rename from docs/tools/testing.mdx rename to mojo/docs/tools/testing.mdx diff --git a/docs/why-mojo.md b/mojo/docs/why-mojo.md similarity index 100% rename from docs/why-mojo.md rename to mojo/docs/why-mojo.md diff --git a/pixi.toml b/mojo/pixi.toml similarity index 100% rename from pixi.toml rename to mojo/pixi.toml diff --git a/proposals/README.md b/mojo/proposals/README.md similarity index 100% rename from proposals/README.md rename to mojo/proposals/README.md diff --git a/proposals/always_inline_builtin.md b/mojo/proposals/always_inline_builtin.md similarity index 100% rename from proposals/always_inline_builtin.md rename to mojo/proposals/always_inline_builtin.md diff --git a/proposals/byte-as-uint8.md b/mojo/proposals/byte-as-uint8.md similarity index 100% rename from proposals/byte-as-uint8.md rename to mojo/proposals/byte-as-uint8.md diff --git a/proposals/improved-hash-module.md b/mojo/proposals/improved-hash-module.md similarity index 100% rename from proposals/improved-hash-module.md rename to mojo/proposals/improved-hash-module.md diff --git a/proposals/inferred-parameters.md b/mojo/proposals/inferred-parameters.md similarity index 100% rename from proposals/inferred-parameters.md rename to mojo/proposals/inferred-parameters.md diff --git a/proposals/lifetimes-and-provenance.md b/mojo/proposals/lifetimes-and-provenance.md similarity index 100% rename from proposals/lifetimes-and-provenance.md rename to mojo/proposals/lifetimes-and-provenance.md diff --git a/proposals/lifetimes-keyword-renaming.md b/mojo/proposals/lifetimes-keyword-renaming.md similarity index 100% rename from proposals/lifetimes-keyword-renaming.md rename to mojo/proposals/lifetimes-keyword-renaming.md diff --git a/proposals/mojo-and-dynamism.md b/mojo/proposals/mojo-and-dynamism.md similarity index 100% rename from proposals/mojo-and-dynamism.md rename to mojo/proposals/mojo-and-dynamism.md diff --git a/proposals/opt-in-implicit-conversion.md b/mojo/proposals/opt-in-implicit-conversion.md similarity index 100% rename from proposals/opt-in-implicit-conversion.md rename to mojo/proposals/opt-in-implicit-conversion.md diff --git a/proposals/project-manifest-and-build-tool.md b/mojo/proposals/project-manifest-and-build-tool.md similarity index 100% rename from proposals/project-manifest-and-build-tool.md rename to mojo/proposals/project-manifest-and-build-tool.md diff --git a/proposals/ref-convention.md b/mojo/proposals/ref-convention.md similarity index 100% rename from proposals/ref-convention.md rename to mojo/proposals/ref-convention.md diff --git a/proposals/remove-let-decls.md b/mojo/proposals/remove-let-decls.md similarity index 100% rename from proposals/remove-let-decls.md rename to mojo/proposals/remove-let-decls.md diff --git a/proposals/stdlib-insider-docs.md b/mojo/proposals/stdlib-insider-docs.md similarity index 100% rename from proposals/stdlib-insider-docs.md rename to mojo/proposals/stdlib-insider-docs.md diff --git a/proposals/value-ownership.md b/mojo/proposals/value-ownership.md similarity index 100% rename from proposals/value-ownership.md rename to mojo/proposals/value-ownership.md diff --git a/stdlib/README.md b/mojo/stdlib/README.md similarity index 100% rename from stdlib/README.md rename to mojo/stdlib/README.md diff --git a/stdlib/benchmarks/README.md b/mojo/stdlib/benchmarks/README.md similarity index 100% rename from stdlib/benchmarks/README.md rename to mojo/stdlib/benchmarks/README.md diff --git a/stdlib/benchmarks/algorithm/bench_elementwise.mojo b/mojo/stdlib/benchmarks/algorithm/bench_elementwise.mojo similarity index 100% rename from stdlib/benchmarks/algorithm/bench_elementwise.mojo rename to mojo/stdlib/benchmarks/algorithm/bench_elementwise.mojo diff --git a/stdlib/benchmarks/builtin/bench_int.mojo b/mojo/stdlib/benchmarks/builtin/bench_int.mojo similarity index 100% rename from stdlib/benchmarks/builtin/bench_int.mojo rename to mojo/stdlib/benchmarks/builtin/bench_int.mojo diff --git a/stdlib/benchmarks/builtin/bench_sort.mojo b/mojo/stdlib/benchmarks/builtin/bench_sort.mojo similarity index 100% rename from stdlib/benchmarks/builtin/bench_sort.mojo rename to mojo/stdlib/benchmarks/builtin/bench_sort.mojo diff --git a/stdlib/benchmarks/collections/bench_dict.mojo b/mojo/stdlib/benchmarks/collections/bench_dict.mojo similarity index 100% rename from stdlib/benchmarks/collections/bench_dict.mojo rename to mojo/stdlib/benchmarks/collections/bench_dict.mojo diff --git a/stdlib/benchmarks/collections/bench_string.mojo b/mojo/stdlib/benchmarks/collections/bench_string.mojo similarity index 100% rename from stdlib/benchmarks/collections/bench_string.mojo rename to mojo/stdlib/benchmarks/collections/bench_string.mojo diff --git a/stdlib/benchmarks/collections/data/README.md b/mojo/stdlib/benchmarks/collections/data/README.md similarity index 100% rename from stdlib/benchmarks/collections/data/README.md rename to mojo/stdlib/benchmarks/collections/data/README.md diff --git a/stdlib/benchmarks/collections/data/UN_charter_AR.html b/mojo/stdlib/benchmarks/collections/data/UN_charter_AR.html similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_AR.html rename to mojo/stdlib/benchmarks/collections/data/UN_charter_AR.html diff --git a/stdlib/benchmarks/collections/data/UN_charter_AR.txt b/mojo/stdlib/benchmarks/collections/data/UN_charter_AR.txt similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_AR.txt rename to mojo/stdlib/benchmarks/collections/data/UN_charter_AR.txt diff --git a/stdlib/benchmarks/collections/data/UN_charter_EN.html b/mojo/stdlib/benchmarks/collections/data/UN_charter_EN.html similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_EN.html rename to mojo/stdlib/benchmarks/collections/data/UN_charter_EN.html diff --git a/stdlib/benchmarks/collections/data/UN_charter_EN.txt b/mojo/stdlib/benchmarks/collections/data/UN_charter_EN.txt similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_EN.txt rename to mojo/stdlib/benchmarks/collections/data/UN_charter_EN.txt diff --git a/stdlib/benchmarks/collections/data/UN_charter_ES.html b/mojo/stdlib/benchmarks/collections/data/UN_charter_ES.html similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_ES.html rename to mojo/stdlib/benchmarks/collections/data/UN_charter_ES.html diff --git a/stdlib/benchmarks/collections/data/UN_charter_ES.txt b/mojo/stdlib/benchmarks/collections/data/UN_charter_ES.txt similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_ES.txt rename to mojo/stdlib/benchmarks/collections/data/UN_charter_ES.txt diff --git a/stdlib/benchmarks/collections/data/UN_charter_RU.html b/mojo/stdlib/benchmarks/collections/data/UN_charter_RU.html similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_RU.html rename to mojo/stdlib/benchmarks/collections/data/UN_charter_RU.html diff --git a/stdlib/benchmarks/collections/data/UN_charter_RU.txt b/mojo/stdlib/benchmarks/collections/data/UN_charter_RU.txt similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_RU.txt rename to mojo/stdlib/benchmarks/collections/data/UN_charter_RU.txt diff --git a/stdlib/benchmarks/collections/data/UN_charter_zh-CN.html b/mojo/stdlib/benchmarks/collections/data/UN_charter_zh-CN.html similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_zh-CN.html rename to mojo/stdlib/benchmarks/collections/data/UN_charter_zh-CN.html diff --git a/stdlib/benchmarks/collections/data/UN_charter_zh-CN.txt b/mojo/stdlib/benchmarks/collections/data/UN_charter_zh-CN.txt similarity index 100% rename from stdlib/benchmarks/collections/data/UN_charter_zh-CN.txt rename to mojo/stdlib/benchmarks/collections/data/UN_charter_zh-CN.txt diff --git a/stdlib/benchmarks/hashlib/bench_hash.mojo b/mojo/stdlib/benchmarks/hashlib/bench_hash.mojo similarity index 100% rename from stdlib/benchmarks/hashlib/bench_hash.mojo rename to mojo/stdlib/benchmarks/hashlib/bench_hash.mojo diff --git a/stdlib/benchmarks/lit.cfg.py b/mojo/stdlib/benchmarks/lit.cfg.py similarity index 100% rename from stdlib/benchmarks/lit.cfg.py rename to mojo/stdlib/benchmarks/lit.cfg.py diff --git a/stdlib/benchmarks/math/bench_math.mojo b/mojo/stdlib/benchmarks/math/bench_math.mojo similarity index 100% rename from stdlib/benchmarks/math/bench_math.mojo rename to mojo/stdlib/benchmarks/math/bench_math.mojo diff --git a/stdlib/benchmarks/utils/bench_formatter.mojo b/mojo/stdlib/benchmarks/utils/bench_formatter.mojo similarity index 100% rename from stdlib/benchmarks/utils/bench_formatter.mojo rename to mojo/stdlib/benchmarks/utils/bench_formatter.mojo diff --git a/stdlib/benchmarks/utils/bench_memmem.mojo b/mojo/stdlib/benchmarks/utils/bench_memmem.mojo similarity index 100% rename from stdlib/benchmarks/utils/bench_memmem.mojo rename to mojo/stdlib/benchmarks/utils/bench_memmem.mojo diff --git a/stdlib/docs/development.md b/mojo/stdlib/docs/development.md similarity index 100% rename from stdlib/docs/development.md rename to mojo/stdlib/docs/development.md diff --git a/stdlib/docs/docstring-style-guide.md b/mojo/stdlib/docs/docstring-style-guide.md similarity index 100% rename from stdlib/docs/docstring-style-guide.md rename to mojo/stdlib/docs/docstring-style-guide.md diff --git a/stdlib/docs/faq.md b/mojo/stdlib/docs/faq.md similarity index 100% rename from stdlib/docs/faq.md rename to mojo/stdlib/docs/faq.md diff --git a/stdlib/docs/governance-structure.md b/mojo/stdlib/docs/governance-structure.md similarity index 100% rename from stdlib/docs/governance-structure.md rename to mojo/stdlib/docs/governance-structure.md diff --git a/stdlib/docs/images/create-fork.png b/mojo/stdlib/docs/images/create-fork.png similarity index 100% rename from stdlib/docs/images/create-fork.png rename to mojo/stdlib/docs/images/create-fork.png diff --git a/stdlib/docs/images/doc-lint-quick-fix.png b/mojo/stdlib/docs/images/doc-lint-quick-fix.png similarity index 100% rename from stdlib/docs/images/doc-lint-quick-fix.png rename to mojo/stdlib/docs/images/doc-lint-quick-fix.png diff --git a/stdlib/docs/images/nightly-extension.png b/mojo/stdlib/docs/images/nightly-extension.png similarity index 100% rename from stdlib/docs/images/nightly-extension.png rename to mojo/stdlib/docs/images/nightly-extension.png diff --git a/stdlib/docs/internal/README.md b/mojo/stdlib/docs/internal/README.md similarity index 100% rename from stdlib/docs/internal/README.md rename to mojo/stdlib/docs/internal/README.md diff --git a/stdlib/docs/internal/compiler.md b/mojo/stdlib/docs/internal/compiler.md similarity index 100% rename from stdlib/docs/internal/compiler.md rename to mojo/stdlib/docs/internal/compiler.md diff --git a/stdlib/docs/internal/mlir.md b/mojo/stdlib/docs/internal/mlir.md similarity index 100% rename from stdlib/docs/internal/mlir.md rename to mojo/stdlib/docs/internal/mlir.md diff --git a/stdlib/docs/internal/runtime.md b/mojo/stdlib/docs/internal/runtime.md similarity index 100% rename from stdlib/docs/internal/runtime.md rename to mojo/stdlib/docs/internal/runtime.md diff --git a/stdlib/docs/roadmap.md b/mojo/stdlib/docs/roadmap.md similarity index 100% rename from stdlib/docs/roadmap.md rename to mojo/stdlib/docs/roadmap.md diff --git a/stdlib/docs/style-guide.md b/mojo/stdlib/docs/style-guide.md similarity index 100% rename from stdlib/docs/style-guide.md rename to mojo/stdlib/docs/style-guide.md diff --git a/stdlib/docs/vision.md b/mojo/stdlib/docs/vision.md similarity index 100% rename from stdlib/docs/vision.md rename to mojo/stdlib/docs/vision.md diff --git a/stdlib/scripts/.markdownlint.yaml b/mojo/stdlib/scripts/.markdownlint.yaml similarity index 100% rename from stdlib/scripts/.markdownlint.yaml rename to mojo/stdlib/scripts/.markdownlint.yaml diff --git a/stdlib/scripts/build-stdlib.sh b/mojo/stdlib/scripts/build-stdlib.sh similarity index 100% rename from stdlib/scripts/build-stdlib.sh rename to mojo/stdlib/scripts/build-stdlib.sh diff --git a/stdlib/scripts/check-docstrings.py b/mojo/stdlib/scripts/check-docstrings.py similarity index 100% rename from stdlib/scripts/check-docstrings.py rename to mojo/stdlib/scripts/check-docstrings.py diff --git a/stdlib/scripts/check_licenses.mojo b/mojo/stdlib/scripts/check_licenses.mojo similarity index 100% rename from stdlib/scripts/check_licenses.mojo rename to mojo/stdlib/scripts/check_licenses.mojo diff --git a/stdlib/scripts/install-build-tools-linux.sh b/mojo/stdlib/scripts/install-build-tools-linux.sh similarity index 100% rename from stdlib/scripts/install-build-tools-linux.sh rename to mojo/stdlib/scripts/install-build-tools-linux.sh diff --git a/stdlib/scripts/install-build-tools-macos.sh b/mojo/stdlib/scripts/install-build-tools-macos.sh similarity index 100% rename from stdlib/scripts/install-build-tools-macos.sh rename to mojo/stdlib/scripts/install-build-tools-macos.sh diff --git a/stdlib/scripts/markdownlint.sh b/mojo/stdlib/scripts/markdownlint.sh similarity index 100% rename from stdlib/scripts/markdownlint.sh rename to mojo/stdlib/scripts/markdownlint.sh diff --git a/stdlib/scripts/run-benchmarks.sh b/mojo/stdlib/scripts/run-benchmarks.sh similarity index 100% rename from stdlib/scripts/run-benchmarks.sh rename to mojo/stdlib/scripts/run-benchmarks.sh diff --git a/stdlib/scripts/run-tests.sh b/mojo/stdlib/scripts/run-tests.sh similarity index 100% rename from stdlib/scripts/run-tests.sh rename to mojo/stdlib/scripts/run-tests.sh diff --git a/stdlib/src/__init__.mojo b/mojo/stdlib/src/__init__.mojo similarity index 100% rename from stdlib/src/__init__.mojo rename to mojo/stdlib/src/__init__.mojo diff --git a/stdlib/src/base64/__init__.mojo b/mojo/stdlib/src/base64/__init__.mojo similarity index 100% rename from stdlib/src/base64/__init__.mojo rename to mojo/stdlib/src/base64/__init__.mojo diff --git a/stdlib/src/base64/_b64encode.mojo b/mojo/stdlib/src/base64/_b64encode.mojo similarity index 100% rename from stdlib/src/base64/_b64encode.mojo rename to mojo/stdlib/src/base64/_b64encode.mojo diff --git a/stdlib/src/base64/base64.mojo b/mojo/stdlib/src/base64/base64.mojo similarity index 100% rename from stdlib/src/base64/base64.mojo rename to mojo/stdlib/src/base64/base64.mojo diff --git a/stdlib/src/bit/__init__.mojo b/mojo/stdlib/src/bit/__init__.mojo similarity index 100% rename from stdlib/src/bit/__init__.mojo rename to mojo/stdlib/src/bit/__init__.mojo diff --git a/stdlib/src/bit/bit.mojo b/mojo/stdlib/src/bit/bit.mojo similarity index 100% rename from stdlib/src/bit/bit.mojo rename to mojo/stdlib/src/bit/bit.mojo diff --git a/stdlib/src/builtin/__init__.mojo b/mojo/stdlib/src/builtin/__init__.mojo similarity index 100% rename from stdlib/src/builtin/__init__.mojo rename to mojo/stdlib/src/builtin/__init__.mojo diff --git a/stdlib/src/builtin/_closure.mojo b/mojo/stdlib/src/builtin/_closure.mojo similarity index 100% rename from stdlib/src/builtin/_closure.mojo rename to mojo/stdlib/src/builtin/_closure.mojo diff --git a/stdlib/src/builtin/_format_float.mojo b/mojo/stdlib/src/builtin/_format_float.mojo similarity index 100% rename from stdlib/src/builtin/_format_float.mojo rename to mojo/stdlib/src/builtin/_format_float.mojo diff --git a/stdlib/src/builtin/_location.mojo b/mojo/stdlib/src/builtin/_location.mojo similarity index 100% rename from stdlib/src/builtin/_location.mojo rename to mojo/stdlib/src/builtin/_location.mojo diff --git a/stdlib/src/builtin/_pybind.mojo b/mojo/stdlib/src/builtin/_pybind.mojo similarity index 100% rename from stdlib/src/builtin/_pybind.mojo rename to mojo/stdlib/src/builtin/_pybind.mojo diff --git a/stdlib/src/builtin/_startup.mojo b/mojo/stdlib/src/builtin/_startup.mojo similarity index 100% rename from stdlib/src/builtin/_startup.mojo rename to mojo/stdlib/src/builtin/_startup.mojo diff --git a/stdlib/src/builtin/_stubs.mojo b/mojo/stdlib/src/builtin/_stubs.mojo similarity index 100% rename from stdlib/src/builtin/_stubs.mojo rename to mojo/stdlib/src/builtin/_stubs.mojo diff --git a/stdlib/src/builtin/anytype.mojo b/mojo/stdlib/src/builtin/anytype.mojo similarity index 100% rename from stdlib/src/builtin/anytype.mojo rename to mojo/stdlib/src/builtin/anytype.mojo diff --git a/stdlib/src/builtin/bool.mojo b/mojo/stdlib/src/builtin/bool.mojo similarity index 100% rename from stdlib/src/builtin/bool.mojo rename to mojo/stdlib/src/builtin/bool.mojo diff --git a/stdlib/src/builtin/breakpoint.mojo b/mojo/stdlib/src/builtin/breakpoint.mojo similarity index 100% rename from stdlib/src/builtin/breakpoint.mojo rename to mojo/stdlib/src/builtin/breakpoint.mojo diff --git a/stdlib/src/builtin/builtin_list.mojo b/mojo/stdlib/src/builtin/builtin_list.mojo similarity index 100% rename from stdlib/src/builtin/builtin_list.mojo rename to mojo/stdlib/src/builtin/builtin_list.mojo diff --git a/stdlib/src/builtin/builtin_slice.mojo b/mojo/stdlib/src/builtin/builtin_slice.mojo similarity index 100% rename from stdlib/src/builtin/builtin_slice.mojo rename to mojo/stdlib/src/builtin/builtin_slice.mojo diff --git a/stdlib/src/builtin/comparable.mojo b/mojo/stdlib/src/builtin/comparable.mojo similarity index 100% rename from stdlib/src/builtin/comparable.mojo rename to mojo/stdlib/src/builtin/comparable.mojo diff --git a/stdlib/src/builtin/constrained.mojo b/mojo/stdlib/src/builtin/constrained.mojo similarity index 100% rename from stdlib/src/builtin/constrained.mojo rename to mojo/stdlib/src/builtin/constrained.mojo diff --git a/stdlib/src/builtin/coroutine.mojo b/mojo/stdlib/src/builtin/coroutine.mojo similarity index 100% rename from stdlib/src/builtin/coroutine.mojo rename to mojo/stdlib/src/builtin/coroutine.mojo diff --git a/stdlib/src/builtin/debug_assert.mojo b/mojo/stdlib/src/builtin/debug_assert.mojo similarity index 100% rename from stdlib/src/builtin/debug_assert.mojo rename to mojo/stdlib/src/builtin/debug_assert.mojo diff --git a/stdlib/src/builtin/dtype.mojo b/mojo/stdlib/src/builtin/dtype.mojo similarity index 100% rename from stdlib/src/builtin/dtype.mojo rename to mojo/stdlib/src/builtin/dtype.mojo diff --git a/stdlib/src/builtin/equality_comparable.mojo b/mojo/stdlib/src/builtin/equality_comparable.mojo similarity index 100% rename from stdlib/src/builtin/equality_comparable.mojo rename to mojo/stdlib/src/builtin/equality_comparable.mojo diff --git a/stdlib/src/builtin/error.mojo b/mojo/stdlib/src/builtin/error.mojo similarity index 100% rename from stdlib/src/builtin/error.mojo rename to mojo/stdlib/src/builtin/error.mojo diff --git a/stdlib/src/builtin/file.mojo b/mojo/stdlib/src/builtin/file.mojo similarity index 100% rename from stdlib/src/builtin/file.mojo rename to mojo/stdlib/src/builtin/file.mojo diff --git a/stdlib/src/builtin/file_descriptor.mojo b/mojo/stdlib/src/builtin/file_descriptor.mojo similarity index 100% rename from stdlib/src/builtin/file_descriptor.mojo rename to mojo/stdlib/src/builtin/file_descriptor.mojo diff --git a/stdlib/src/builtin/float_literal.mojo b/mojo/stdlib/src/builtin/float_literal.mojo similarity index 100% rename from stdlib/src/builtin/float_literal.mojo rename to mojo/stdlib/src/builtin/float_literal.mojo diff --git a/stdlib/src/builtin/floatable.mojo b/mojo/stdlib/src/builtin/floatable.mojo similarity index 100% rename from stdlib/src/builtin/floatable.mojo rename to mojo/stdlib/src/builtin/floatable.mojo diff --git a/stdlib/src/builtin/format_int.mojo b/mojo/stdlib/src/builtin/format_int.mojo similarity index 100% rename from stdlib/src/builtin/format_int.mojo rename to mojo/stdlib/src/builtin/format_int.mojo diff --git a/stdlib/src/builtin/identifiable.mojo b/mojo/stdlib/src/builtin/identifiable.mojo similarity index 100% rename from stdlib/src/builtin/identifiable.mojo rename to mojo/stdlib/src/builtin/identifiable.mojo diff --git a/stdlib/src/builtin/int.mojo b/mojo/stdlib/src/builtin/int.mojo similarity index 100% rename from stdlib/src/builtin/int.mojo rename to mojo/stdlib/src/builtin/int.mojo diff --git a/stdlib/src/builtin/int_literal.mojo b/mojo/stdlib/src/builtin/int_literal.mojo similarity index 100% rename from stdlib/src/builtin/int_literal.mojo rename to mojo/stdlib/src/builtin/int_literal.mojo diff --git a/stdlib/src/builtin/io.mojo b/mojo/stdlib/src/builtin/io.mojo similarity index 100% rename from stdlib/src/builtin/io.mojo rename to mojo/stdlib/src/builtin/io.mojo diff --git a/stdlib/src/builtin/len.mojo b/mojo/stdlib/src/builtin/len.mojo similarity index 100% rename from stdlib/src/builtin/len.mojo rename to mojo/stdlib/src/builtin/len.mojo diff --git a/stdlib/src/builtin/math.mojo b/mojo/stdlib/src/builtin/math.mojo similarity index 100% rename from stdlib/src/builtin/math.mojo rename to mojo/stdlib/src/builtin/math.mojo diff --git a/stdlib/src/builtin/none.mojo b/mojo/stdlib/src/builtin/none.mojo similarity index 100% rename from stdlib/src/builtin/none.mojo rename to mojo/stdlib/src/builtin/none.mojo diff --git a/stdlib/src/builtin/object.mojo b/mojo/stdlib/src/builtin/object.mojo similarity index 100% rename from stdlib/src/builtin/object.mojo rename to mojo/stdlib/src/builtin/object.mojo diff --git a/stdlib/src/builtin/range.mojo b/mojo/stdlib/src/builtin/range.mojo similarity index 100% rename from stdlib/src/builtin/range.mojo rename to mojo/stdlib/src/builtin/range.mojo diff --git a/stdlib/src/builtin/rebind.mojo b/mojo/stdlib/src/builtin/rebind.mojo similarity index 100% rename from stdlib/src/builtin/rebind.mojo rename to mojo/stdlib/src/builtin/rebind.mojo diff --git a/stdlib/src/builtin/repr.mojo b/mojo/stdlib/src/builtin/repr.mojo similarity index 100% rename from stdlib/src/builtin/repr.mojo rename to mojo/stdlib/src/builtin/repr.mojo diff --git a/stdlib/src/builtin/reversed.mojo b/mojo/stdlib/src/builtin/reversed.mojo similarity index 100% rename from stdlib/src/builtin/reversed.mojo rename to mojo/stdlib/src/builtin/reversed.mojo diff --git a/stdlib/src/builtin/simd.mojo b/mojo/stdlib/src/builtin/simd.mojo similarity index 100% rename from stdlib/src/builtin/simd.mojo rename to mojo/stdlib/src/builtin/simd.mojo diff --git a/stdlib/src/builtin/sort.mojo b/mojo/stdlib/src/builtin/sort.mojo similarity index 100% rename from stdlib/src/builtin/sort.mojo rename to mojo/stdlib/src/builtin/sort.mojo diff --git a/stdlib/src/builtin/str.mojo b/mojo/stdlib/src/builtin/str.mojo similarity index 100% rename from stdlib/src/builtin/str.mojo rename to mojo/stdlib/src/builtin/str.mojo diff --git a/stdlib/src/builtin/string_literal.mojo b/mojo/stdlib/src/builtin/string_literal.mojo similarity index 100% rename from stdlib/src/builtin/string_literal.mojo rename to mojo/stdlib/src/builtin/string_literal.mojo diff --git a/stdlib/src/builtin/swap.mojo b/mojo/stdlib/src/builtin/swap.mojo similarity index 100% rename from stdlib/src/builtin/swap.mojo rename to mojo/stdlib/src/builtin/swap.mojo diff --git a/stdlib/src/builtin/tuple.mojo b/mojo/stdlib/src/builtin/tuple.mojo similarity index 100% rename from stdlib/src/builtin/tuple.mojo rename to mojo/stdlib/src/builtin/tuple.mojo diff --git a/stdlib/src/builtin/type_aliases.mojo b/mojo/stdlib/src/builtin/type_aliases.mojo similarity index 100% rename from stdlib/src/builtin/type_aliases.mojo rename to mojo/stdlib/src/builtin/type_aliases.mojo diff --git a/stdlib/src/builtin/uint.mojo b/mojo/stdlib/src/builtin/uint.mojo similarity index 100% rename from stdlib/src/builtin/uint.mojo rename to mojo/stdlib/src/builtin/uint.mojo diff --git a/stdlib/src/builtin/value.mojo b/mojo/stdlib/src/builtin/value.mojo similarity index 100% rename from stdlib/src/builtin/value.mojo rename to mojo/stdlib/src/builtin/value.mojo diff --git a/stdlib/src/collections/__init__.mojo b/mojo/stdlib/src/collections/__init__.mojo similarity index 100% rename from stdlib/src/collections/__init__.mojo rename to mojo/stdlib/src/collections/__init__.mojo diff --git a/stdlib/src/collections/_index_normalization.mojo b/mojo/stdlib/src/collections/_index_normalization.mojo similarity index 100% rename from stdlib/src/collections/_index_normalization.mojo rename to mojo/stdlib/src/collections/_index_normalization.mojo diff --git a/stdlib/src/collections/counter.mojo b/mojo/stdlib/src/collections/counter.mojo similarity index 100% rename from stdlib/src/collections/counter.mojo rename to mojo/stdlib/src/collections/counter.mojo diff --git a/stdlib/src/collections/deque.mojo b/mojo/stdlib/src/collections/deque.mojo similarity index 100% rename from stdlib/src/collections/deque.mojo rename to mojo/stdlib/src/collections/deque.mojo diff --git a/stdlib/src/collections/dict.mojo b/mojo/stdlib/src/collections/dict.mojo similarity index 100% rename from stdlib/src/collections/dict.mojo rename to mojo/stdlib/src/collections/dict.mojo diff --git a/stdlib/src/collections/inline_array.mojo b/mojo/stdlib/src/collections/inline_array.mojo similarity index 100% rename from stdlib/src/collections/inline_array.mojo rename to mojo/stdlib/src/collections/inline_array.mojo diff --git a/stdlib/src/collections/inline_list.mojo b/mojo/stdlib/src/collections/inline_list.mojo similarity index 100% rename from stdlib/src/collections/inline_list.mojo rename to mojo/stdlib/src/collections/inline_list.mojo diff --git a/stdlib/src/collections/interval.mojo b/mojo/stdlib/src/collections/interval.mojo similarity index 100% rename from stdlib/src/collections/interval.mojo rename to mojo/stdlib/src/collections/interval.mojo diff --git a/stdlib/src/collections/linked_list.mojo b/mojo/stdlib/src/collections/linked_list.mojo similarity index 100% rename from stdlib/src/collections/linked_list.mojo rename to mojo/stdlib/src/collections/linked_list.mojo diff --git a/stdlib/src/collections/list.mojo b/mojo/stdlib/src/collections/list.mojo similarity index 100% rename from stdlib/src/collections/list.mojo rename to mojo/stdlib/src/collections/list.mojo diff --git a/stdlib/src/collections/optional.mojo b/mojo/stdlib/src/collections/optional.mojo similarity index 100% rename from stdlib/src/collections/optional.mojo rename to mojo/stdlib/src/collections/optional.mojo diff --git a/stdlib/src/collections/set.mojo b/mojo/stdlib/src/collections/set.mojo similarity index 100% rename from stdlib/src/collections/set.mojo rename to mojo/stdlib/src/collections/set.mojo diff --git a/stdlib/src/collections/string/__init__.mojo b/mojo/stdlib/src/collections/string/__init__.mojo similarity index 100% rename from stdlib/src/collections/string/__init__.mojo rename to mojo/stdlib/src/collections/string/__init__.mojo diff --git a/stdlib/src/collections/string/_unicode.mojo b/mojo/stdlib/src/collections/string/_unicode.mojo similarity index 100% rename from stdlib/src/collections/string/_unicode.mojo rename to mojo/stdlib/src/collections/string/_unicode.mojo diff --git a/stdlib/src/collections/string/_unicode_lookups.mojo b/mojo/stdlib/src/collections/string/_unicode_lookups.mojo similarity index 100% rename from stdlib/src/collections/string/_unicode_lookups.mojo rename to mojo/stdlib/src/collections/string/_unicode_lookups.mojo diff --git a/stdlib/src/collections/string/_utf8_validation.mojo b/mojo/stdlib/src/collections/string/_utf8_validation.mojo similarity index 100% rename from stdlib/src/collections/string/_utf8_validation.mojo rename to mojo/stdlib/src/collections/string/_utf8_validation.mojo diff --git a/stdlib/src/collections/string/codepoint.mojo b/mojo/stdlib/src/collections/string/codepoint.mojo similarity index 100% rename from stdlib/src/collections/string/codepoint.mojo rename to mojo/stdlib/src/collections/string/codepoint.mojo diff --git a/stdlib/src/collections/string/format.mojo b/mojo/stdlib/src/collections/string/format.mojo similarity index 100% rename from stdlib/src/collections/string/format.mojo rename to mojo/stdlib/src/collections/string/format.mojo diff --git a/stdlib/src/collections/string/inline_string.mojo b/mojo/stdlib/src/collections/string/inline_string.mojo similarity index 100% rename from stdlib/src/collections/string/inline_string.mojo rename to mojo/stdlib/src/collections/string/inline_string.mojo diff --git a/stdlib/src/collections/string/string.mojo b/mojo/stdlib/src/collections/string/string.mojo similarity index 100% rename from stdlib/src/collections/string/string.mojo rename to mojo/stdlib/src/collections/string/string.mojo diff --git a/stdlib/src/collections/string/string_slice.mojo b/mojo/stdlib/src/collections/string/string_slice.mojo similarity index 100% rename from stdlib/src/collections/string/string_slice.mojo rename to mojo/stdlib/src/collections/string/string_slice.mojo diff --git a/stdlib/src/collections/vector.mojo b/mojo/stdlib/src/collections/vector.mojo similarity index 100% rename from stdlib/src/collections/vector.mojo rename to mojo/stdlib/src/collections/vector.mojo diff --git a/stdlib/src/documentation/__init__.mojo b/mojo/stdlib/src/documentation/__init__.mojo similarity index 100% rename from stdlib/src/documentation/__init__.mojo rename to mojo/stdlib/src/documentation/__init__.mojo diff --git a/stdlib/src/documentation/documentation.mojo b/mojo/stdlib/src/documentation/documentation.mojo similarity index 100% rename from stdlib/src/documentation/documentation.mojo rename to mojo/stdlib/src/documentation/documentation.mojo diff --git a/stdlib/src/hashlib/__init__.mojo b/mojo/stdlib/src/hashlib/__init__.mojo similarity index 100% rename from stdlib/src/hashlib/__init__.mojo rename to mojo/stdlib/src/hashlib/__init__.mojo diff --git a/stdlib/src/hashlib/_ahash.mojo b/mojo/stdlib/src/hashlib/_ahash.mojo similarity index 100% rename from stdlib/src/hashlib/_ahash.mojo rename to mojo/stdlib/src/hashlib/_ahash.mojo diff --git a/stdlib/src/hashlib/_hasher.mojo b/mojo/stdlib/src/hashlib/_hasher.mojo similarity index 100% rename from stdlib/src/hashlib/_hasher.mojo rename to mojo/stdlib/src/hashlib/_hasher.mojo diff --git a/stdlib/src/hashlib/hash.mojo b/mojo/stdlib/src/hashlib/hash.mojo similarity index 100% rename from stdlib/src/hashlib/hash.mojo rename to mojo/stdlib/src/hashlib/hash.mojo diff --git a/stdlib/src/math/__init__.mojo b/mojo/stdlib/src/math/__init__.mojo similarity index 100% rename from stdlib/src/math/__init__.mojo rename to mojo/stdlib/src/math/__init__.mojo diff --git a/stdlib/src/math/constants.mojo b/mojo/stdlib/src/math/constants.mojo similarity index 100% rename from stdlib/src/math/constants.mojo rename to mojo/stdlib/src/math/constants.mojo diff --git a/stdlib/src/math/math.mojo b/mojo/stdlib/src/math/math.mojo similarity index 100% rename from stdlib/src/math/math.mojo rename to mojo/stdlib/src/math/math.mojo diff --git a/stdlib/src/math/polynomial.mojo b/mojo/stdlib/src/math/polynomial.mojo similarity index 100% rename from stdlib/src/math/polynomial.mojo rename to mojo/stdlib/src/math/polynomial.mojo diff --git a/stdlib/src/memory/__init__.mojo b/mojo/stdlib/src/memory/__init__.mojo similarity index 100% rename from stdlib/src/memory/__init__.mojo rename to mojo/stdlib/src/memory/__init__.mojo diff --git a/stdlib/src/memory/arc.mojo b/mojo/stdlib/src/memory/arc.mojo similarity index 100% rename from stdlib/src/memory/arc.mojo rename to mojo/stdlib/src/memory/arc.mojo diff --git a/stdlib/src/memory/maybe_uninitialized.mojo b/mojo/stdlib/src/memory/maybe_uninitialized.mojo similarity index 100% rename from stdlib/src/memory/maybe_uninitialized.mojo rename to mojo/stdlib/src/memory/maybe_uninitialized.mojo diff --git a/stdlib/src/memory/memory.mojo b/mojo/stdlib/src/memory/memory.mojo similarity index 100% rename from stdlib/src/memory/memory.mojo rename to mojo/stdlib/src/memory/memory.mojo diff --git a/stdlib/src/memory/owned_pointer.mojo b/mojo/stdlib/src/memory/owned_pointer.mojo similarity index 100% rename from stdlib/src/memory/owned_pointer.mojo rename to mojo/stdlib/src/memory/owned_pointer.mojo diff --git a/stdlib/src/memory/pointer.mojo b/mojo/stdlib/src/memory/pointer.mojo similarity index 100% rename from stdlib/src/memory/pointer.mojo rename to mojo/stdlib/src/memory/pointer.mojo diff --git a/stdlib/src/memory/span.mojo b/mojo/stdlib/src/memory/span.mojo similarity index 100% rename from stdlib/src/memory/span.mojo rename to mojo/stdlib/src/memory/span.mojo diff --git a/stdlib/src/memory/unsafe.mojo b/mojo/stdlib/src/memory/unsafe.mojo similarity index 100% rename from stdlib/src/memory/unsafe.mojo rename to mojo/stdlib/src/memory/unsafe.mojo diff --git a/stdlib/src/memory/unsafe_pointer.mojo b/mojo/stdlib/src/memory/unsafe_pointer.mojo similarity index 100% rename from stdlib/src/memory/unsafe_pointer.mojo rename to mojo/stdlib/src/memory/unsafe_pointer.mojo diff --git a/stdlib/src/os/__init__.mojo b/mojo/stdlib/src/os/__init__.mojo similarity index 100% rename from stdlib/src/os/__init__.mojo rename to mojo/stdlib/src/os/__init__.mojo diff --git a/stdlib/src/os/_linux_aarch64.mojo b/mojo/stdlib/src/os/_linux_aarch64.mojo similarity index 100% rename from stdlib/src/os/_linux_aarch64.mojo rename to mojo/stdlib/src/os/_linux_aarch64.mojo diff --git a/stdlib/src/os/_linux_x86.mojo b/mojo/stdlib/src/os/_linux_x86.mojo similarity index 100% rename from stdlib/src/os/_linux_x86.mojo rename to mojo/stdlib/src/os/_linux_x86.mojo diff --git a/stdlib/src/os/_macos.mojo b/mojo/stdlib/src/os/_macos.mojo similarity index 100% rename from stdlib/src/os/_macos.mojo rename to mojo/stdlib/src/os/_macos.mojo diff --git a/stdlib/src/os/_windows.mojo b/mojo/stdlib/src/os/_windows.mojo similarity index 100% rename from stdlib/src/os/_windows.mojo rename to mojo/stdlib/src/os/_windows.mojo diff --git a/stdlib/src/os/atomic.mojo b/mojo/stdlib/src/os/atomic.mojo similarity index 100% rename from stdlib/src/os/atomic.mojo rename to mojo/stdlib/src/os/atomic.mojo diff --git a/stdlib/src/os/env.mojo b/mojo/stdlib/src/os/env.mojo similarity index 100% rename from stdlib/src/os/env.mojo rename to mojo/stdlib/src/os/env.mojo diff --git a/stdlib/src/os/fstat.mojo b/mojo/stdlib/src/os/fstat.mojo similarity index 100% rename from stdlib/src/os/fstat.mojo rename to mojo/stdlib/src/os/fstat.mojo diff --git a/stdlib/src/os/os.mojo b/mojo/stdlib/src/os/os.mojo similarity index 100% rename from stdlib/src/os/os.mojo rename to mojo/stdlib/src/os/os.mojo diff --git a/stdlib/src/os/path/__init__.mojo b/mojo/stdlib/src/os/path/__init__.mojo similarity index 100% rename from stdlib/src/os/path/__init__.mojo rename to mojo/stdlib/src/os/path/__init__.mojo diff --git a/stdlib/src/os/path/path.mojo b/mojo/stdlib/src/os/path/path.mojo similarity index 100% rename from stdlib/src/os/path/path.mojo rename to mojo/stdlib/src/os/path/path.mojo diff --git a/stdlib/src/os/pathlike.mojo b/mojo/stdlib/src/os/pathlike.mojo similarity index 100% rename from stdlib/src/os/pathlike.mojo rename to mojo/stdlib/src/os/pathlike.mojo diff --git a/stdlib/src/pathlib/__init__.mojo b/mojo/stdlib/src/pathlib/__init__.mojo similarity index 100% rename from stdlib/src/pathlib/__init__.mojo rename to mojo/stdlib/src/pathlib/__init__.mojo diff --git a/stdlib/src/pathlib/path.mojo b/mojo/stdlib/src/pathlib/path.mojo similarity index 100% rename from stdlib/src/pathlib/path.mojo rename to mojo/stdlib/src/pathlib/path.mojo diff --git a/stdlib/src/prelude/__init__.mojo b/mojo/stdlib/src/prelude/__init__.mojo similarity index 100% rename from stdlib/src/prelude/__init__.mojo rename to mojo/stdlib/src/prelude/__init__.mojo diff --git a/stdlib/src/pwd/__init__.mojo b/mojo/stdlib/src/pwd/__init__.mojo similarity index 100% rename from stdlib/src/pwd/__init__.mojo rename to mojo/stdlib/src/pwd/__init__.mojo diff --git a/stdlib/src/pwd/_linux.mojo b/mojo/stdlib/src/pwd/_linux.mojo similarity index 100% rename from stdlib/src/pwd/_linux.mojo rename to mojo/stdlib/src/pwd/_linux.mojo diff --git a/stdlib/src/pwd/_macos.mojo b/mojo/stdlib/src/pwd/_macos.mojo similarity index 100% rename from stdlib/src/pwd/_macos.mojo rename to mojo/stdlib/src/pwd/_macos.mojo diff --git a/stdlib/src/pwd/pwd.mojo b/mojo/stdlib/src/pwd/pwd.mojo similarity index 100% rename from stdlib/src/pwd/pwd.mojo rename to mojo/stdlib/src/pwd/pwd.mojo diff --git a/stdlib/src/python/__init__.mojo b/mojo/stdlib/src/python/__init__.mojo similarity index 100% rename from stdlib/src/python/__init__.mojo rename to mojo/stdlib/src/python/__init__.mojo diff --git a/stdlib/src/python/_bindings.mojo b/mojo/stdlib/src/python/_bindings.mojo similarity index 100% rename from stdlib/src/python/_bindings.mojo rename to mojo/stdlib/src/python/_bindings.mojo diff --git a/stdlib/src/python/_cpython.mojo b/mojo/stdlib/src/python/_cpython.mojo similarity index 100% rename from stdlib/src/python/_cpython.mojo rename to mojo/stdlib/src/python/_cpython.mojo diff --git a/stdlib/src/python/python.mojo b/mojo/stdlib/src/python/python.mojo similarity index 100% rename from stdlib/src/python/python.mojo rename to mojo/stdlib/src/python/python.mojo diff --git a/stdlib/src/python/python_object.mojo b/mojo/stdlib/src/python/python_object.mojo similarity index 100% rename from stdlib/src/python/python_object.mojo rename to mojo/stdlib/src/python/python_object.mojo diff --git a/stdlib/src/random/__init__.mojo b/mojo/stdlib/src/random/__init__.mojo similarity index 100% rename from stdlib/src/random/__init__.mojo rename to mojo/stdlib/src/random/__init__.mojo diff --git a/stdlib/src/random/random.mojo b/mojo/stdlib/src/random/random.mojo similarity index 100% rename from stdlib/src/random/random.mojo rename to mojo/stdlib/src/random/random.mojo diff --git a/stdlib/src/stat/__init__.mojo b/mojo/stdlib/src/stat/__init__.mojo similarity index 100% rename from stdlib/src/stat/__init__.mojo rename to mojo/stdlib/src/stat/__init__.mojo diff --git a/stdlib/src/stat/stat.mojo b/mojo/stdlib/src/stat/stat.mojo similarity index 100% rename from stdlib/src/stat/stat.mojo rename to mojo/stdlib/src/stat/stat.mojo diff --git a/stdlib/src/sys/__init__.mojo b/mojo/stdlib/src/sys/__init__.mojo similarity index 100% rename from stdlib/src/sys/__init__.mojo rename to mojo/stdlib/src/sys/__init__.mojo diff --git a/stdlib/src/sys/_amdgpu.mojo b/mojo/stdlib/src/sys/_amdgpu.mojo similarity index 100% rename from stdlib/src/sys/_amdgpu.mojo rename to mojo/stdlib/src/sys/_amdgpu.mojo diff --git a/stdlib/src/sys/_assembly.mojo b/mojo/stdlib/src/sys/_assembly.mojo similarity index 100% rename from stdlib/src/sys/_assembly.mojo rename to mojo/stdlib/src/sys/_assembly.mojo diff --git a/stdlib/src/sys/_build.mojo b/mojo/stdlib/src/sys/_build.mojo similarity index 100% rename from stdlib/src/sys/_build.mojo rename to mojo/stdlib/src/sys/_build.mojo diff --git a/stdlib/src/sys/_io.mojo b/mojo/stdlib/src/sys/_io.mojo similarity index 100% rename from stdlib/src/sys/_io.mojo rename to mojo/stdlib/src/sys/_io.mojo diff --git a/stdlib/src/sys/_libc.mojo b/mojo/stdlib/src/sys/_libc.mojo similarity index 100% rename from stdlib/src/sys/_libc.mojo rename to mojo/stdlib/src/sys/_libc.mojo diff --git a/stdlib/src/sys/arg.mojo b/mojo/stdlib/src/sys/arg.mojo similarity index 100% rename from stdlib/src/sys/arg.mojo rename to mojo/stdlib/src/sys/arg.mojo diff --git a/stdlib/src/sys/compile.mojo b/mojo/stdlib/src/sys/compile.mojo similarity index 100% rename from stdlib/src/sys/compile.mojo rename to mojo/stdlib/src/sys/compile.mojo diff --git a/stdlib/src/sys/debug.mojo b/mojo/stdlib/src/sys/debug.mojo similarity index 100% rename from stdlib/src/sys/debug.mojo rename to mojo/stdlib/src/sys/debug.mojo diff --git a/stdlib/src/sys/ffi.mojo b/mojo/stdlib/src/sys/ffi.mojo similarity index 100% rename from stdlib/src/sys/ffi.mojo rename to mojo/stdlib/src/sys/ffi.mojo diff --git a/stdlib/src/sys/info.mojo b/mojo/stdlib/src/sys/info.mojo similarity index 100% rename from stdlib/src/sys/info.mojo rename to mojo/stdlib/src/sys/info.mojo diff --git a/stdlib/src/sys/intrinsics.mojo b/mojo/stdlib/src/sys/intrinsics.mojo similarity index 100% rename from stdlib/src/sys/intrinsics.mojo rename to mojo/stdlib/src/sys/intrinsics.mojo diff --git a/stdlib/src/sys/param_env.mojo b/mojo/stdlib/src/sys/param_env.mojo similarity index 100% rename from stdlib/src/sys/param_env.mojo rename to mojo/stdlib/src/sys/param_env.mojo diff --git a/stdlib/src/sys/terminate.mojo b/mojo/stdlib/src/sys/terminate.mojo similarity index 100% rename from stdlib/src/sys/terminate.mojo rename to mojo/stdlib/src/sys/terminate.mojo diff --git a/stdlib/src/tempfile/__init__.mojo b/mojo/stdlib/src/tempfile/__init__.mojo similarity index 100% rename from stdlib/src/tempfile/__init__.mojo rename to mojo/stdlib/src/tempfile/__init__.mojo diff --git a/stdlib/src/tempfile/tempfile.mojo b/mojo/stdlib/src/tempfile/tempfile.mojo similarity index 100% rename from stdlib/src/tempfile/tempfile.mojo rename to mojo/stdlib/src/tempfile/tempfile.mojo diff --git a/stdlib/src/testing/__init__.mojo b/mojo/stdlib/src/testing/__init__.mojo similarity index 100% rename from stdlib/src/testing/__init__.mojo rename to mojo/stdlib/src/testing/__init__.mojo diff --git a/stdlib/src/testing/testing.mojo b/mojo/stdlib/src/testing/testing.mojo similarity index 100% rename from stdlib/src/testing/testing.mojo rename to mojo/stdlib/src/testing/testing.mojo diff --git a/stdlib/src/time/__init__.mojo b/mojo/stdlib/src/time/__init__.mojo similarity index 100% rename from stdlib/src/time/__init__.mojo rename to mojo/stdlib/src/time/__init__.mojo diff --git a/stdlib/src/time/time.mojo b/mojo/stdlib/src/time/time.mojo similarity index 100% rename from stdlib/src/time/time.mojo rename to mojo/stdlib/src/time/time.mojo diff --git a/stdlib/src/utils/__init__.mojo b/mojo/stdlib/src/utils/__init__.mojo similarity index 100% rename from stdlib/src/utils/__init__.mojo rename to mojo/stdlib/src/utils/__init__.mojo diff --git a/stdlib/src/utils/_select.mojo b/mojo/stdlib/src/utils/_select.mojo similarity index 100% rename from stdlib/src/utils/_select.mojo rename to mojo/stdlib/src/utils/_select.mojo diff --git a/stdlib/src/utils/_serialize.mojo b/mojo/stdlib/src/utils/_serialize.mojo similarity index 100% rename from stdlib/src/utils/_serialize.mojo rename to mojo/stdlib/src/utils/_serialize.mojo diff --git a/stdlib/src/utils/_visualizers.mojo b/mojo/stdlib/src/utils/_visualizers.mojo similarity index 100% rename from stdlib/src/utils/_visualizers.mojo rename to mojo/stdlib/src/utils/_visualizers.mojo diff --git a/stdlib/src/utils/index.mojo b/mojo/stdlib/src/utils/index.mojo similarity index 100% rename from stdlib/src/utils/index.mojo rename to mojo/stdlib/src/utils/index.mojo diff --git a/stdlib/src/utils/lock.mojo b/mojo/stdlib/src/utils/lock.mojo similarity index 100% rename from stdlib/src/utils/lock.mojo rename to mojo/stdlib/src/utils/lock.mojo diff --git a/stdlib/src/utils/loop.mojo b/mojo/stdlib/src/utils/loop.mojo similarity index 100% rename from stdlib/src/utils/loop.mojo rename to mojo/stdlib/src/utils/loop.mojo diff --git a/stdlib/src/utils/numerics.mojo b/mojo/stdlib/src/utils/numerics.mojo similarity index 100% rename from stdlib/src/utils/numerics.mojo rename to mojo/stdlib/src/utils/numerics.mojo diff --git a/stdlib/src/utils/static_tuple.mojo b/mojo/stdlib/src/utils/static_tuple.mojo similarity index 100% rename from stdlib/src/utils/static_tuple.mojo rename to mojo/stdlib/src/utils/static_tuple.mojo diff --git a/stdlib/src/utils/variant.mojo b/mojo/stdlib/src/utils/variant.mojo similarity index 100% rename from stdlib/src/utils/variant.mojo rename to mojo/stdlib/src/utils/variant.mojo diff --git a/stdlib/src/utils/write.mojo b/mojo/stdlib/src/utils/write.mojo similarity index 100% rename from stdlib/src/utils/write.mojo rename to mojo/stdlib/src/utils/write.mojo diff --git a/stdlib/test/base64/test_base64.mojo b/mojo/stdlib/test/base64/test_base64.mojo similarity index 100% rename from stdlib/test/base64/test_base64.mojo rename to mojo/stdlib/test/base64/test_base64.mojo diff --git a/stdlib/test/bit/test_bit.mojo b/mojo/stdlib/test/bit/test_bit.mojo similarity index 100% rename from stdlib/test/bit/test_bit.mojo rename to mojo/stdlib/test/bit/test_bit.mojo diff --git a/stdlib/test/builtin/test_any_all.mojo b/mojo/stdlib/test/builtin/test_any_all.mojo similarity index 100% rename from stdlib/test/builtin/test_any_all.mojo rename to mojo/stdlib/test/builtin/test_any_all.mojo diff --git a/stdlib/test/builtin/test_bfloat16.mojo b/mojo/stdlib/test/builtin/test_bfloat16.mojo similarity index 100% rename from stdlib/test/builtin/test_bfloat16.mojo rename to mojo/stdlib/test/builtin/test_bfloat16.mojo diff --git a/stdlib/test/builtin/test_bool.mojo b/mojo/stdlib/test/builtin/test_bool.mojo similarity index 100% rename from stdlib/test/builtin/test_bool.mojo rename to mojo/stdlib/test/builtin/test_bool.mojo diff --git a/stdlib/test/builtin/test_debug_assert.mojo b/mojo/stdlib/test/builtin/test_debug_assert.mojo similarity index 100% rename from stdlib/test/builtin/test_debug_assert.mojo rename to mojo/stdlib/test/builtin/test_debug_assert.mojo diff --git a/stdlib/test/builtin/test_debug_assert_default_error.mojo b/mojo/stdlib/test/builtin/test_debug_assert_default_error.mojo similarity index 100% rename from stdlib/test/builtin/test_debug_assert_default_error.mojo rename to mojo/stdlib/test/builtin/test_debug_assert_default_error.mojo diff --git a/stdlib/test/builtin/test_debug_assert_mode_all.mojo b/mojo/stdlib/test/builtin/test_debug_assert_mode_all.mojo similarity index 100% rename from stdlib/test/builtin/test_debug_assert_mode_all.mojo rename to mojo/stdlib/test/builtin/test_debug_assert_mode_all.mojo diff --git a/stdlib/test/builtin/test_debug_assert_mode_all_error.mojo b/mojo/stdlib/test/builtin/test_debug_assert_mode_all_error.mojo similarity index 100% rename from stdlib/test/builtin/test_debug_assert_mode_all_error.mojo rename to mojo/stdlib/test/builtin/test_debug_assert_mode_all_error.mojo diff --git a/stdlib/test/builtin/test_debug_assert_mode_none.mojo b/mojo/stdlib/test/builtin/test_debug_assert_mode_none.mojo similarity index 100% rename from stdlib/test/builtin/test_debug_assert_mode_none.mojo rename to mojo/stdlib/test/builtin/test_debug_assert_mode_none.mojo diff --git a/stdlib/test/builtin/test_debug_assert_warning.mojo b/mojo/stdlib/test/builtin/test_debug_assert_warning.mojo similarity index 100% rename from stdlib/test/builtin/test_debug_assert_warning.mojo rename to mojo/stdlib/test/builtin/test_debug_assert_warning.mojo diff --git a/stdlib/test/builtin/test_deprecation_warnings.mojo b/mojo/stdlib/test/builtin/test_deprecation_warnings.mojo similarity index 100% rename from stdlib/test/builtin/test_deprecation_warnings.mojo rename to mojo/stdlib/test/builtin/test_deprecation_warnings.mojo diff --git a/stdlib/test/builtin/test_dtype.mojo b/mojo/stdlib/test/builtin/test_dtype.mojo similarity index 100% rename from stdlib/test/builtin/test_dtype.mojo rename to mojo/stdlib/test/builtin/test_dtype.mojo diff --git a/stdlib/test/builtin/test_error.mojo b/mojo/stdlib/test/builtin/test_error.mojo similarity index 100% rename from stdlib/test/builtin/test_error.mojo rename to mojo/stdlib/test/builtin/test_error.mojo diff --git a/stdlib/test/builtin/test_file.mojo b/mojo/stdlib/test/builtin/test_file.mojo similarity index 100% rename from stdlib/test/builtin/test_file.mojo rename to mojo/stdlib/test/builtin/test_file.mojo diff --git a/stdlib/test/builtin/test_file_dummy_input.txt b/mojo/stdlib/test/builtin/test_file_dummy_input.txt similarity index 100% rename from stdlib/test/builtin/test_file_dummy_input.txt rename to mojo/stdlib/test/builtin/test_file_dummy_input.txt diff --git a/stdlib/test/builtin/test_float_literal.mojo b/mojo/stdlib/test/builtin/test_float_literal.mojo similarity index 100% rename from stdlib/test/builtin/test_float_literal.mojo rename to mojo/stdlib/test/builtin/test_float_literal.mojo diff --git a/stdlib/test/builtin/test_format_float.mojo b/mojo/stdlib/test/builtin/test_format_float.mojo similarity index 100% rename from stdlib/test/builtin/test_format_float.mojo rename to mojo/stdlib/test/builtin/test_format_float.mojo diff --git a/stdlib/test/builtin/test_format_int.mojo b/mojo/stdlib/test/builtin/test_format_int.mojo similarity index 100% rename from stdlib/test/builtin/test_format_int.mojo rename to mojo/stdlib/test/builtin/test_format_int.mojo diff --git a/stdlib/test/builtin/test_int.mojo b/mojo/stdlib/test/builtin/test_int.mojo similarity index 100% rename from stdlib/test/builtin/test_int.mojo rename to mojo/stdlib/test/builtin/test_int.mojo diff --git a/stdlib/test/builtin/test_int_literal.mojo b/mojo/stdlib/test/builtin/test_int_literal.mojo similarity index 100% rename from stdlib/test/builtin/test_int_literal.mojo rename to mojo/stdlib/test/builtin/test_int_literal.mojo diff --git a/stdlib/test/builtin/test_issue_1004.mojo b/mojo/stdlib/test/builtin/test_issue_1004.mojo similarity index 100% rename from stdlib/test/builtin/test_issue_1004.mojo rename to mojo/stdlib/test/builtin/test_issue_1004.mojo diff --git a/stdlib/test/builtin/test_issue_1505.mojo b/mojo/stdlib/test/builtin/test_issue_1505.mojo similarity index 100% rename from stdlib/test/builtin/test_issue_1505.mojo rename to mojo/stdlib/test/builtin/test_issue_1505.mojo diff --git a/stdlib/test/builtin/test_issue_3908.mojo b/mojo/stdlib/test/builtin/test_issue_3908.mojo similarity index 100% rename from stdlib/test/builtin/test_issue_3908.mojo rename to mojo/stdlib/test/builtin/test_issue_3908.mojo diff --git a/stdlib/test/builtin/test_list_literal.mojo b/mojo/stdlib/test/builtin/test_list_literal.mojo similarity index 100% rename from stdlib/test/builtin/test_list_literal.mojo rename to mojo/stdlib/test/builtin/test_list_literal.mojo diff --git a/stdlib/test/builtin/test_location.mojo b/mojo/stdlib/test/builtin/test_location.mojo similarity index 100% rename from stdlib/test/builtin/test_location.mojo rename to mojo/stdlib/test/builtin/test_location.mojo diff --git a/stdlib/test/builtin/test_math.mojo b/mojo/stdlib/test/builtin/test_math.mojo similarity index 100% rename from stdlib/test/builtin/test_math.mojo rename to mojo/stdlib/test/builtin/test_math.mojo diff --git a/stdlib/test/builtin/test_none.mojo b/mojo/stdlib/test/builtin/test_none.mojo similarity index 100% rename from stdlib/test/builtin/test_none.mojo rename to mojo/stdlib/test/builtin/test_none.mojo diff --git a/stdlib/test/builtin/test_object.mojo b/mojo/stdlib/test/builtin/test_object.mojo similarity index 100% rename from stdlib/test/builtin/test_object.mojo rename to mojo/stdlib/test/builtin/test_object.mojo diff --git a/stdlib/test/builtin/test_print.mojo b/mojo/stdlib/test/builtin/test_print.mojo similarity index 100% rename from stdlib/test/builtin/test_print.mojo rename to mojo/stdlib/test/builtin/test_print.mojo diff --git a/stdlib/test/builtin/test_print_long_string.mojo b/mojo/stdlib/test/builtin/test_print_long_string.mojo similarity index 100% rename from stdlib/test/builtin/test_print_long_string.mojo rename to mojo/stdlib/test/builtin/test_print_long_string.mojo diff --git a/stdlib/test/builtin/test_print_stderr.mojo b/mojo/stdlib/test/builtin/test_print_stderr.mojo similarity index 100% rename from stdlib/test/builtin/test_print_stderr.mojo rename to mojo/stdlib/test/builtin/test_print_stderr.mojo diff --git a/stdlib/test/builtin/test_range.mojo b/mojo/stdlib/test/builtin/test_range.mojo similarity index 100% rename from stdlib/test/builtin/test_range.mojo rename to mojo/stdlib/test/builtin/test_range.mojo diff --git a/stdlib/test/builtin/test_range_out_of_bounds.mojo b/mojo/stdlib/test/builtin/test_range_out_of_bounds.mojo similarity index 100% rename from stdlib/test/builtin/test_range_out_of_bounds.mojo rename to mojo/stdlib/test/builtin/test_range_out_of_bounds.mojo diff --git a/stdlib/test/builtin/test_range_uint_reverse_range_bad.mojo b/mojo/stdlib/test/builtin/test_range_uint_reverse_range_bad.mojo similarity index 100% rename from stdlib/test/builtin/test_range_uint_reverse_range_bad.mojo rename to mojo/stdlib/test/builtin/test_range_uint_reverse_range_bad.mojo diff --git a/stdlib/test/builtin/test_rebind.mojo b/mojo/stdlib/test/builtin/test_rebind.mojo similarity index 100% rename from stdlib/test/builtin/test_rebind.mojo rename to mojo/stdlib/test/builtin/test_rebind.mojo diff --git a/stdlib/test/builtin/test_repr.mojo b/mojo/stdlib/test/builtin/test_repr.mojo similarity index 100% rename from stdlib/test/builtin/test_repr.mojo rename to mojo/stdlib/test/builtin/test_repr.mojo diff --git a/stdlib/test/builtin/test_reversed.mojo b/mojo/stdlib/test/builtin/test_reversed.mojo similarity index 100% rename from stdlib/test/builtin/test_reversed.mojo rename to mojo/stdlib/test/builtin/test_reversed.mojo diff --git a/stdlib/test/builtin/test_simd.mojo b/mojo/stdlib/test/builtin/test_simd.mojo similarity index 100% rename from stdlib/test/builtin/test_simd.mojo rename to mojo/stdlib/test/builtin/test_simd.mojo diff --git a/stdlib/test/builtin/test_slice.mojo b/mojo/stdlib/test/builtin/test_slice.mojo similarity index 100% rename from stdlib/test/builtin/test_slice.mojo rename to mojo/stdlib/test/builtin/test_slice.mojo diff --git a/stdlib/test/builtin/test_sort.mojo b/mojo/stdlib/test/builtin/test_sort.mojo similarity index 100% rename from stdlib/test/builtin/test_sort.mojo rename to mojo/stdlib/test/builtin/test_sort.mojo diff --git a/stdlib/test/builtin/test_sort_issue_1018.mojo b/mojo/stdlib/test/builtin/test_sort_issue_1018.mojo similarity index 100% rename from stdlib/test/builtin/test_sort_issue_1018.mojo rename to mojo/stdlib/test/builtin/test_sort_issue_1018.mojo diff --git a/stdlib/test/builtin/test_stdin.mojo b/mojo/stdlib/test/builtin/test_stdin.mojo similarity index 100% rename from stdlib/test/builtin/test_stdin.mojo rename to mojo/stdlib/test/builtin/test_stdin.mojo diff --git a/stdlib/test/builtin/test_str.mojo b/mojo/stdlib/test/builtin/test_str.mojo similarity index 100% rename from stdlib/test/builtin/test_str.mojo rename to mojo/stdlib/test/builtin/test_str.mojo diff --git a/stdlib/test/builtin/test_string_literal.mojo b/mojo/stdlib/test/builtin/test_string_literal.mojo similarity index 100% rename from stdlib/test/builtin/test_string_literal.mojo rename to mojo/stdlib/test/builtin/test_string_literal.mojo diff --git a/stdlib/test/builtin/test_swap.mojo b/mojo/stdlib/test/builtin/test_swap.mojo similarity index 100% rename from stdlib/test/builtin/test_swap.mojo rename to mojo/stdlib/test/builtin/test_swap.mojo diff --git a/stdlib/test/builtin/test_tuple.mojo b/mojo/stdlib/test/builtin/test_tuple.mojo similarity index 100% rename from stdlib/test/builtin/test_tuple.mojo rename to mojo/stdlib/test/builtin/test_tuple.mojo diff --git a/stdlib/test/builtin/test_uint.mojo b/mojo/stdlib/test/builtin/test_uint.mojo similarity index 100% rename from stdlib/test/builtin/test_uint.mojo rename to mojo/stdlib/test/builtin/test_uint.mojo diff --git a/stdlib/test/builtin/test_uint_error.mojo b/mojo/stdlib/test/builtin/test_uint_error.mojo similarity index 100% rename from stdlib/test/builtin/test_uint_error.mojo rename to mojo/stdlib/test/builtin/test_uint_error.mojo diff --git a/stdlib/test/collections/string/test_inlined_string.mojo b/mojo/stdlib/test/collections/string/test_inlined_string.mojo similarity index 100% rename from stdlib/test/collections/string/test_inlined_string.mojo rename to mojo/stdlib/test/collections/string/test_inlined_string.mojo diff --git a/stdlib/test/collections/string/test_string.mojo b/mojo/stdlib/test/collections/string/test_string.mojo similarity index 100% rename from stdlib/test/collections/string/test_string.mojo rename to mojo/stdlib/test/collections/string/test_string.mojo diff --git a/stdlib/test/collections/string/test_string_slice.mojo b/mojo/stdlib/test/collections/string/test_string_slice.mojo similarity index 100% rename from stdlib/test/collections/string/test_string_slice.mojo rename to mojo/stdlib/test/collections/string/test_string_slice.mojo diff --git a/stdlib/test/collections/string/test_unicode.mojo b/mojo/stdlib/test/collections/string/test_unicode.mojo similarity index 100% rename from stdlib/test/collections/string/test_unicode.mojo rename to mojo/stdlib/test/collections/string/test_unicode.mojo diff --git a/stdlib/test/collections/test_codepoint.mojo b/mojo/stdlib/test/collections/test_codepoint.mojo similarity index 100% rename from stdlib/test/collections/test_codepoint.mojo rename to mojo/stdlib/test/collections/test_codepoint.mojo diff --git a/stdlib/test/collections/test_counter.mojo b/mojo/stdlib/test/collections/test_counter.mojo similarity index 100% rename from stdlib/test/collections/test_counter.mojo rename to mojo/stdlib/test/collections/test_counter.mojo diff --git a/stdlib/test/collections/test_deque.mojo b/mojo/stdlib/test/collections/test_deque.mojo similarity index 100% rename from stdlib/test/collections/test_deque.mojo rename to mojo/stdlib/test/collections/test_deque.mojo diff --git a/stdlib/test/collections/test_dict.mojo b/mojo/stdlib/test/collections/test_dict.mojo similarity index 100% rename from stdlib/test/collections/test_dict.mojo rename to mojo/stdlib/test/collections/test_dict.mojo diff --git a/stdlib/test/collections/test_index_normalization.mojo b/mojo/stdlib/test/collections/test_index_normalization.mojo similarity index 100% rename from stdlib/test/collections/test_index_normalization.mojo rename to mojo/stdlib/test/collections/test_index_normalization.mojo diff --git a/stdlib/test/collections/test_inline_array.mojo b/mojo/stdlib/test/collections/test_inline_array.mojo similarity index 100% rename from stdlib/test/collections/test_inline_array.mojo rename to mojo/stdlib/test/collections/test_inline_array.mojo diff --git a/stdlib/test/collections/test_inline_list.mojo b/mojo/stdlib/test/collections/test_inline_list.mojo similarity index 100% rename from stdlib/test/collections/test_inline_list.mojo rename to mojo/stdlib/test/collections/test_inline_list.mojo diff --git a/stdlib/test/collections/test_interval.mojo b/mojo/stdlib/test/collections/test_interval.mojo similarity index 100% rename from stdlib/test/collections/test_interval.mojo rename to mojo/stdlib/test/collections/test_interval.mojo diff --git a/stdlib/test/collections/test_linked_list.mojo b/mojo/stdlib/test/collections/test_linked_list.mojo similarity index 100% rename from stdlib/test/collections/test_linked_list.mojo rename to mojo/stdlib/test/collections/test_linked_list.mojo diff --git a/stdlib/test/collections/test_list.mojo b/mojo/stdlib/test/collections/test_list.mojo similarity index 100% rename from stdlib/test/collections/test_list.mojo rename to mojo/stdlib/test/collections/test_list.mojo diff --git a/stdlib/test/collections/test_list_getitem_invalid_index.mojo b/mojo/stdlib/test/collections/test_list_getitem_invalid_index.mojo similarity index 100% rename from stdlib/test/collections/test_list_getitem_invalid_index.mojo rename to mojo/stdlib/test/collections/test_list_getitem_invalid_index.mojo diff --git a/stdlib/test/collections/test_optional.mojo b/mojo/stdlib/test/collections/test_optional.mojo similarity index 100% rename from stdlib/test/collections/test_optional.mojo rename to mojo/stdlib/test/collections/test_optional.mojo diff --git a/stdlib/test/collections/test_set.mojo b/mojo/stdlib/test/collections/test_set.mojo similarity index 100% rename from stdlib/test/collections/test_set.mojo rename to mojo/stdlib/test/collections/test_set.mojo diff --git a/stdlib/test/collections/test_vector.mojo b/mojo/stdlib/test/collections/test_vector.mojo similarity index 100% rename from stdlib/test/collections/test_vector.mojo rename to mojo/stdlib/test/collections/test_vector.mojo diff --git a/stdlib/test/hashlib/test_ahash.mojo b/mojo/stdlib/test/hashlib/test_ahash.mojo similarity index 100% rename from stdlib/test/hashlib/test_ahash.mojo rename to mojo/stdlib/test/hashlib/test_ahash.mojo diff --git a/stdlib/test/hashlib/test_hash.mojo b/mojo/stdlib/test/hashlib/test_hash.mojo similarity index 100% rename from stdlib/test/hashlib/test_hash.mojo rename to mojo/stdlib/test/hashlib/test_hash.mojo diff --git a/stdlib/test/hashlib/test_hasher.mojo b/mojo/stdlib/test/hashlib/test_hasher.mojo similarity index 100% rename from stdlib/test/hashlib/test_hasher.mojo rename to mojo/stdlib/test/hashlib/test_hasher.mojo diff --git a/stdlib/test/lit.cfg.py b/mojo/stdlib/test/lit.cfg.py similarity index 100% rename from stdlib/test/lit.cfg.py rename to mojo/stdlib/test/lit.cfg.py diff --git a/stdlib/test/memory/test_arc.mojo b/mojo/stdlib/test/memory/test_arc.mojo similarity index 100% rename from stdlib/test/memory/test_arc.mojo rename to mojo/stdlib/test/memory/test_arc.mojo diff --git a/stdlib/test/memory/test_bitcast.mojo b/mojo/stdlib/test/memory/test_bitcast.mojo similarity index 100% rename from stdlib/test/memory/test_bitcast.mojo rename to mojo/stdlib/test/memory/test_bitcast.mojo diff --git a/stdlib/test/memory/test_maybe_uninitialized.mojo b/mojo/stdlib/test/memory/test_maybe_uninitialized.mojo similarity index 100% rename from stdlib/test/memory/test_maybe_uninitialized.mojo rename to mojo/stdlib/test/memory/test_maybe_uninitialized.mojo diff --git a/stdlib/test/memory/test_memory.mojo b/mojo/stdlib/test/memory/test_memory.mojo similarity index 100% rename from stdlib/test/memory/test_memory.mojo rename to mojo/stdlib/test/memory/test_memory.mojo diff --git a/stdlib/test/memory/test_owned_pointer.mojo b/mojo/stdlib/test/memory/test_owned_pointer.mojo similarity index 100% rename from stdlib/test/memory/test_owned_pointer.mojo rename to mojo/stdlib/test/memory/test_owned_pointer.mojo diff --git a/stdlib/test/memory/test_reference.mojo b/mojo/stdlib/test/memory/test_reference.mojo similarity index 100% rename from stdlib/test/memory/test_reference.mojo rename to mojo/stdlib/test/memory/test_reference.mojo diff --git a/stdlib/test/memory/test_span.mojo b/mojo/stdlib/test/memory/test_span.mojo similarity index 100% rename from stdlib/test/memory/test_span.mojo rename to mojo/stdlib/test/memory/test_span.mojo diff --git a/stdlib/test/memory/test_unsafepointer.mojo b/mojo/stdlib/test/memory/test_unsafepointer.mojo similarity index 100% rename from stdlib/test/memory/test_unsafepointer.mojo rename to mojo/stdlib/test/memory/test_unsafepointer.mojo diff --git a/stdlib/test/os/path/test_basename.mojo b/mojo/stdlib/test/os/path/test_basename.mojo similarity index 100% rename from stdlib/test/os/path/test_basename.mojo rename to mojo/stdlib/test/os/path/test_basename.mojo diff --git a/stdlib/test/os/path/test_dirname.mojo b/mojo/stdlib/test/os/path/test_dirname.mojo similarity index 100% rename from stdlib/test/os/path/test_dirname.mojo rename to mojo/stdlib/test/os/path/test_dirname.mojo diff --git a/stdlib/test/os/path/test_exists.mojo b/mojo/stdlib/test/os/path/test_exists.mojo similarity index 100% rename from stdlib/test/os/path/test_exists.mojo rename to mojo/stdlib/test/os/path/test_exists.mojo diff --git a/stdlib/test/os/path/test_expanduser.mojo b/mojo/stdlib/test/os/path/test_expanduser.mojo similarity index 100% rename from stdlib/test/os/path/test_expanduser.mojo rename to mojo/stdlib/test/os/path/test_expanduser.mojo diff --git a/stdlib/test/os/path/test_expandvars.mojo b/mojo/stdlib/test/os/path/test_expandvars.mojo similarity index 100% rename from stdlib/test/os/path/test_expandvars.mojo rename to mojo/stdlib/test/os/path/test_expandvars.mojo diff --git a/stdlib/test/os/path/test_getsize.mojo b/mojo/stdlib/test/os/path/test_getsize.mojo similarity index 100% rename from stdlib/test/os/path/test_getsize.mojo rename to mojo/stdlib/test/os/path/test_getsize.mojo diff --git a/stdlib/test/os/path/test_isdir.mojo b/mojo/stdlib/test/os/path/test_isdir.mojo similarity index 100% rename from stdlib/test/os/path/test_isdir.mojo rename to mojo/stdlib/test/os/path/test_isdir.mojo diff --git a/stdlib/test/os/path/test_isfile.mojo b/mojo/stdlib/test/os/path/test_isfile.mojo similarity index 100% rename from stdlib/test/os/path/test_isfile.mojo rename to mojo/stdlib/test/os/path/test_isfile.mojo diff --git a/stdlib/test/os/path/test_islink.mojo b/mojo/stdlib/test/os/path/test_islink.mojo similarity index 100% rename from stdlib/test/os/path/test_islink.mojo rename to mojo/stdlib/test/os/path/test_islink.mojo diff --git a/stdlib/test/os/path/test_join.mojo b/mojo/stdlib/test/os/path/test_join.mojo similarity index 100% rename from stdlib/test/os/path/test_join.mojo rename to mojo/stdlib/test/os/path/test_join.mojo diff --git a/stdlib/test/os/path/test_split.mojo b/mojo/stdlib/test/os/path/test_split.mojo similarity index 100% rename from stdlib/test/os/path/test_split.mojo rename to mojo/stdlib/test/os/path/test_split.mojo diff --git a/stdlib/test/os/path/test_splitroot.mojo b/mojo/stdlib/test/os/path/test_splitroot.mojo similarity index 100% rename from stdlib/test/os/path/test_splitroot.mojo rename to mojo/stdlib/test/os/path/test_splitroot.mojo diff --git a/stdlib/test/os/test_atomic.mojo b/mojo/stdlib/test/os/test_atomic.mojo similarity index 100% rename from stdlib/test/os/test_atomic.mojo rename to mojo/stdlib/test/os/test_atomic.mojo diff --git a/stdlib/test/os/test_env.mojo b/mojo/stdlib/test/os/test_env.mojo similarity index 100% rename from stdlib/test/os/test_env.mojo rename to mojo/stdlib/test/os/test_env.mojo diff --git a/stdlib/test/os/test_listdir.mojo b/mojo/stdlib/test/os/test_listdir.mojo similarity index 100% rename from stdlib/test/os/test_listdir.mojo rename to mojo/stdlib/test/os/test_listdir.mojo diff --git a/stdlib/test/os/test_mkdir_and_rmdir.mojo b/mojo/stdlib/test/os/test_mkdir_and_rmdir.mojo similarity index 100% rename from stdlib/test/os/test_mkdir_and_rmdir.mojo rename to mojo/stdlib/test/os/test_mkdir_and_rmdir.mojo diff --git a/stdlib/test/os/test_no_trap.mojo b/mojo/stdlib/test/os/test_no_trap.mojo similarity index 100% rename from stdlib/test/os/test_no_trap.mojo rename to mojo/stdlib/test/os/test_no_trap.mojo diff --git a/stdlib/test/os/test_remove.mojo b/mojo/stdlib/test/os/test_remove.mojo similarity index 100% rename from stdlib/test/os/test_remove.mojo rename to mojo/stdlib/test/os/test_remove.mojo diff --git a/stdlib/test/os/test_stat.mojo b/mojo/stdlib/test/os/test_stat.mojo similarity index 100% rename from stdlib/test/os/test_stat.mojo rename to mojo/stdlib/test/os/test_stat.mojo diff --git a/stdlib/test/os/test_trap.mojo b/mojo/stdlib/test/os/test_trap.mojo similarity index 100% rename from stdlib/test/os/test_trap.mojo rename to mojo/stdlib/test/os/test_trap.mojo diff --git a/stdlib/test/os/test_trap_stringable.mojo b/mojo/stdlib/test/os/test_trap_stringable.mojo similarity index 100% rename from stdlib/test/os/test_trap_stringable.mojo rename to mojo/stdlib/test/os/test_trap_stringable.mojo diff --git a/stdlib/test/pathlib/test_pathlib.mojo b/mojo/stdlib/test/pathlib/test_pathlib.mojo similarity index 100% rename from stdlib/test/pathlib/test_pathlib.mojo rename to mojo/stdlib/test/pathlib/test_pathlib.mojo diff --git a/stdlib/test/pwd/test_pwd.mojo b/mojo/stdlib/test/pwd/test_pwd.mojo similarity index 100% rename from stdlib/test/pwd/test_pwd.mojo rename to mojo/stdlib/test/pwd/test_pwd.mojo diff --git a/stdlib/test/python/custom_indexable.py b/mojo/stdlib/test/python/custom_indexable.py similarity index 100% rename from stdlib/test/python/custom_indexable.py rename to mojo/stdlib/test/python/custom_indexable.py diff --git a/stdlib/test/python/module_for_test_python_object_dunder_contains.py b/mojo/stdlib/test/python/module_for_test_python_object_dunder_contains.py similarity index 100% rename from stdlib/test/python/module_for_test_python_object_dunder_contains.py rename to mojo/stdlib/test/python/module_for_test_python_object_dunder_contains.py diff --git a/stdlib/test/python/my_module.py b/mojo/stdlib/test/python/my_module.py similarity index 100% rename from stdlib/test/python/my_module.py rename to mojo/stdlib/test/python/my_module.py diff --git a/stdlib/test/python/test_ownership.mojo b/mojo/stdlib/test/python/test_ownership.mojo similarity index 100% rename from stdlib/test/python/test_ownership.mojo rename to mojo/stdlib/test/python/test_ownership.mojo diff --git a/stdlib/test/python/test_python_cpython.mojo b/mojo/stdlib/test/python/test_python_cpython.mojo similarity index 100% rename from stdlib/test/python/test_python_cpython.mojo rename to mojo/stdlib/test/python/test_python_cpython.mojo diff --git a/stdlib/test/python/test_python_error_handling.mojo b/mojo/stdlib/test/python/test_python_error_handling.mojo similarity index 100% rename from stdlib/test/python/test_python_error_handling.mojo rename to mojo/stdlib/test/python/test_python_error_handling.mojo diff --git a/stdlib/test/python/test_python_info.mojo b/mojo/stdlib/test/python/test_python_info.mojo similarity index 100% rename from stdlib/test/python/test_python_info.mojo rename to mojo/stdlib/test/python/test_python_info.mojo diff --git a/stdlib/test/python/test_python_interop.mojo b/mojo/stdlib/test/python/test_python_interop.mojo similarity index 100% rename from stdlib/test/python/test_python_interop.mojo rename to mojo/stdlib/test/python/test_python_interop.mojo diff --git a/stdlib/test/python/test_python_module_create.mojo b/mojo/stdlib/test/python/test_python_module_create.mojo similarity index 100% rename from stdlib/test/python/test_python_module_create.mojo rename to mojo/stdlib/test/python/test_python_module_create.mojo diff --git a/stdlib/test/python/test_python_object.mojo b/mojo/stdlib/test/python/test_python_object.mojo similarity index 100% rename from stdlib/test/python/test_python_object.mojo rename to mojo/stdlib/test/python/test_python_object.mojo diff --git a/stdlib/test/python/test_python_object_dunder_contains.mojo b/mojo/stdlib/test/python/test_python_object_dunder_contains.mojo similarity index 100% rename from stdlib/test/python/test_python_object_dunder_contains.mojo rename to mojo/stdlib/test/python/test_python_object_dunder_contains.mojo diff --git a/stdlib/test/python/test_python_object_len_raises.mojo b/mojo/stdlib/test/python/test_python_object_len_raises.mojo similarity index 100% rename from stdlib/test/python/test_python_object_len_raises.mojo rename to mojo/stdlib/test/python/test_python_object_len_raises.mojo diff --git a/stdlib/test/python/test_python_to_mojo.mojo b/mojo/stdlib/test/python/test_python_to_mojo.mojo similarity index 100% rename from stdlib/test/python/test_python_to_mojo.mojo rename to mojo/stdlib/test/python/test_python_to_mojo.mojo diff --git a/stdlib/test/random/test_random.mojo b/mojo/stdlib/test/random/test_random.mojo similarity index 100% rename from stdlib/test/random/test_random.mojo rename to mojo/stdlib/test/random/test_random.mojo diff --git a/stdlib/test/sys/test_aarch64_target.mojo b/mojo/stdlib/test/sys/test_aarch64_target.mojo similarity index 100% rename from stdlib/test/sys/test_aarch64_target.mojo rename to mojo/stdlib/test/sys/test_aarch64_target.mojo diff --git a/stdlib/test/sys/test_build_info_debug.mojo b/mojo/stdlib/test/sys/test_build_info_debug.mojo similarity index 100% rename from stdlib/test/sys/test_build_info_debug.mojo rename to mojo/stdlib/test/sys/test_build_info_debug.mojo diff --git a/stdlib/test/sys/test_c_types.mojo b/mojo/stdlib/test/sys/test_c_types.mojo similarity index 100% rename from stdlib/test/sys/test_c_types.mojo rename to mojo/stdlib/test/sys/test_c_types.mojo diff --git a/stdlib/test/sys/test_compile.mojo b/mojo/stdlib/test/sys/test_compile.mojo similarity index 100% rename from stdlib/test/sys/test_compile.mojo rename to mojo/stdlib/test/sys/test_compile.mojo diff --git a/stdlib/test/sys/test_compile_debug.mojo b/mojo/stdlib/test/sys/test_compile_debug.mojo similarity index 100% rename from stdlib/test/sys/test_compile_debug.mojo rename to mojo/stdlib/test/sys/test_compile_debug.mojo diff --git a/stdlib/test/sys/test_dlhandle.mojo b/mojo/stdlib/test/sys/test_dlhandle.mojo similarity index 100% rename from stdlib/test/sys/test_dlhandle.mojo rename to mojo/stdlib/test/sys/test_dlhandle.mojo diff --git a/stdlib/test/sys/test_exit_0.mojo b/mojo/stdlib/test/sys/test_exit_0.mojo similarity index 100% rename from stdlib/test/sys/test_exit_0.mojo rename to mojo/stdlib/test/sys/test_exit_0.mojo diff --git a/stdlib/test/sys/test_exit_1.mojo b/mojo/stdlib/test/sys/test_exit_1.mojo similarity index 100% rename from stdlib/test/sys/test_exit_1.mojo rename to mojo/stdlib/test/sys/test_exit_1.mojo diff --git a/stdlib/test/sys/test_intrinsics.mojo b/mojo/stdlib/test/sys/test_intrinsics.mojo similarity index 100% rename from stdlib/test/sys/test_intrinsics.mojo rename to mojo/stdlib/test/sys/test_intrinsics.mojo diff --git a/stdlib/test/sys/test_invalid_paramenv.mojo b/mojo/stdlib/test/sys/test_invalid_paramenv.mojo similarity index 100% rename from stdlib/test/sys/test_invalid_paramenv.mojo rename to mojo/stdlib/test/sys/test_invalid_paramenv.mojo diff --git a/stdlib/test/sys/test_linux_target.mojo b/mojo/stdlib/test/sys/test_linux_target.mojo similarity index 100% rename from stdlib/test/sys/test_linux_target.mojo rename to mojo/stdlib/test/sys/test_linux_target.mojo diff --git a/stdlib/test/sys/test_macos_target.mojo b/mojo/stdlib/test/sys/test_macos_target.mojo similarity index 100% rename from stdlib/test/sys/test_macos_target.mojo rename to mojo/stdlib/test/sys/test_macos_target.mojo diff --git a/stdlib/test/sys/test_paramenv.mojo b/mojo/stdlib/test/sys/test_paramenv.mojo similarity index 100% rename from stdlib/test/sys/test_paramenv.mojo rename to mojo/stdlib/test/sys/test_paramenv.mojo diff --git a/stdlib/test/sys/test_sizeof.mojo b/mojo/stdlib/test/sys/test_sizeof.mojo similarity index 100% rename from stdlib/test/sys/test_sizeof.mojo rename to mojo/stdlib/test/sys/test_sizeof.mojo diff --git a/stdlib/test/sys/test_targetinfo.mojo b/mojo/stdlib/test/sys/test_targetinfo.mojo similarity index 100% rename from stdlib/test/sys/test_targetinfo.mojo rename to mojo/stdlib/test/sys/test_targetinfo.mojo diff --git a/stdlib/test/sys/test_windows_target.mojo b/mojo/stdlib/test/sys/test_windows_target.mojo similarity index 100% rename from stdlib/test/sys/test_windows_target.mojo rename to mojo/stdlib/test/sys/test_windows_target.mojo diff --git a/stdlib/test/tempfile/test_tempfile.mojo b/mojo/stdlib/test/tempfile/test_tempfile.mojo similarity index 100% rename from stdlib/test/tempfile/test_tempfile.mojo rename to mojo/stdlib/test/tempfile/test_tempfile.mojo diff --git a/stdlib/test/test_utils/__init__.mojo b/mojo/stdlib/test/test_utils/__init__.mojo similarity index 100% rename from stdlib/test/test_utils/__init__.mojo rename to mojo/stdlib/test/test_utils/__init__.mojo diff --git a/stdlib/test/test_utils/test_utils.mojo b/mojo/stdlib/test/test_utils/test_utils.mojo similarity index 100% rename from stdlib/test/test_utils/test_utils.mojo rename to mojo/stdlib/test/test_utils/test_utils.mojo diff --git a/stdlib/test/test_utils/types.mojo b/mojo/stdlib/test/test_utils/types.mojo similarity index 100% rename from stdlib/test/test_utils/types.mojo rename to mojo/stdlib/test/test_utils/types.mojo diff --git a/stdlib/test/testing/test_assert_raises.mojo b/mojo/stdlib/test/testing/test_assert_raises.mojo similarity index 100% rename from stdlib/test/testing/test_assert_raises.mojo rename to mojo/stdlib/test/testing/test_assert_raises.mojo diff --git a/stdlib/test/testing/test_assertion.mojo b/mojo/stdlib/test/testing/test_assertion.mojo similarity index 100% rename from stdlib/test/testing/test_assertion.mojo rename to mojo/stdlib/test/testing/test_assertion.mojo diff --git a/stdlib/test/time/test_time.mojo b/mojo/stdlib/test/time/test_time.mojo similarity index 100% rename from stdlib/test/time/test_time.mojo rename to mojo/stdlib/test/time/test_time.mojo diff --git a/stdlib/test/utils/issue_13632.mojo b/mojo/stdlib/test/utils/issue_13632.mojo similarity index 100% rename from stdlib/test/utils/issue_13632.mojo rename to mojo/stdlib/test/utils/issue_13632.mojo diff --git a/stdlib/test/utils/test_index.mojo b/mojo/stdlib/test/utils/test_index.mojo similarity index 100% rename from stdlib/test/utils/test_index.mojo rename to mojo/stdlib/test/utils/test_index.mojo diff --git a/stdlib/test/utils/test_numerics.mojo b/mojo/stdlib/test/utils/test_numerics.mojo similarity index 100% rename from stdlib/test/utils/test_numerics.mojo rename to mojo/stdlib/test/utils/test_numerics.mojo diff --git a/stdlib/test/utils/test_select.mojo b/mojo/stdlib/test/utils/test_select.mojo similarity index 100% rename from stdlib/test/utils/test_select.mojo rename to mojo/stdlib/test/utils/test_select.mojo diff --git a/stdlib/test/utils/test_static_tuple.mojo b/mojo/stdlib/test/utils/test_static_tuple.mojo similarity index 100% rename from stdlib/test/utils/test_static_tuple.mojo rename to mojo/stdlib/test/utils/test_static_tuple.mojo diff --git a/stdlib/test/utils/test_tuple.mojo b/mojo/stdlib/test/utils/test_tuple.mojo similarity index 100% rename from stdlib/test/utils/test_tuple.mojo rename to mojo/stdlib/test/utils/test_tuple.mojo diff --git a/stdlib/test/utils/test_unroll.mojo b/mojo/stdlib/test/utils/test_unroll.mojo similarity index 100% rename from stdlib/test/utils/test_unroll.mojo rename to mojo/stdlib/test/utils/test_unroll.mojo diff --git a/stdlib/test/utils/test_variant.mojo b/mojo/stdlib/test/utils/test_variant.mojo similarity index 100% rename from stdlib/test/utils/test_variant.mojo rename to mojo/stdlib/test/utils/test_variant.mojo diff --git a/stdlib/test/utils/test_write.mojo b/mojo/stdlib/test/utils/test_write.mojo similarity index 100% rename from stdlib/test/utils/test_write.mojo rename to mojo/stdlib/test/utils/test_write.mojo diff --git a/stdlib/test/utils/test_write_to_stdout.mojo b/mojo/stdlib/test/utils/test_write_to_stdout.mojo similarity index 100% rename from stdlib/test/utils/test_write_to_stdout.mojo rename to mojo/stdlib/test/utils/test_write_to_stdout.mojo diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..46c3124e43 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[tool.black] +include = '\.pyi?$' +line-length = 80 +preview = true +fast = true + +[tool.pyright] +typeCheckingMode = "off" +reportMissingImports = false + +[project] +requires-python = ">=3.8" +name = "max-repo" + diff --git a/src/max/Dockerfile.cpu b/src/max/Dockerfile.cpu new file mode 100644 index 0000000000..08395e8a21 --- /dev/null +++ b/src/max/Dockerfile.cpu @@ -0,0 +1,46 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# This is an example of how to run max-pipelines serve in a docker container. + +# Create a build image to download depedencies +FROM ghcr.io/modular/magic:latest AS production + +RUN apt-get update && apt-get install -y --no-install-recommends build-essential git + +COPY . /app +WORKDIR /app + +RUN magic install + +EXPOSE 8000 + +# TODO: Add HEALTHCHECK instruction +# HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD curl --fail http://localhost:8000/health || exit 1 + +LABEL maintainer "Modular Inc " + +ENV PYTHONUNBUFFERED=1 +# suppress transformers logging +ENV TRANSFORMERS_VERBOSITY="critical" +ENV TRANSFORMERS_NO_ADVISORY_WARNINGS=1 +ENV MODULAR_STRUCTURED_LOGGING=1 +ENV PROMETHEUS_MULTIPROC_DIR=/tmp + +# OTEL configuration +ENV OTEL_SERVICE_NAME="max-serve" +# OTEL's default histogram bucktes have poor resolution. Prefer exponential histograms. +ENV OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION="base2_exponential_bucket_histogram" + +ENTRYPOINT ["magic", "run", "serve"] +CMD ["--model-path=modularai/Llama-3.1-8B-Instruct-GGUF"] diff --git a/src/max/Dockerfile.cuda-simple b/src/max/Dockerfile.cuda-simple new file mode 100644 index 0000000000..eb288f8e29 --- /dev/null +++ b/src/max/Dockerfile.cuda-simple @@ -0,0 +1,50 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# This is a simplified Dockerfile that just runs the max-pipelines serve command +# targeting a CUDA-enabled image. This build includes magic and build tools +# in the production image. + +ARG CUDA_VERSION=12.6.0 + +# Create a build image to download depedencies +FROM ghcr.io/modular/magic:noble-cuda-${CUDA_VERSION} AS production + +RUN apt-get update && apt-get install -y --no-install-recommends build-essential git + +COPY . /app +WORKDIR /app + +RUN magic install + +EXPOSE 8000 + +# TODO: Add HEALTHCHECK instruction +# HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD curl --fail http://localhost:8000/health || exit 1 + +LABEL maintainer "Modular Inc " + +ENV PYTHONUNBUFFERED=1 +# suppress transformers logging +ENV TRANSFORMERS_VERBOSITY="critical" +ENV TRANSFORMERS_NO_ADVISORY_WARNINGS=1 +ENV MODULAR_STRUCTURED_LOGGING=1 +ENV PROMETHEUS_MULTIPROC_DIR=/tmp + +# OTEL configuration +ENV OTEL_SERVICE_NAME="max-serve" +# OTEL's default histogram bucktes have poor resolution. Prefer exponential histograms. +ENV OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION="base2_exponential_bucket_histogram" + +ENTRYPOINT ["magic", "run", "serve"] +CMD ["--model-path=modularai/Llama-3.1-8B-Instruct-GGUF"] diff --git a/src/max/Dockerfile.cuda-small b/src/max/Dockerfile.cuda-small new file mode 100644 index 0000000000..ac53dbdbf5 --- /dev/null +++ b/src/max/Dockerfile.cuda-small @@ -0,0 +1,63 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# This build avoids having magic and build dependencies in the production image +# targeting a CUDA-enabled image. It optimizes for size over customizability by +# not including build tools in the production image. + +ARG CUDA_VERSION=12.6.0 +ARG BASE_IMAGE=nvidia/cuda:{CUDA_VERSION}-base-ubuntu24.04 + +# Create a build image to download depedencies +FROM ghcr.io/modular/magic:noble AS build + +RUN apt-get update && apt-get install -y --no-install-recommends build-essential git + +COPY . /app +WORKDIR /app + +RUN magic install + +# Create the shell-hook bash script to activate the environment +RUN magic shell-hook > /shell-hook.sh +RUN echo 'python -m max.entrypoints.pipelines serve "$@"' >> /shell-hook.sh + +# Create the production image +FROM ${BASE_IMAGE} AS production + +COPY --from=build /app/.magic/envs/default /app/.magic/envs/default +COPY --from=build /shell-hook.sh /shellhook.sh +COPY . /app + +WORKDIR /app +EXPOSE 8000 + +# TODO: Add HEALTHCHECK instruction +# HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD curl --fail http://localhost:8000/health || exit 1 + +LABEL maintainer "Modular Inc " + +ENV PYTHONUNBUFFERED=1 +# suppress transformers logging +ENV TRANSFORMERS_VERBOSITY="critical" +ENV TRANSFORMERS_NO_ADVISORY_WARNINGS=1 +ENV MODULAR_STRUCTURED_LOGGING=1 +ENV PROMETHEUS_MULTIPROC_DIR=/tmp + +# OTEL configuration +ENV OTEL_SERVICE_NAME="max-serve" +# OTEL's default histogram bucktes have poor resolution. Prefer exponential histograms. +ENV OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION="base2_exponential_bucket_histogram" + +ENTRYPOINT ["/bin/bash", "/shell-hook.sh"] +CMD ["--model-path=modularai/Llama-3.1-8B-Instruct-GGUF"] diff --git a/src/max/README.md b/src/max/README.md new file mode 100644 index 0000000000..5a27ab75da --- /dev/null +++ b/src/max/README.md @@ -0,0 +1,41 @@ +# MAX Pipelines + +These are end-to-end pipelines that demonstrate the power of +[MAX](https://docs.modular.com/max/) for accelerating common AI workloads, and +more. Each of the supported pipelines can be served via an OpenAI-compatible +endpoint. + +MAX can also serve most PyTorch-based large language models that are +present on Hugging Face, although not at the same performance as native MAX +Graph versions. + +## Usage + +The easiest way to try out any of the pipelines is with our Magic command-line +tool. + +1. Install Magic on macOS and Linux with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Install max-pipelines command to run the pipelines. + + ```shell + magic global install max-pipelines + ``` + +3. Serve a model. + + ```shell + max-pipelines serve --model-path deepseek-ai/DeepSeek-R1-Distill-Llama-8B + ``` + +See [https://builds.modular.com/](https://builds.modular.com/) to discover many +of the models supported by MAX. diff --git a/src/max/entrypoints/cli/__init__.py b/src/max/entrypoints/cli/__init__.py new file mode 100644 index 0000000000..cb55ab269b --- /dev/null +++ b/src/max/entrypoints/cli/__init__.py @@ -0,0 +1,51 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Pipeline cli utilities.""" + +from .config import ( + config_to_flag, + get_default, + get_field_type, + is_flag, + is_multiple, + is_optional, + pipeline_config_options, + validate_field_type, +) +from .device_options import DevicesOptionType +from .encode import pipeline_encode +from .generate import generate_text_for_pipeline, stream_text_to_console +from .list import list_pipelines_to_console, list_pipelines_to_json +from .metrics import TextGenerationMetrics +from .serve import serve_pipeline + +__all__ = [ + "DevicesOptionType", + "TextGenerationMetrics", + "config_to_flag", + "pipeline_config_options", + "serve_pipeline", + "generate_text_for_pipeline", + "stream_text_to_console", + "list_pipelines_to_console", + "list_pipelines_to_json", + "pipeline_encode", + "get_default", + "get_field_type", + "is_flag", + "is_multiple", + "is_optional", + "validate_field_type", +] diff --git a/src/max/entrypoints/cli/config.py b/src/max/entrypoints/cli/config.py new file mode 100644 index 0000000000..c303a0d4a5 --- /dev/null +++ b/src/max/entrypoints/cli/config.py @@ -0,0 +1,202 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Utilities for working with Config objects in Click.""" + +from __future__ import annotations + +import functools +import inspect +import pathlib +from dataclasses import MISSING, Field, fields +from enum import Enum +from pathlib import Path +from typing import Any, Union, get_args, get_origin, get_type_hints + +import click +from max.driver import DeviceSpec +from max.pipelines import PipelineConfig + +from .device_options import DevicesOptionType + +VALID_CONFIG_TYPES = [str, bool, Enum, Path, DeviceSpec, int, float] + + +def get_interior_type(type_hint: Union[type, str, Any]) -> type[Any]: + interior_args = set(get_args(type_hint)) - set([type(None)]) + if len(interior_args) > 1: + msg = ( + "Parsing does not currently supported Union type, with more than" + " one non-None type: {type_hint}" + ) + raise ValueError(msg) + + return get_args(type_hint)[0] + + +def is_optional(type_hint: Union[type, str, Any]) -> bool: + return get_origin(type_hint) is Union and type(None) in get_args(type_hint) + + +def is_flag(field_type: Any) -> bool: + return field_type is bool + + +def validate_field_type(field_type: Any) -> bool: + if is_optional(field_type): + test_type = get_args(field_type)[0] + elif get_origin(field_type) is list: + test_type = get_interior_type(field_type) + else: + test_type = field_type + + for valid_type in VALID_CONFIG_TYPES: + if valid_type == test_type: + return True + + if get_origin(valid_type) is None and inspect.isclass(test_type): + if issubclass(test_type, valid_type): + return True + msg = f"type '{test_type}' not supported in config." + raise ValueError(msg) + + +def get_field_type(field_type: Any): + validate_field_type(field_type) + + # Get underlying core field type, is Optional or list. + if is_optional(field_type): + field_type = get_interior_type(field_type) + elif get_origin(field_type) is list: + field_type = get_interior_type(field_type) + + # Update the field_type to be format specific. + if field_type == Path: + field_type = click.Path(path_type=pathlib.Path) + elif inspect.isclass(field_type): + if issubclass(field_type, Enum): + field_type = click.Choice(list(field_type)) + + return field_type + + +def get_default(dataclass_field: Field) -> Any: + if dataclass_field.default_factory != MISSING: + default = dataclass_field.default_factory() + elif dataclass_field.default != MISSING: + default = dataclass_field.default + else: + default = None + + return default + + +def is_multiple(field_type: Any) -> bool: + return get_origin(field_type) is list + + +def create_click_option( + help_for_fields: dict[str, str], + dataclass_field: Field, + field_type: Any, +) -> click.option: # type: ignore + # Get name. + normalized_name = dataclass_field.name.lower().replace("_", "-") + + # Get Help text. + help_text = help_for_fields.get(dataclass_field.name, None) + + # Get help field. + return click.option( + f"--{normalized_name}", + show_default=True, + help=help_text, + is_flag=is_flag(field_type), + default=get_default(dataclass_field), + multiple=is_multiple(field_type), + type=get_field_type(field_type), + ) + + +def config_to_flag(cls): + options = [] + if hasattr(cls, "help"): + help_text = cls.help() + else: + help_text = {} + field_types = get_type_hints(cls) + for _field in fields(cls): + # Skip private config fields. + # We also skip device_specs as it should not be used directly via the CLI entrypoint. + if _field.name.startswith("_") or _field.name == "device_specs": + continue + + new_option = create_click_option( + help_text, _field, field_types[_field.name] + ) + options.append(new_option) + + def apply_flags(func): + for option in reversed(options): + func = option(func) # type: ignore + return func + + return apply_flags + + +def pipeline_config_options(func): + @config_to_flag(PipelineConfig) + @click.option( + "--devices", + is_flag=False, + type=DevicesOptionType(), + show_default=False, + default="", + flag_value="0", + help=( + "Whether to run the model on CPU (--devices=cpu), GPU (--devices=gpu)" + " or a list of GPUs (--devices=gpu:0,1) etc. An ID value can be" + " provided optionally to indicate the device ID to target. If not" + " provided, the model will run on the first available GPU (--devices=gpu)," + " or CPU if no GPUs are available (--devices=cpu)." + ), + ) + # Kept for backwards compatibility. + @click.option( + "--use-gpu", + is_flag=False, + type=DevicesOptionType(), + show_default=False, + default="", + flag_value="0", + help=( + "Whether to run the model on the available GPU. An ID value can be" + " provided optionally to indicate the device ID to target." + ), + ) + @functools.wraps(func) + def wrapper(*args, **kwargs): + # Remove the options from kwargs and replace with unified device_specs. + devices: str | list[int] = kwargs.pop("devices") + legacy_use_gpu = kwargs.pop("use_gpu", None) + + # Apply legacy flag if no modern devices specified. + if not devices and legacy_use_gpu: + devices = legacy_use_gpu + + kwargs["device_specs"] = DevicesOptionType.device_specs(devices) + + return func(*args, **kwargs) + + return wrapper diff --git a/src/max/entrypoints/cli/device_options.py b/src/max/entrypoints/cli/device_options.py new file mode 100644 index 0000000000..ce14d9a8fe --- /dev/null +++ b/src/max/entrypoints/cli/device_options.py @@ -0,0 +1,90 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Custom Click Options used in pipelines""" + +from __future__ import annotations + +from typing import Any + +import click +from max.driver import DeviceSpec, accelerator_count + + +class DevicesOptionType(click.ParamType): + name = "devices" + + @staticmethod + def device_specs(devices: str | list[int]) -> list[DeviceSpec]: + """Converts parsed devices input into validated :obj:`DeviceSpec` objects. + + Args: + devices: The value provided by the --devices option. + Valid arguments: + - "cpu" → use the CPU, + - "gpu" → default to GPU 0, or, + - a list of ints (GPU IDs). + + Raises: + ValueError: If a requested GPU ID is invalid. + + Returns: + A list of DeviceSpec objects. + """ + num_available_gpus = accelerator_count() + if devices == "cpu" or num_available_gpus == 0: + return [DeviceSpec.cpu()] + + requested_ids: list[int] = [] + if devices == "gpu": + requested_ids = [0] + elif isinstance(devices, list): + requested_ids = devices + + if not requested_ids: + # Return device 0 when no specific IDs are requested. + return [DeviceSpec.accelerator(id=0)] + + # Validate requested GPU IDs. + for gpu_id in requested_ids: + if gpu_id >= num_available_gpus: + msg = ( + f"GPU {gpu_id} requested but only {num_available_gpus} " + "available. Use valid device IDs or '--devices=cpu'." + ) + raise ValueError(msg) + + return [DeviceSpec.accelerator(id=id) for id in requested_ids] + + def convert( + self, + value: Any, + param: click.Parameter | None = None, + ctx: click.Context | None = None, + ) -> str | list[int]: + if not value: + return [] + + if value.lower() in {"cpu", "gpu"}: + return value.lower() + + try: + # Support both "gpu:0,1" and old "0,1" formats. + return [int(part) for part in value.replace("gpu:", "").split(",")] + except ValueError: + self.fail( + f"'{value}' is not a valid device list. Use format 'cpu', 'gpu', or 'gpu:0,1'.", + param, + ctx, + ) diff --git a/src/max/entrypoints/cli/encode.py b/src/max/entrypoints/cli/encode.py new file mode 100644 index 0000000000..42f662f106 --- /dev/null +++ b/src/max/entrypoints/cli/encode.py @@ -0,0 +1,97 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Utilities for encoding text in the cli.""" + +import asyncio +import logging +import uuid +from typing import Optional + +from max.pipelines import ( + PIPELINE_REGISTRY, + EmbeddingsGenerator, + EmbeddingsResponse, + PipelineConfig, +) +from max.pipelines.interfaces import ( + PipelineTask, + PipelineTokenizer, + TokenGeneratorRequest, +) + +from .metrics import EmbeddingsMetrics + +logger = logging.getLogger(__name__) + +MODEL_NAME = "model" + + +async def _run_pipeline_encode( + pipeline: EmbeddingsGenerator, + tokenizer: PipelineTokenizer, + prompt: str, + metrics: Optional[EmbeddingsMetrics] = None, +) -> EmbeddingsResponse: + req_id = str(uuid.uuid4()) + context = await tokenizer.new_context( + TokenGeneratorRequest( + id=req_id, + index=0, + prompt=prompt, + model_name=MODEL_NAME, + ) + ) + pipeline_request = {req_id: context} + + if metrics: + metrics.prompt_size = context.current_length + metrics.signpost("begin_encoding") + + response = pipeline.encode(pipeline_request) + + if metrics: + metrics.signpost("end_encoding") + return response[req_id] + + +def pipeline_encode( + pipeline_config: PipelineConfig, + prompt: str, + num_warmups: int = 0, +) -> None: + # Run timed run & print results. + with EmbeddingsMetrics(print_report=True) as metrics: + tokenizer, pipeline = PIPELINE_REGISTRY.retrieve( + pipeline_config, task=PipelineTask.EMBEDDINGS_GENERATION + ) + assert isinstance(pipeline, EmbeddingsGenerator) + + if num_warmups > 0: + logger.info("Running warmup") + for _ in range(num_warmups): + asyncio.run( + _run_pipeline_encode( + pipeline, tokenizer, prompt, metrics=None + ) + ) + + # Run and print results. + logger.info("Running model...") + print("Encoding:", prompt) + + pipeline_output = asyncio.run( + _run_pipeline_encode(pipeline, tokenizer, prompt, metrics=metrics) + ) + print("Embeddings:", pipeline_output.embeddings) diff --git a/src/max/entrypoints/cli/entrypoint.py b/src/max/entrypoints/cli/entrypoint.py new file mode 100644 index 0000000000..972028a959 --- /dev/null +++ b/src/max/entrypoints/cli/entrypoint.py @@ -0,0 +1,34 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Entrypoint for generalized click cli.""" + +import click + + +class ModelGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + supported = ", ".join(self.list_commands(ctx)) + ctx.fail( + f"Command not supported: {cmd_name}\nSupported commands:" + f" {supported}" + ) + + +@click.command(cls=ModelGroup) +def run_cli(): + pass diff --git a/src/max/entrypoints/cli/generate.py b/src/max/entrypoints/cli/generate.py new file mode 100644 index 0000000000..97718673a8 --- /dev/null +++ b/src/max/entrypoints/cli/generate.py @@ -0,0 +1,156 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Utilities for generating text in the cli.""" + +from __future__ import annotations + +import asyncio +import logging +import uuid +from collections.abc import Iterable +from typing import Optional + +import requests +from max.pipelines import ( + PIPELINE_REGISTRY, + PipelineConfig, +) +from max.pipelines.interfaces import ( + PipelineTokenizer, + TokenGenerator, + TokenGeneratorRequest, +) + +from .metrics import TextGenerationMetrics + +logger = logging.getLogger(__name__) + +MODEL_NAME = "model" + + +async def stream_text_to_console( + pipeline: TokenGenerator, + tokenizer: PipelineTokenizer, + prompt: str, + images: Optional[list[bytes]], + num_steps: int, + metrics: Optional[TextGenerationMetrics] = None, + print_tokens: bool = True, +) -> None: + req_id = str(uuid.uuid4()) + context = await tokenizer.new_context( + TokenGeneratorRequest( + id=req_id, + index=0, + prompt=prompt, + images=images, + model_name=MODEL_NAME, + ) + ) + pipeline_request = {req_id: context} + if print_tokens: + print(prompt, end="", flush=True) + + prompt_size = context.current_length + if metrics: + metrics.prompt_size = prompt_size + metrics.signpost("begin_generation") + + try: + first_token = True + generate_again = True + while generate_again: + responses = pipeline.next_token( + pipeline_request, + num_steps=num_steps, + ) + + for response in responses: + if req_id not in response: + # next_token is expected to omit the return if + # it encounters eos. + generate_again = False + break + + encoded_text = response[req_id].next_token + response_text = await tokenizer.decode(context, encoded_text) + if metrics: + if first_token: + first_token = False + metrics.signpost("first_token") + metrics.new_token() + if print_tokens: + print(response_text, end="", flush=True) + + # Yield to the event loop. If at no other point (e.g. + # tokenizer.decode which we await earlier does not yield to the + # event loop), it will be at this point that we'll receive a + # CancelledError if our future was canceled (e.g., we received a + # SIGINT). + await asyncio.sleep(0) + + finally: + if metrics: + metrics.signpost("end_generation") + + pipeline.release(context) + + if print_tokens: + print() + + +def generate_text_for_pipeline( + pipeline_config: PipelineConfig, + prompt: str, + image_urls: Iterable[str] = (), + num_warmups: int = 0, +) -> None: + # Run timed run & print results. + with TextGenerationMetrics(print_report=True) as metrics: + tokenizer, pipeline = PIPELINE_REGISTRY.retrieve(pipeline_config) + assert isinstance(pipeline, TokenGenerator) + if image_urls: + logger.info("Downloading images") + images = [requests.get(url).content for url in image_urls] + else: + images = None + + if num_warmups > 0: + logger.info("Running warmup") + for _ in range(num_warmups): + asyncio.run( + stream_text_to_console( + pipeline, + tokenizer, + prompt, + images, + num_steps=pipeline_config.max_num_steps, + metrics=None, + print_tokens=False, + ) + ) + + # Run and print results. + logger.info("Beginning text generation") + asyncio.run( + stream_text_to_console( + pipeline, + tokenizer, + prompt, + images, + num_steps=pipeline_config.max_num_steps, + metrics=metrics, + print_tokens=True, + ) + ) diff --git a/src/max/entrypoints/cli/list.py b/src/max/entrypoints/cli/list.py new file mode 100644 index 0000000000..e844a95fc0 --- /dev/null +++ b/src/max/entrypoints/cli/list.py @@ -0,0 +1,64 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# ===----------------------------------------------------------------------=== # +# +# This file is Modular Inc proprietary. +# +# ===----------------------------------------------------------------------=== # + +"""Utilities for exploring supported pipelines.""" + +import json + +from max.pipelines import PIPELINE_REGISTRY + + +def list_pipelines_to_console(): + print() + # Print human readable format + for arch in PIPELINE_REGISTRY.architectures.values(): + print() + print(f" Architecture: {arch.name}") + print() + print(" Example Huggingface Repo Ids: ") + for repo_id in arch.example_repo_ids: + print(f" {repo_id}") + + print() + for ( + encoding_name, + kv_cache_strategies, + ) in arch.supported_encodings.items(): + print( + f" Encoding Supported: {encoding_name}, with Cache Strategies: {kv_cache_strategies}" + ) + + print() + + +def list_pipelines_to_json(): + """Print the list of pipelines architecture options in JSON format.""" + architectures = {} + for arch in PIPELINE_REGISTRY.architectures.values(): + architectures[arch.name] = { + "example_repo_ids": list(arch.example_repo_ids), + "supported_encodings": [ + { + "encoding": encoding, + "supported_kv_cache_strategies": list(strategies), + } + for encoding, strategies in arch.supported_encodings.items() + ], + } + print(json.dumps({"architectures": architectures}, indent=2)) diff --git a/src/max/entrypoints/cli/metrics.py b/src/max/entrypoints/cli/metrics.py new file mode 100644 index 0000000000..b1b1cb1678 --- /dev/null +++ b/src/max/entrypoints/cli/metrics.py @@ -0,0 +1,225 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Metric-gathering utilities for the pipelines.""" + +import time +from typing import Any, Union + +import psutil + + +class TextGenerationMetrics: + """Metrics capturing and reporting for a text generation pipeline.""" + + prompt_size: int + output_size: int + startup_time: Union[float, str] + time_to_first_token: Union[float, str] + prompt_eval_throughput: Union[float, str] + eval_throughput: Union[float, str] + + _start_time: float + _signposts: dict[str, float] + _mem_usage_marker: dict[str, float] + _should_print_report: bool + _process: psutil.Process + _print_raw: bool + + def __init__(self, print_report: bool = False, print_raw: bool = False): + self._signposts = {} + self._mem_usage_marker = {} + self.batch_size = 1 + self.prompt_size = 0 + self.output_size = 0 + self._should_print_report = print_report + self._start_time = time.time() + self._process = psutil.Process() + self._print_raw = print_raw + + def __enter__(self): + return self + + def __exit__(self, *exc): + self._calculate_results() + if self._should_print_report: + self._print_report(self._print_raw) + + def signpost(self, name: str): + """Measure the current time and memory usage, tagging it with a name for later reporting.""" + self._signposts[name] = time.time() + self._mem_usage_marker[name] = (self._process.memory_info().rss) / ( + 1024 * 1024 * 1024 + ) + + def new_token(self): + """Report that a new token has been generated.""" + self.new_tokens(1) + + def new_tokens(self, num_tokens: int): + """Report that a num_tokens tokens have been generated.""" + self.output_size += num_tokens + + def _calculate_results(self): + begin_generation = self._signposts.get("begin_generation") + if begin_generation: + self.startup_time = ( + self._signposts["begin_generation"] - self._start_time + ) * 1000.0 + else: + self.startup_time = "n/a" + + # Calculate TTFT & context-encoding throughput + first_token = self._signposts.get("first_token") + if first_token and begin_generation: + self.time_to_first_token = ( + self._signposts["first_token"] + - self._signposts["begin_generation"] + ) * 1000.0 + self.prompt_eval_throughput = ( + self.prompt_size + * self.batch_size + / (self.time_to_first_token / 1000.0) + ) + else: + self.time_to_first_token = "n/a" + self.prompt_eval_throughput = "n/a" + + # Calculate TPOT & token-gen throughput + end_generation = self._signposts.get("end_generation") + if end_generation and first_token and self.output_size > 1: + generation_time = ( + self._signposts["end_generation"] + - self._signposts["first_token"] + ) + self.eval_throughput = ( + (self.output_size - 1) * self.batch_size / generation_time + ) + self.time_per_output_token: Any = ( + generation_time * 1000.0 / (self.output_size - 1) + ) + else: + self.eval_throughput = "n/a" + self.time_per_output_token = "n/a" + + if end_generation and begin_generation: + total_batch_time = ( + self._signposts["end_generation"] + - self._signposts["begin_generation"] + ) + self.requests_per_second: Any = self.batch_size / total_batch_time + self.total_exe_time: Any = total_batch_time * 1000 + else: + self.total_exe_time = "n/a" + self.requests_per_second = "n/a" + + def _print_report(self, print_raw=False): + print() + print("Prompt size:", self.prompt_size) + print("Output size:", self.output_size) + print("Startup time:", self.startup_time, "ms") + print("Time to first token:", self.time_to_first_token, "ms") + print( + "Prompt eval throughput (context-encoding):", + self.prompt_eval_throughput, + "tokens per second", + ) + print("Time per Output Token:", self.time_per_output_token, "ms") + print( + "Eval throughput (token-generation):", + self.eval_throughput, + "tokens per second", + ) + print("Total Latency:", self.total_exe_time, "ms") + print("Total Throughput:", self.requests_per_second, "req/s") + if print_raw: + print("=============raw stats=================") + for k, v in self._signposts.items(): + print( + f"Started {k} at {v} with memory" + f" {self._mem_usage_marker[k]} GB" + ) + + +class EmbeddingsMetrics: + prompt_size: int + startup_time: Union[float, str] + + _start_time: float + _signposts: dict[str, float] + _mem_usage_marker: dict[str, float] + _should_print_report: bool + _process: psutil.Process + _print_raw: bool + + def __init__(self, print_report: bool = False, print_raw: bool = False): + self._signposts = {} + self._mem_usage_marker = {} + self.batch_size = 1 + self.prompt_size = 0 + self._should_print_report = print_report + self._start_time = time.time() + self._process = psutil.Process() + self._print_raw = print_raw + + def __enter__(self): + return self + + def __exit__(self, *exc): + self._calculate_results() + if self._should_print_report: + self._print_report(self._print_raw) + + def signpost(self, name: str): + """Measure the current time and memory usage, tagging it with a name for later reporting.""" + self._signposts[name] = time.time() + self._mem_usage_marker[name] = (self._process.memory_info().rss) / ( + 1024 * 1024 * 1024 + ) + + def _calculate_results(self): + begin_generation = self._signposts.get("begin_encoding") + if begin_generation: + self.startup_time = ( + self._signposts["begin_encoding"] - self._start_time + ) * 1000.0 + else: + self.startup_time = "n/a" + + # Calculate TPOT & token-gen throughput + end_generation = self._signposts.get("end_generation") + if end_generation and begin_generation: + total_batch_time = ( + self._signposts["end_generation"] + - self._signposts["begin_generation"] + ) + self.requests_per_second: Any = self.batch_size / total_batch_time + self.total_exe_time: Any = total_batch_time * 1000 + else: + self.total_exe_time = "n/a" + self.requests_per_second = "n/a" + + def _print_report(self, print_raw=False): + print() + print("Prompt size:", self.prompt_size) + print("Startup time:", self.startup_time, "ms") + print("Total Latency:", self.total_exe_time, "ms") + print("Total Throughput:", self.requests_per_second, "req/s") + if print_raw: + print("=============raw stats=================") + for k, v in self._signposts.items(): + print( + f"Started {k} at {v} with memory" + f" {self._mem_usage_marker[k]} GB" + ) diff --git a/src/max/entrypoints/cli/serve.py b/src/max/entrypoints/cli/serve.py new file mode 100644 index 0000000000..148ddbbaf7 --- /dev/null +++ b/src/max/entrypoints/cli/serve.py @@ -0,0 +1,115 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +"""Utilities for serving cli.""" + +import functools +import logging +from typing import Optional, Union + +import uvloop +from max.pipelines import PIPELINE_REGISTRY, PipelineConfig, PipelineTask +from max.pipelines.kv_cache import KVCacheStrategy +from max.serve.api_server import ( + ServingTokenGeneratorSettings, + fastapi_app, + fastapi_config, +) +from max.serve.config import Settings +from max.serve.pipelines.llm import batch_config_from_pipeline_config +from max.serve.pipelines.performance_fake import ( + PerformanceFakingPipelineTokenizer, + get_performance_fake, +) +from transformers import AutoTokenizer +from uvicorn import Server + +logger = logging.getLogger(__name__) + + +def serve_pipeline( + pipeline_config: PipelineConfig, + performance_fake: str = "none", + profile: bool = False, + batch_timeout: float = 0.0, + model_name: Union[str, None] = None, + failure_percentage: Optional[int] = None, +): + # Initialize settings + settings = Settings(MAX_SERVE_USE_HEARTBEAT=False) + + # TODO: make validate_pipeline_config more generic or cleanly handle the + # case where this is a generalized model unsupported by MAX + if pipeline_config.architecture in PIPELINE_REGISTRY.architectures: + # Retrieve tokenizer and pipeline. + pipeline_config = PIPELINE_REGISTRY.validate_pipeline_config( + pipeline_config + ) + + # TODO: This is a workaround to support embeddings generation until the + # changes to tie pipelines to tasks is complete. This will be removed. + pipeline_task = PipelineTask.TEXT_GENERATION + if pipeline_config.model_path == "sentence-transformers/all-mpnet-base-v2": + pipeline_task = PipelineTask.EMBEDDINGS_GENERATION + + if performance_fake == "none": + logger.info(f"Starting server using {pipeline_config.model_path}") + # Load tokenizer and pipeline from PIPELINE_REGISTRY. + tokenizer, pipeline_factory = PIPELINE_REGISTRY.retrieve_factory( + pipeline_config, + task=pipeline_task, + ) + else: + logger.info( + f"Starting server using performance fake {performance_fake}." + ) + tokenizer = PerformanceFakingPipelineTokenizer( + AutoTokenizer.from_pretrained(pipeline_config.model_path) + ) + pipeline_factory = functools.partial( + get_performance_fake, + performance_fake, # type: ignore + failure_percentage, + ) + + pipeline_config.cache_strategy = KVCacheStrategy.CONTINUOUS + + # Load batch config. + batch_config = batch_config_from_pipeline_config( + pipeline_config=pipeline_config, + pipeline_task=pipeline_task, + batch_timeout=batch_timeout, + ) + + # If explicit model name is not provided, set to model_path. + if model_name is None: + model_name = pipeline_config.model_path + assert model_name is not None + + pipeline_settings = ServingTokenGeneratorSettings( + model_name=model_name, + model_factory=pipeline_factory, + pipeline_config=batch_config, + tokenizer=tokenizer, + ) + + # Intialize and serve webserver. + app = fastapi_app( + settings, + pipeline_settings, + ) + config = fastapi_config(app=app, server_settings=settings) + + server = Server(config) + uvloop.run(server.serve()) diff --git a/src/max/entrypoints/llm.py b/src/max/entrypoints/llm.py new file mode 100644 index 0000000000..5f745b72c1 --- /dev/null +++ b/src/max/entrypoints/llm.py @@ -0,0 +1,185 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""A high level interface for interacting with LLMs built from MAX pipelines""" + +from __future__ import annotations + +import asyncio +import queue +import threading +from queue import Queue +from threading import Thread +from typing import Optional, Sequence + +import tqdm +from max.pipelines.config import PipelineConfig +from max.pipelines.registry import PIPELINE_REGISTRY +from max.serve.config import Settings +from max.serve.pipelines.llm import ( + TokenGeneratorPipeline, + TokenGeneratorRequest, + batch_config_from_pipeline_config, +) +from max.serve.pipelines.model_worker import start_model_worker +from max.serve.pipelines.telemetry_worker import start_telemetry_consumer +from max.serve.scheduler.process_control import ProcessControl + +RequestQueue = Queue[tuple[Sequence[str], Optional[int], bool]] +ResponseQueue = Queue[list[str]] + + +# For now, the LLM class only supports the direct token generation use case. +# Long term, there are multiple other potential use cases to support. +# This class loosely mirrors vllm.LLM for offline inference: https://docs.vllm.ai/en/stable/dev/offline_inference/llm.html +class LLM: + """A high level interface for interacting with LLMs.""" + + _pc: ProcessControl + _async_runner: Thread + _request_queue: RequestQueue + _response_queue: ResponseQueue + + def __init__(self, settings: Settings, pipeline_config: PipelineConfig): + self._pc = ProcessControl(threading, "LLM") + self._request_queue = Queue() + self._response_queue = Queue() + self._async_runner = Thread( + target=_run_async_worker, + args=( + self._pc, + pipeline_config, + self._request_queue, + self._response_queue, + settings, + ), + ) + self._async_runner.start() + # TODO: set a timeout on wait + self._pc.started_event.wait() + + def __del__(self): + self._pc.set_canceled() + self._async_runner.join() + + def generate( + self, + prompts: str | Sequence[str], + max_new_tokens: int | None = 100, + use_tqdm: bool = True, + ) -> list[str]: + if isinstance(prompts, str): + # Handle the degenerate case where the users just passes in a single string + return self.generate((prompts,), max_new_tokens, use_tqdm) + + self._request_queue.put((prompts, max_new_tokens, use_tqdm)) + return self._response_queue.get() + + +def _run_async_worker( + pc: ProcessControl, + pipeline_config: PipelineConfig, + request_queue: RequestQueue, + response_queue: ResponseQueue, + settings: Settings, +): + asyncio.run( + _async_worker( + pc, + pipeline_config, + request_queue, + response_queue, + settings, + ) + ) + + +async def _async_worker( + pc: ProcessControl, + pipeline_config: PipelineConfig, + request_queue: RequestQueue, + response_queue: ResponseQueue, + settings: Settings, +): + tokenizer, model_factory = PIPELINE_REGISTRY.retrieve_factory( + pipeline_config + ) + batch_config = batch_config_from_pipeline_config(pipeline_config) + model_name = pipeline_config.model_path + + async with start_telemetry_consumer(settings) as metric_client: + async with start_model_worker( + model_factory=model_factory, + batch_config=batch_config, + settings=settings, + metric_client=metric_client, + ) as engine_queue: + # Start the model worker process. + # Create dynamic and continuous batching workers and associated queues + # to feed the model worker process. + async with TokenGeneratorPipeline( + model_name=model_name, + tokenizer=tokenizer, + engine_queue=engine_queue, + ) as pipeline: + pc.set_started() + while True: + pc.beat() + if pc.is_canceled(): + break + + try: + (prompts, max_new_tokens, use_tqdm) = request_queue.get( + timeout=0.3 + ) + + if use_tqdm: + pbar = tqdm.tqdm(total=len(prompts)) + + # Lambda to do a full text generation for a request. + async def all_tokens( + i: int, + prompt: str, + ) -> tuple[int, str]: + request = TokenGeneratorRequest( + id=str(i), + index=0, + model_name=model_name, + prompt=prompt, + max_new_tokens=max_new_tokens, + ) + + # Generate this request until complete + tokens = await pipeline.all_tokens(request) + if use_tqdm: + pbar.update(1) + return (i, "".join(t.decoded_token for t in tokens)) + + all_tokens_tasks = [ + all_tokens(i, prompt) + for i, prompt in enumerate(prompts) + ] + responses = [""] * len(prompts) + for i, response in await asyncio.gather( + *all_tokens_tasks + ): + responses[i] = response + + if use_tqdm: + pbar.close() + + response_queue.put(responses) + + except queue.Empty: + continue + pc.set_completed() diff --git a/src/max/entrypoints/pipelines.py b/src/max/entrypoints/pipelines.py new file mode 100644 index 0000000000..bdd102aa9f --- /dev/null +++ b/src/max/entrypoints/pipelines.py @@ -0,0 +1,274 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +import functools +import logging +import os +import signal + +import click +from max.entrypoints.cli import ( + generate_text_for_pipeline, + list_pipelines_to_console, + list_pipelines_to_json, + pipeline_config_options, + pipeline_encode, + serve_pipeline, +) +from max.pipelines import PIPELINE_REGISTRY, PipelineConfig +from max.pipelines.architectures import register_all_models +from max.serve.config import Settings +from max.serve.telemetry.common import configure_logging, configure_metrics + +logger = logging.getLogger(__name__) + + +class ModelGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + supported = ", ".join(self.list_commands(ctx)) + ctx.fail( + f"Command not supported: {cmd_name}\nSupported commands:" + f" {supported}" + ) + + +@click.command(cls=ModelGroup) +def main(): + settings = Settings() + configure_logging(settings) + configure_metrics(settings) + register_all_models() + + +def common_server_options(func): + @click.option( + "--profile-serve", + is_flag=True, + show_default=True, + default=False, + help=( + "Whether to enable pyinstrument profiling on the serving endpoint." + ), + ) + @click.option( + "--performance-fake", + type=click.Choice(["none", "no-op", "speed-of-light", "vllm"]), + default="none", + help="Fake the engine performance (for benchmarking)", + ) + @click.option( + "--batch-timeout", + type=float, + default=0.0, + help="Custom timeout for any particular batch.", + ) + @click.option( + "--model-name", + type=str, + help="Deprecated, please use `model_path` instead. Optional model alias for serving the model.", + ) + @click.option( + "--sim-failure", + type=int, + default=0, + help="Simulate fake-perf with failure percentage", + ) + @functools.wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper + + +@main.command(name="serve") +@pipeline_config_options +@common_server_options +def cli_serve( + profile_serve, + performance_fake, + batch_timeout, + model_name, + sim_failure, + **config_kwargs, +): + """Start a model serving endpoint for inference. + + This command launches a server that can handle inference requests for the + specified model. The server supports various performance optimization + options and monitoring capabilities. + """ + # Initialize config, and serve. + pipeline_config = PipelineConfig(**config_kwargs) + failure_percentage = None + if sim_failure > 0: + failure_percentage = sim_failure + serve_pipeline( + pipeline_config=pipeline_config, + profile=profile_serve, + performance_fake=performance_fake, + batch_timeout=batch_timeout, + model_name=model_name, + failure_percentage=failure_percentage, + ) + + +@main.command(name="generate") +@pipeline_config_options +@click.option( + "--prompt", + type=str, + default="I believe the meaning of life is", + help="The text prompt to use for further generation.", +) +@click.option( + "--image_url", + type=str, + multiple=True, + default=[], + help=( + "Images to include along with prompt, specified as URLs." + " The images are ignored if the model does not support" + " image inputs." + ), +) +@click.option( + "--num-warmups", + type=int, + default=0, + show_default=True, + help="# of warmup iterations to run before the final timed run.", +) +def cli_pipeline(prompt, image_url, num_warmups, **config_kwargs): + """Generate text using the specified model. + + This command runs text generation using the loaded model, optionally + accepting image inputs for multimodal models. + """ + # Replit model_paths are kinda broken due to transformers + # version mismatch. We manually update trust_remote_code to True + # because the modularai version does not have the custom Python code needed + # Without this, we get: + # ValueError: `attn_type` has to be either `multihead_attention` or + # `multiquery_attention`. Received: grouped_query_attention + # Another reason why we override this flag here is because at PipelineConfig + # instantiation below, we'll call AutoConfig.from_pretrained, which will + # trigger the error above if not set to True. + if "replit" in config_kwargs["model_path"]: + config_kwargs["trust_remote_code"] = True + + if config_kwargs["max_new_tokens"] == -1: + # Limit generate default max_new_tokens to 100. + config_kwargs["max_new_tokens"] = 100 + + # Load tokenizer & pipeline. + pipeline_config = PipelineConfig(**config_kwargs) + generate_text_for_pipeline( + pipeline_config, + prompt=prompt, + image_urls=image_url, + num_warmups=num_warmups, + ) + + +@main.command(name="encode") +@pipeline_config_options +@click.option( + "--prompt", + type=str, + default="I believe the meaning of life is", + help="The text prompt to use for further generation.", +) +@click.option( + "--num-warmups", + type=int, + default=0, + show_default=True, + help="# of warmup iterations to run before the final timed run.", +) +def encode(prompt, num_warmups, **config_kwargs): + """Encode text input into model embeddings. + + This command processes the input text through the model's encoder, producing + embeddings that can be used for various downstream tasks. + """ + # Load tokenizer & pipeline. + pipeline_config = PipelineConfig(**config_kwargs) + pipeline_encode( + pipeline_config, + prompt=prompt, + num_warmups=num_warmups, + ) + + +@main.command(name="warm-cache") +@pipeline_config_options +def cli_warm_cache(**config_kwargs) -> None: + """Load and compile the model to prepare caches. + + This command is particularly useful in combination with + --save-to-serialized-model-path. Providing that option to this command + will result in a compiled model being stored to that path. Subsequent + invocations of other commands can then use --serialized-model-path to + reuse the previously-compiled model. + + Even without --save-to-serialized-model-path, this command will as a side + effect warm the Hugging Face cache and in some cases, MAX compilation + caches. + """ + pipeline_config = PipelineConfig(**config_kwargs) + _ = PIPELINE_REGISTRY.retrieve(pipeline_config) + + +@main.command(name="list") +@click.option( + "--json", + is_flag=True, + show_default=True, + default=False, + help="Print the list of pipelines options in JSON format.", +) +def cli_list(json): + """List available pipeline configurations and models. + + This command displays information about all registered pipelines and their + configurations. Output can be formatted as human-readable text or JSON. + """ + if json: + list_pipelines_to_json() + else: + list_pipelines_to_console() + + +if __name__ == "__main__": + if directory := os.getenv("BUILD_WORKSPACE_DIRECTORY"): + os.chdir(directory) + + # Workaround for https://github.com/buildbuddy-io/buildbuddy/issues/8326 + if ( + signal.getsignal(signal.SIGINT) == signal.SIG_IGN + and signal.getsignal(signal.SIGTERM) == signal.SIG_IGN + and signal.getsignal(signal.SIGQUIT) == signal.SIG_IGN + ): + # For SIGINT, Python remaps SIG_DFL to default_int_handler on startup. + # We do the same here to retain the same behavior we would get if we + # started normally. (SIG_DFL terminates the process immediately; + # default_int_handler raises KeyboardInterrupt.) + signal.signal(signal.SIGINT, signal.default_int_handler) + signal.signal(signal.SIGTERM, signal.SIG_DFL) + signal.signal(signal.SIGQUIT, signal.SIG_DFL) + + main() diff --git a/src/max/pipelines/README.md b/src/max/pipelines/README.md new file mode 100644 index 0000000000..160952f64b --- /dev/null +++ b/src/max/pipelines/README.md @@ -0,0 +1,119 @@ +# MAX Pipelines + +These are end-to-end pipelines that demonstrate the power of +[MAX](https://docs.modular.com/max/) for accelerating common AI workloads, and +more. Each of the supported pipelines can be served via an OpenAI-compatible +endpoint. + +MAX can also serve most PyTorch-based large language models that are +present on Hugging Face, although not at the same performance as native MAX +Graph versions. + +## Pipelines + +Highly optimized MAX Graph implementations exist for several core model +architectures. These include: + +- [Llama 3.1](llama3): A text completion pipeline using the Llama 3.1 model, +implemented using the MAX Graph API. This pipeline contains everything +needed to run a self-hosted large language model in the `LlamaForCausalLM` +family with state-of-the-art serving throughput. +- [Mistral](architectures/mistral): Support for the `MistralForCausalLM` family +of text completion models, by default using the Mistral NeMo 12B model. This pipeline +has been tuned for performance using the MAX Graph API. +- [Replit Code](architectures/replit): Code generation via the +Replit Code V1.5 3B model, implemented using the MAX Graph API. + +Instructions for how to run each pipeline can be found in their respective +subdirectories, along with all configuration parameters. A shared driver is +used to execute the pipelines. + +## Usage + +The easiest way to try out any of the pipelines is with our Magic command-line +tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/ + ``` + +3. Now run one of the text completion demos with any of following commands: + + ```shell + magic run generate --model-path=modularai/llama-3.1 --prompt "Why is the sky blue?" + magic run generate --model-path=modularai/replit-code-1.5 --prompt "def fibonacci(n):" + magic run generate --model-path=mistralai/Mistral-Nemo-Instruct-2407 --prompt "Why is the sky blue?" + ``` + +4. Host a chat completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + Finetuned weights hosted on Hugging Face can be used with one + of these optimized pipeline architectures when serving via the `serve` + command: + + ```shell + magic run serve --model-path=modularai/llama-3.1 + ``` + + A request can then be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "modularai/llama-3.1", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"} + ] + }' + ``` + +## Verified Hugging Face model architectures + +If you provide a repository ID for a Hugging Face large language model +that does not currently have an optimized MAX Graph implementation, MAX +falls back to serving a PyTorch eager version of the model. + +The following table lists the model architectures tested to work with MAX. + +| **Architecture** | **Example Model** | +| --- | --- | +| AquilaForCausalLM | BAAI/Aquila-7B | +| ChatGLMModel | THUDM/chatglm3-6b | +| GPT2LMHeadModel | openai-community/gpt2 | +| GPTJForCausalLM | EleutherAI/gpt-j-6b | +| LlamaForCausalLM | meta-llama/Llama-3.2-3B-Instruct | +| LlamaForCausalLM | Skywork/Skywork-o1-Open-Llama-3.1-8B | +| LlamaForCausalLM | deepseek-ai/deepseek-coder-1.3b-instruct | +| PhiForCausalLM | microsoft/phi-2 | +| Phi3ForCausalLM | microsoft/Phi-3-mini-4k-instruct | +| GraniteForCausalLM | ibm-granite/granite-3.1-8b-instruct | +| Qwen2ForCausalLM | Qwen/Qwen2.5-1.5B-Instruct | +| OlmoForCausalLM | allenai/OLMo-1B-0724-hf | diff --git a/src/max/pipelines/__init__.py b/src/max/pipelines/__init__.py new file mode 100644 index 0000000000..3020fb1d21 --- /dev/null +++ b/src/max/pipelines/__init__.py @@ -0,0 +1,98 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Types to interface with ML pipelines such as text/token generation.""" + +from typing import Callable as _Callable +from typing import Union as _Union + +from .config import ( + PipelineConfig, + PipelineEngine, + RopeType, + SamplingParams, + SupportedEncoding, + WeightsFormat, +) +from .context import InputContext, TextAndVisionContext, TextContext +from .embeddings_pipeline import EmbeddingsPipeline +from .hf_utils import HuggingFaceFile +from .interfaces import ( + EmbeddingsGenerator, + PipelineTask, + PipelineTokenizer, + TokenGenerator, + TokenGeneratorContext, + TokenGeneratorRequest, + TokenGeneratorRequestFunction, + TokenGeneratorRequestMessage, + TokenGeneratorRequestTool, + TokenGeneratorResponseFormat, +) +from .pipeline import ( + ModelInputs, + ModelOutputs, + PipelineModel, + TextGenerationPipeline, + upper_bounded_default, +) +from .registry import PIPELINE_REGISTRY, SupportedArchitecture +from .response import EmbeddingsResponse, LogProbabilities, TextResponse +from .tokenizer import ( + IdentityPipelineTokenizer, + PreTrainedPipelineTokenizer, + TextAndVisionTokenizer, + TextTokenizer, +) + +PipelinesFactory = _Callable[[], _Union[TokenGenerator, EmbeddingsGenerator]] + + +__all__ = [ + "HuggingFaceFile", + "PipelineConfig", + "PipelineEngine", + "PipelineTask", + "PIPELINE_REGISTRY", + "SamplingParams", + "SupportedArchitecture", + "SupportedEncoding", + "TokenGenerator", + "TokenGeneratorContext", + "TokenGeneratorRequest", + "TokenGeneratorRequestMessage", + "TokenGeneratorResponseFormat", + "TokenGeneratorRequestTool", + "TokenGeneratorResponseFormat", + "TokenGeneratorRequestFunction", + "IdentityPipelineTokenizer", + "InputContext", + "TextContext", + "TextAndVisionContext", + "PipelineTokenizer", + "PreTrainedPipelineTokenizer", + "TextTokenizer", + "TextAndVisionTokenizer", + "TextGenerationPipeline", + "WeightsFormat", + "RopeType", + "PipelineModel", + "ModelInputs", + "ModelOutputs", + "TextResponse", + "LogProbabilities", + "EmbeddingsGenerator", + "EmbeddingsPipeline", + "EmbeddingsResponse", + "upper_bounded_default", +] diff --git a/src/max/pipelines/architectures/__init__.py b/src/max/pipelines/architectures/__init__.py new file mode 100644 index 0000000000..cfb90c5bd3 --- /dev/null +++ b/src/max/pipelines/architectures/__init__.py @@ -0,0 +1,49 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import PIPELINE_REGISTRY + + +def register_all_models(): + """Imports model architectures, thus registering the architecture in the shared PIPELINE_REGISTRY.""" + from .exaone import exaone_arch + from .granite import granite_arch + from .llama3 import llama_arch + from .llama_vision import llama_vision_arch + from .mistral import mistral_arch + from .mpnet import mpnet_arch + from .olmo import olmo_arch + from .phi3 import phi3_arch + from .pixtral import pixtral_arch + from .qwen2 import qwen2_arch + from .replit import replit_arch + + architectures = [ + exaone_arch, + llama_arch, + llama_vision_arch, + mistral_arch, + mpnet_arch, + olmo_arch, + phi3_arch, + pixtral_arch, + qwen2_arch, + replit_arch, + granite_arch, + ] + + for arch in architectures: + PIPELINE_REGISTRY.register(arch) + + +__all__ = ["register_all_models"] diff --git a/src/max/pipelines/architectures/deepseekV2/layers/__init__.py b/src/max/pipelines/architectures/deepseekV2/layers/__init__.py new file mode 100644 index 0000000000..fcf4807305 --- /dev/null +++ b/src/max/pipelines/architectures/deepseekV2/layers/__init__.py @@ -0,0 +1,14 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""DeepseekV2 layer modules.""" diff --git a/src/max/pipelines/architectures/deepseekV2/layers/moe_gate.py b/src/max/pipelines/architectures/deepseekV2/layers/moe_gate.py new file mode 100644 index 0000000000..fd814e5663 --- /dev/null +++ b/src/max/pipelines/architectures/deepseekV2/layers/moe_gate.py @@ -0,0 +1,82 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Mixture of Experts Gate Layer.""" + +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import TensorValue, ops +from max.pipelines.nn import Linear +from max.pipelines.nn.layer import LayerV2 + + +@dataclass +class MaxMoEGate(LayerV2): + """Mixture of Experts Gate Layer. + + Args: + gate_score: Linear layer that projects from hidden_size to intermediate_size. + num_experts_per_tok: Number of experts to route each token to. + n_routed_experts: Total number of experts in the model. + routed_scaling_factor: Scaling factor for routing weights. + aux_loss_alpha: Weight for auxiliary loss. + n_group: Number of groups for expert routing. + topk_group: Number of top experts per group. + gating_dim: Hidden dimension size for gating. + + Shape: + Input: (batch_size, seq_length, hidden_size) + Output: tuple of: + - topk_idx: (batch_size * seq_length, num_experts_per_tok) + - topk_weight: (batch_size * seq_length, num_experts_per_tok) + """ + + def __post_init__(self): + super().__init__() + + gate_score: Linear + num_experts_per_tok: int = 6 + n_routed_experts: int = 64 + routed_scaling_factor: float = 1.0 + aux_loss_alpha: float = 0.001 + n_group: int = 1 + topk_group: int = 1 + gating_dim: int = 2048 # equal to config.hidden_size + + def __call__( + self, hidden_states: TensorValue + ) -> tuple[TensorValue, TensorValue]: + """Compute expert routing weights and indices for input hidden states. + + Args: + hidden_states: Input tensor of shape (batch_size, seq_length, hidden_size) + + Returns: + tuple containing: + - topk_idx: Indices of top-k selected experts of shape (batch_size * seq_length, num_experts_per_tok) + - topk_weight: Routing weights for selected experts of shape (batch_size * seq_length, num_experts_per_tok) + """ + # compute gating score + bsz, seq_len, h = hidden_states.shape + hidden_states = hidden_states.reshape([bsz * seq_len, h]) + + logits = self.gate_score(hidden_states.cast(DType.float32)) + scores = ops.softmax(logits[-1].cast(DType.float32)) + + # select top k experts + topk_weight, topk_idx = ops.top_k( + scores, self.num_experts_per_tok, -1, False + ) + + return topk_idx, topk_weight diff --git a/src/max/pipelines/architectures/exaone/__init__.py b/src/max/pipelines/architectures/exaone/__init__.py new file mode 100644 index 0000000000..5a5f6a2981 --- /dev/null +++ b/src/max/pipelines/architectures/exaone/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import exaone_arch + +__all__ = ["exaone_arch"] diff --git a/src/max/pipelines/architectures/exaone/arch.py b/src/max/pipelines/architectures/exaone/arch.py new file mode 100644 index 0000000000..ce2bfbb8e4 --- /dev/null +++ b/src/max/pipelines/architectures/exaone/arch.py @@ -0,0 +1,59 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + RopeType, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from ..llama3 import weight_adapters +from ..llama3.model import Llama3Model +from .weight_adapters import convert_exaone_safetensor_state_dict + +exaone_arch = SupportedArchitecture( + name="ExaoneForCausalLM", + default_encoding=SupportedEncoding.float32, + task=PipelineTask.TEXT_GENERATION, + supported_encodings={ + SupportedEncoding.q4_k: [KVCacheStrategy.NAIVE], + SupportedEncoding.q6_k: [KVCacheStrategy.NAIVE], + SupportedEncoding.float32: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + }, + example_repo_ids=[ + "LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct", + "LGAI-EXAONE/EXAONE-3.5-7.8B-Instruct", + "LGAI-EXAONE/EXAONE-3.5-32B-Instruct", + ], + pipeline_model=Llama3Model, + tokenizer=TextTokenizer, + rope_type=RopeType.neox, + default_weights_format=WeightsFormat.gguf, + weight_adapters={ + WeightsFormat.safetensors: convert_exaone_safetensor_state_dict, + WeightsFormat.gguf: weight_adapters.convert_gguf_state_dict, + }, +) diff --git a/src/max/pipelines/architectures/exaone/weight_adapters.py b/src/max/pipelines/architectures/exaone/weight_adapters.py new file mode 100644 index 0000000000..39fcd27b0b --- /dev/null +++ b/src/max/pipelines/architectures/exaone/weight_adapters.py @@ -0,0 +1,56 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from max.graph.weights import WeightData, Weights +from transformers import LlamaConfig + +from ..llama3.weight_adapters import _compute_safetensor_rope_scaling + +# Maps Exaone Safetensor to MAX weight names. +EXAONE_SAFETENSOR_MAPPING = { + "transformer.wte": "embed_tokens", + "transformer.h": "layers", + "mlp.c_fc_1": "mlp.up_proj", + "mlp.c_proj": "mlp.down_proj", + "mlp.c_fc_0": "mlp.gate_proj", + "ln_2": "post_attention_layernorm", + "ln_1": "input_layernorm", + "attn.attention.q_proj": "self_attn.q_proj", + "attn.attention.v_proj": "self_attn.v_proj", + "attn.attention.k_proj": "self_attn.k_proj", + "attn.attention.out_proj": "self_attn.o_proj", + "transformer.ln_f": "norm", +} + + +def convert_exaone_safetensor_state_dict( + state_dict: dict[str, Weights], + huggingface_config: LlamaConfig, + **unused_kwargs, +) -> dict[str, WeightData]: + new_state_dict: dict[str, WeightData] = {} + # Map the weight names. + for safetensor_name, value in state_dict.items(): + max_name = safetensor_name + for before, after in EXAONE_SAFETENSOR_MAPPING.items(): + max_name = max_name.replace(before, after) + new_state_dict[max_name] = value.data() + # Add rope scaling to the state dict. + rope_scaling = _compute_safetensor_rope_scaling(huggingface_config) + if rope_scaling is not None: + new_state_dict["rope_freqs.weight"] = WeightData.from_numpy( + rope_scaling, "rope_freqs.weight" + ) + return new_state_dict diff --git a/src/max/pipelines/architectures/granite/__init__.py b/src/max/pipelines/architectures/granite/__init__.py new file mode 100644 index 0000000000..95f180a1e2 --- /dev/null +++ b/src/max/pipelines/architectures/granite/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import granite_arch + +__all__ = ["granite_arch"] diff --git a/src/max/pipelines/architectures/granite/arch.py b/src/max/pipelines/architectures/granite/arch.py new file mode 100644 index 0000000000..e8d4fb19de --- /dev/null +++ b/src/max/pipelines/architectures/granite/arch.py @@ -0,0 +1,55 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + RopeType, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from ..llama3 import weight_adapters +from .model import GraniteModel + +granite_arch = SupportedArchitecture( + name="GraniteForCausalLM", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=[ + "ibm-granite/granite-3.1-8b-instruct", + "ibm-granite/granite-3.1-8b-base", + ], + default_weights_format=WeightsFormat.gguf, + default_encoding=SupportedEncoding.float32, + supported_encodings={ + SupportedEncoding.float32: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + }, + pipeline_model=GraniteModel, + tokenizer=TextTokenizer, + rope_type=RopeType.normal, + weight_adapters={ + WeightsFormat.safetensors: weight_adapters.convert_safetensor_state_dict, + WeightsFormat.gguf: weight_adapters.convert_gguf_state_dict, + }, +) diff --git a/src/max/pipelines/architectures/granite/model.py b/src/max/pipelines/architectures/granite/model.py new file mode 100644 index 0000000000..a3dc42da60 --- /dev/null +++ b/src/max/pipelines/architectures/granite/model.py @@ -0,0 +1,38 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from max.engine import InferenceSession +from max.graph import ops +from max.pipelines import PipelineConfig + +from ..llama3.model import Llama3Model + + +class GraniteModel(Llama3Model): + """Granite pipeline model implementation.""" + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) + + logits_scaling = getattr( + self.pipeline_config.huggingface_config, "logits_scaling", 1.0 + ) + + if logits_scaling != 1.0: + self.logits_processor = lambda logits: logits / ops.constant( + logits_scaling, logits.dtype + ) diff --git a/src/max/pipelines/architectures/llama3/README.md b/src/max/pipelines/architectures/llama3/README.md new file mode 100644 index 0000000000..dfff0ded91 --- /dev/null +++ b/src/max/pipelines/architectures/llama3/README.md @@ -0,0 +1,134 @@ +# Llama 3.1 + +**Language:** Python + +**API**: MAX Graph + +This pipeline provides optimized support for the `LlamaForCausalLM` family +of large language models, as exemplified by the Llama 3.1 text completion +model. The model itself has been constructed in Python +using the [MAX Graph API](https://docs.modular.com/max/graph/). + +The MAX Graph API provides an accessible interface to the construction of +flexible accelerated compute graphs, which are then optimized by the MAX +Engine's advanced graph compiler. This pipeline showcases how a large language +model can be fully defined using Python and MAX Graphs and then compiled for +optimal inference performance via the MAX Engine. + +## Model + +[Llama 3.1](https://llama.meta.com/llama3/) is an open source large language +model released by Meta. The structure of this implementation was inspired by +Andrej Karpathy's [llama2.c](https://github.com/karpathy/llama2.c) and its [Mojo +port by Aydyn Tairov](https://github.com/tairov/llama2.mojo). + +The text completion demo is compatible with the the official Llama 3 +[text completion demo](https://github.com/meta-llama/llama3/blob/14aab0428d3ec3a9596f1dea06d9c564f9c0e35f/example_text_completion.py). + +The default settings for this pipeline use the 8B set of pretrained weights in +`q4_k` quantized encodings. + +## Usage + +The easiest way to try out this pipeline is with our Magic command-line tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this pipeline's + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/pipelines + ``` + +3. Now run the Llama 3.1 text completion demo with the following command: + + ```shell + magic run generate --model-path="modularai/Llama-3.1-8B-Instruct-GGUF" --prompt "I believe the meaning of life is" + ``` + +4. Host a chat completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + You can configure the pipeline to be hosted by using the `--serve` argument. + For example: + + ```shell + magic run serve --model-path="modularai/Llama-3.1-8B-Instruct-GGUF" + ``` + + A request can be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "modularai/llama-3.1", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"} + ] + }' + ``` + + Additionally, finetuned weights hosted on Hugging Face for any compatible + `LlamaForCausalLM` model can be used with this optimized architecture + via the `serve` command: + + ```shell + magic run serve --model-path=meta-llama/Llama-3.2-1B + ``` + +## Options + +The following command-line options are available to customize operation of the +pipeline: + +- `--max-length`: Controls the maximum length of the text sequence (includes the + input tokens). Defaults to huggingface model config's max sequence length. +- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 + value is provided, the model will continue to generate tokens for the entire + context length. (Default value: -1) +- `--prompt`: The text prompt to use for further generation. +- `--quantization-encoding`: The encoding to use for a datatype that can be + quantized to a low bits per weight format. The options for quantized formats + will download and cache default weights, but `float32` requires the use of + `--weight-path` to specify locally downloaded full-precision weights for use + in the model. + Valid values: `q4_0`, `q4_k`, `q6_k`, `bfloat16`, `float32`. + (Default value: `float32`). +- `--save-to-serialized-model-path`: If specified, writes the serialized model + to this path. +- `--serialized-model-path`: If specified, tries to load a serialized model + from this path. +- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. +- `--version`: Selects which version in the Llama 3 family to use. + Valid values: `3`, `3.1`. + (Default value: `3.1`) +- `--weight-path`: Overrides the default URL, and allows for an + already-downloaded pretrained weight file to be used with the model. +- `--max-batch-size`: Specifies the maximum batch size to be used. + Default is 1. +- `--devices`: Specifies the device(s) to use for the model. This can optionally + be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". + Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/llama3/__init__.py b/src/max/pipelines/architectures/llama3/__init__.py new file mode 100644 index 0000000000..a70f69fa33 --- /dev/null +++ b/src/max/pipelines/architectures/llama3/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import llama_arch + +__all__ = ["llama_arch"] diff --git a/src/max/pipelines/architectures/llama3/arch.py b/src/max/pipelines/architectures/llama3/arch.py new file mode 100644 index 0000000000..2bdd4dd5c2 --- /dev/null +++ b/src/max/pipelines/architectures/llama3/arch.py @@ -0,0 +1,66 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + RopeType, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from . import weight_adapters +from .model import Llama3Model + +llama_arch = SupportedArchitecture( + name="LlamaForCausalLM", + example_repo_ids=[ + "meta-llama/Llama-3.1-8B-Instruct", + "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", + "meta-llama/Llama-Guard-3-8B", + "meta-llama/Llama-3.2-1B-Instruct", + "meta-llama/Llama-3.2-3B-Instruct", + "deepseek-ai/deepseek-coder-6.7b-instruct", + "modularai/llama-3.1", + ], + default_encoding=SupportedEncoding.q4_k, + supported_encodings={ + SupportedEncoding.gptq: [ + KVCacheStrategy.PAGED, + ], + SupportedEncoding.q4_k: [KVCacheStrategy.NAIVE], + SupportedEncoding.q4_0: [KVCacheStrategy.NAIVE], + SupportedEncoding.q6_k: [KVCacheStrategy.NAIVE], + SupportedEncoding.float32: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + }, + pipeline_model=Llama3Model, + tokenizer=TextTokenizer, + rope_type=RopeType.normal, + default_weights_format=WeightsFormat.safetensors, + weight_adapters={ + WeightsFormat.safetensors: weight_adapters.convert_safetensor_state_dict, + WeightsFormat.gguf: weight_adapters.convert_gguf_state_dict, + }, + task=PipelineTask.TEXT_GENERATION, +) diff --git a/src/max/pipelines/architectures/llama3/config.py b/src/max/pipelines/architectures/llama3/config.py new file mode 100644 index 0000000000..50f0849b0c --- /dev/null +++ b/src/max/pipelines/architectures/llama3/config.py @@ -0,0 +1,54 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""All configurable parameters for Llama3.""" + +from __future__ import annotations + +from max.pipelines import HuggingFaceFile, SupportedEncoding + + +def get_llama_huggingface_file( + version: str, encoding: SupportedEncoding, revision: str | None = None +) -> HuggingFaceFile: + if version == "3": + filenames = { + SupportedEncoding.bfloat16: "llama-3-8b-instruct-bf16.gguf", + SupportedEncoding.float32: "llama-3-8b-f32.gguf", + SupportedEncoding.q4_k: "llama-3-8b-instruct-q4_k_m.gguf", + SupportedEncoding.q4_0: "llama-3-8b-instruct-q4_0.gguf", + SupportedEncoding.q6_k: "llama-3-8b-instruct-q6_k.gguf", + } + filename = filenames.get(encoding) + if filename is None: + raise ValueError( + f"encoding does not have default hf file: {encoding}" + ) + return HuggingFaceFile("modularai/llama-3", filename, revision) + + elif version == "3.1": + filenames = { + SupportedEncoding.bfloat16: "llama-3.1-8b-instruct-bf16.gguf", + SupportedEncoding.float32: "llama-3.1-8b-instruct-f32.gguf", + SupportedEncoding.q4_k: "llama-3.1-8b-instruct-q4_k_m.gguf", + SupportedEncoding.q4_0: "llama-3.1-8b-instruct-q4_0.gguf", + SupportedEncoding.q6_k: "llama-3.1-8b-instruct-q6_k.gguf", + } + filename = filenames.get(encoding) + if filename is None: + raise ValueError( + f"encoding does not have default hf file: {encoding}" + ) + return HuggingFaceFile("modularai/llama-3.1", filename, revision) + + else: + raise ValueError(f"version {version} not supported for llama") diff --git a/src/max/pipelines/architectures/llama3/gguf.py b/src/max/pipelines/architectures/llama3/gguf.py new file mode 100644 index 0000000000..97255112b2 --- /dev/null +++ b/src/max/pipelines/architectures/llama3/gguf.py @@ -0,0 +1,468 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Build a Llama3 model via Graph API from GGUF weights.""" + +from __future__ import annotations + +import math +from dataclasses import dataclass +from typing import List, Literal, Optional + +import numpy as np +from max.dtype import DType +from max.graph import ( + DeviceRef, + Graph, + TensorValue, + TensorValueLike, + ops, +) +from max.graph.quantization import QuantizationEncoding +from max.graph.weights import Weights +from max.pipelines import PipelineConfig, RopeType, WeightsFormat +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, + KVCacheStrategy, +) +from max.pipelines.nn import ( + MLP, + AttentionWithRope, + DistributedAttentionWithRope, + DistributedMLP, + DistributedRMSNorm, + DistributedTransformer, + DistributedTransformerBlock, + Embedding, + Linear, + LinearV2, + OptimizedRotaryEmbedding, + RMSNorm, + VocabParallelEmbedding, +) +from max.pipelines.nn.layer import Layer + + +def distribute_value( + v: TensorValue, devices: List[DeviceRef] +) -> List[TensorValue]: + return [v.to(device) for device in devices] + + +def shard_col_value( + x: TensorValueLike, devices: List[DeviceRef] +) -> List[TensorValue]: + n_devices = len(devices) + v = TensorValue(x) + col_size = int(v.shape[1]) // n_devices + return [ + v[:, i * col_size : (i + 1) * col_size].to(device) + for i, device in enumerate(devices) + ] + + +def shard_row_value( + x: TensorValueLike, devices: List[DeviceRef] +) -> List[TensorValue]: + n_devices = len(devices) + v = TensorValue(x) + row_size = int(v.shape[0]) // n_devices + return [ + v[i * row_size : (i + 1) * row_size, :].to(device) + for i, device in enumerate(devices) + ] + + +@dataclass +class Phi3MLP(Layer): + """ + A multi-layer perceptron composed of two linear layers. Where the + gate_up_proj is a stacked linear layer which contains the up_proj and + gate_proj. This is used by the Phi3 models. + """ + + gate_up_proj: Linear + down_proj: Linear + + def __call__(self, x: TensorValue) -> TensorValue: + up_states = self.gate_up_proj(x) + + gate = up_states[:, : up_states.shape.static_dims[0] // 2] + up_states = up_states[:, up_states.shape.static_dims[0] // 2 :] + + return self.down_proj(ops.silu(gate) * up_states) + + +def rms_norm(dims: int, eps: float, weights: Weights) -> RMSNorm: + return RMSNorm(weights.weight.allocate(DType.float32, [dims]), eps) + + +@dataclass +class LayerNorm(Layer): + """Layer normalization block.""" + + gamma: TensorValue + beta: TensorValue + eps: float = 1e-5 + + def __call__(self, input: TensorValue): + return ops.cast( + ops.layer_norm( + ops.cast(input, DType.float32), + gamma=ops.cast(self.gamma, DType.float32), + beta=ops.cast(self.beta, DType.float32), + epsilon=self.eps, + ), + input.dtype, + ) + + +def layer_norm(dims: int, eps: float = 1e-5) -> LayerNorm: + gamma = ops.constant(np.ones(dims), DType.float32) + beta = ops.constant(np.zeros(dims), DType.float32) + return LayerNorm(gamma, beta, eps=eps) + + +def norm( + norm_method: Literal["rms_norm"] | Literal["layer_norm"], + pipeline_config: PipelineConfig, + weights: Weights, + weight_name: str, +) -> RMSNorm | LayerNorm: + if norm_method == "rms_norm": + if pipeline_config.huggingface_config.model_type == "exaone": + rms_norm_eps = pipeline_config.huggingface_config.layer_norm_epsilon + else: + rms_norm_eps = pipeline_config.huggingface_config.rms_norm_eps + + return rms_norm( + pipeline_config.huggingface_config.hidden_size, + rms_norm_eps, + weights[weight_name], + ) + else: + return layer_norm(pipeline_config.huggingface_config.hidden_size) + + +def distributed_norm( + norm_method: Literal["rms_norm"] | Literal["layer_norm"], + pipeline_config: PipelineConfig, + weights: Weights, + weight_name: str, + devices: List[DeviceRef], +) -> DistributedRMSNorm: + assert norm_method == "rms_norm" + + weights_ = TensorValue( + weights[weight_name].weight.allocate( + DType.float32, + [pipeline_config.huggingface_config.hidden_size], + ) + ) + weights_devs = distribute_value(weights_, devices) + + rms_norms = [ + RMSNorm(weights_dev, pipeline_config.huggingface_config.rms_norm_eps) + for weights_dev in weights_devs + ] + + return DistributedRMSNorm(rms_norms, devices) + + +def embedding( + pipeline_config: PipelineConfig, + vocab_size: int, + hidden_dim: int, + weights: Weights, +) -> Embedding: + if pipeline_config.quantization_encoding == "gptq": + return Embedding( + weights.weight.allocate( + DType.bfloat16, + [vocab_size, hidden_dim], + None, + ) + ) + + else: + return Embedding( + weights.weight.allocate( + pipeline_config.dtype, + [vocab_size, hidden_dim], + pipeline_config.graph_quantization_encoding, + ) + ) + + +def distributed_feed_forward( + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + hidden_dim: int, + feed_forward_length: int, + weights: Weights, + devices: List[DeviceRef], +) -> DistributedMLP: + w_ffn_down_full = weights.ffn_down.weight.allocate( + dtype, [hidden_dim, feed_forward_length], quantization_encoding + ) + ffn_down_sharded = shard_col_value(w_ffn_down_full, devices) + w_ffn_gate_full = weights.ffn_gate.weight.allocate( + dtype, [feed_forward_length, hidden_dim], quantization_encoding + ) + ffn_gate_sharded = shard_row_value(w_ffn_gate_full, devices) + w_ffn_up_full = weights.ffn_up.weight.allocate( + dtype, [feed_forward_length, hidden_dim], quantization_encoding + ) + ffn_up_sharded = shard_row_value(w_ffn_up_full, devices) + + mlps = [ + MLP( + Linear(ffn_gate_sharded[rank]), + Linear(ffn_down_sharded[rank]), + Linear(ffn_up_sharded[rank]), + ) + for rank in range(len(devices)) + ] + + return DistributedMLP(mlps, len(devices)) + + +def distributed_attention_opaque( + kv_params: KVCacheParams, + pipeline_config: PipelineConfig, + rope: OptimizedRotaryEmbedding, + weights: Weights, + layer_idx: TensorValue, + devices: List[DeviceRef], +) -> DistributedAttentionWithRope: + wq_full = ops.transpose( + weights.attn_q.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.hidden_size, + pipeline_config.huggingface_config.hidden_size, + ], + pipeline_config.graph_quantization_encoding, + ), + 0, + 1, + ) + kv_weight_dim = ( + pipeline_config.huggingface_config.hidden_size + // pipeline_config.huggingface_config.num_attention_heads + ) * pipeline_config.huggingface_config.num_key_value_heads + wk_full = ops.transpose( + weights.attn_k.weight.allocate( + pipeline_config.dtype, + [kv_weight_dim, pipeline_config.huggingface_config.hidden_size], + pipeline_config.graph_quantization_encoding, + ), + 0, + 1, + ) + wv_full = ops.transpose( + weights.attn_v.weight.allocate( + pipeline_config.dtype, + [kv_weight_dim, pipeline_config.huggingface_config.hidden_size], + pipeline_config.graph_quantization_encoding, + ), + 0, + 1, + ) + + wo_full = weights.attn_output.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.hidden_size, + pipeline_config.huggingface_config.hidden_size, + ], + pipeline_config.graph_quantization_encoding, + ) + wq_shards = shard_col_value(wq_full, devices) + wk_shards = shard_col_value(wk_full, devices) + wv_shards = shard_col_value(wv_full, devices) + + # Didn't transpose here since linear will transpose so shard on col instead + # of row + wo_shards = shard_col_value(wo_full, devices) + attns = [ + AttentionWithRope( + n_heads=pipeline_config.huggingface_config.num_attention_heads + // len(devices), + kv_params=kv_params, + wqkv=ops.concat( + (wq_shards[rank], wk_shards[rank], wv_shards[rank]), axis=1 + ).transpose(0, 1), + wo=Linear(wo_shards[rank]), + rope=rope, + layer_idx=layer_idx, + scale=math.sqrt(1.0 / kv_params.head_dim), + ) + for rank in range(len(devices)) + ] + + return DistributedAttentionWithRope(attns, devices) + + +def _kv_collection_constructor( + kv_params: KVCacheParams, +) -> FetchContinuousBatchingKVCacheCollection | FetchPagedKVCacheCollection: + """Gets the fetch KV collection based on the KV cache strategy. + + Returns: + Callable that stages an op to fetch a KV cache collection. + + Raises: + ValueError: If the cache strategy is unsupported. + """ + if kv_params.cache_strategy == KVCacheStrategy.CONTINUOUS: + return FetchContinuousBatchingKVCacheCollection(kv_params) + elif kv_params.cache_strategy == KVCacheStrategy.PAGED: + return FetchPagedKVCacheCollection(kv_params) + + msg = f"Unsupported caching strategy {kv_params.cache_strategy}" + raise ValueError(msg) + + +def distributed_transformer_opaque( + graph: Graph, + pipeline_config: PipelineConfig, + weights: Weights, + max_seq_len: int, + kv_params: KVCacheParams, + norm_method: Literal["rms_norm"] | Literal["layer_norm"], +) -> DistributedTransformer: + devices = [ + DeviceRef(spec.device_type, spec.id) + for spec in pipeline_config.device_specs + ] + with graph: + if weights.rope_freqs.weight.exists(): + rope_scaling = weights.rope_freqs.weight.raw_tensor() + else: + rope_scaling = None + + interleaved_rope_weights = ( + pipeline_config.weights_format == WeightsFormat.gguf + and pipeline_config.rope_type == RopeType.normal + ) + partial_rotary_factor = getattr( + pipeline_config.huggingface_config, "partial_rotary_factor", 1 + ) + rope = OptimizedRotaryEmbedding( + dim=pipeline_config.huggingface_config.hidden_size, + n_heads=partial_rotary_factor + * pipeline_config.huggingface_config.num_attention_heads, + theta=pipeline_config.huggingface_config.rope_theta, + max_seq_len=max_seq_len, + rope_scaling=rope_scaling, + interleaved=interleaved_rope_weights, + ) + + layers = [ + DistributedTransformerBlock( + attention=distributed_attention_opaque( + kv_params, + pipeline_config, + rope, + weights.blk[i], + layer_idx=ops.constant(i, DType.uint32), + devices=devices, + ), + mlp=distributed_feed_forward( + pipeline_config.dtype, + pipeline_config.graph_quantization_encoding, + pipeline_config.huggingface_config.hidden_size, + pipeline_config.huggingface_config.intermediate_size, + weights.blk[i], + devices=devices, + ), + attention_norm=distributed_norm( + norm_method, + pipeline_config, + weights.blk[i], + "attn_norm", + devices=devices, + ), + mlp_norm=distributed_norm( + norm_method, + pipeline_config, + weights.blk[i], + "ffn_norm", + devices=devices, + ), + devices=devices, + ) + for i in range(pipeline_config.huggingface_config.num_hidden_layers) + ] + + # TODO(max.nn.Model): We still rely on the `Weights` mechanism for + # constructing the Python-side weights registry. + # So we have to "allocate" a spot in the weights registry for + # output/embedding weights here. + embedding_weight = weights.token_embd.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.vocab_size, + pipeline_config.huggingface_config.hidden_size, + ], + ) + weights.output.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.vocab_size, + pipeline_config.huggingface_config.hidden_size, + ], + ) + + embedding_layer = VocabParallelEmbedding( + vocab_size=pipeline_config.huggingface_config.vocab_size, + hidden_dim=pipeline_config.huggingface_config.hidden_size, + dtype=pipeline_config.dtype, + devices=devices, + # Use the embedding weight's name, which mismatches between + # Safetensors and GGUF Llama 3. + name=embedding_weight.name, + ) + + output = LinearV2( + in_dim=pipeline_config.huggingface_config.hidden_size, + out_dim=pipeline_config.huggingface_config.vocab_size, + dtype=pipeline_config.dtype, + # Only compute output embedding on device 0 for now. + # TODO(MODELS-378): More optimal would be to: + # - Shard embedding table across devices. + # - Compute output on all devices for multistep. + device=devices[0], + # Smaller model variants lack dedicated weights for a final linear + # layer, and share the embedding layer. + name=( + weights.output.name + if weights.output.weight.exists() + else embedding_layer.weight.name + ), + ) + + return DistributedTransformer( + dim=pipeline_config.huggingface_config.hidden_size, + n_heads=pipeline_config.huggingface_config.num_attention_heads, + layers=layers, + norm=norm(norm_method, pipeline_config, weights, "output_norm"), # type:ignore + output=output, + embedding=embedding_layer, + kv_params=kv_params, + kv_collection_constructor=_kv_collection_constructor(kv_params), + devices=devices, + all_logits=pipeline_config.enable_echo, + ) diff --git a/src/max/pipelines/architectures/llama3/llama3.py b/src/max/pipelines/architectures/llama3/llama3.py new file mode 100644 index 0000000000..a35e90e60a --- /dev/null +++ b/src/max/pipelines/architectures/llama3/llama3.py @@ -0,0 +1,198 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Build a Llama3 model that uses continuous or paged kv-caching""" + +from __future__ import annotations + +import functools +from typing import Callable, Literal, Optional + +import numpy as np +from max.dtype import DType +from max.graph import DeviceRef, TensorValue +from max.graph.quantization import QuantizationConfig, QuantizationEncoding +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, + KVCacheStrategy, +) +from max.pipelines.nn import ( + AttentionWithRopeV2, + EmbeddingV2, + GPTQAttentionWithRope, + GPTQLinearV2, + LayerV2, + LinearV2, + OptimizedRotaryEmbedding, + RMSNormV2, + Transformer, + TransformerBlock, +) + +from .naive_llama3 import ConstantLayerNorm, Llama3MLP, StackedMLP + + +class Llama3(Transformer): + def __init__( + self, + *, + hidden_size: int, + num_attention_heads: int, + num_key_value_heads: int, + num_hidden_layers: int, + rope_theta: float, + max_seq_len: int, + intermediate_size: int, + interleaved_rope_weights: bool, + rope_scaling: Optional[np.ndarray], + vocab_size: int, + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + quantization_config: Optional[QuantizationConfig], + kv_params: KVCacheParams, + all_logits: bool, + norm_method: Literal["rms_norm"] | Literal["layer_norm"], + rms_norm_eps: Optional[float], + tie_word_embeddings: bool, + stacked_mlp: bool, + stacked_qkv: bool, + logits_postprocessor: Callable[[TensorValue], TensorValue] | None, + attention_multiplier: float, + embedding_multiplier: float, + residual_multiplier: float, + devices: list[DeviceRef], + clip_qkv: Optional[float], + ): + rope = OptimizedRotaryEmbedding( + dim=hidden_size, + n_heads=num_attention_heads, + theta=rope_theta, + max_seq_len=max_seq_len, + rope_scaling=rope_scaling, + interleaved=interleaved_rope_weights, + ) + create_norm: Callable[..., LayerV2] + if norm_method == "rms_norm": + if rms_norm_eps is None: + raise ValueError( + "rms_norm_eps cannot be None for model that uses RMSNorm." + ) + create_norm = functools.partial( + RMSNormV2, hidden_size, rms_norm_eps + ) + else: + create_norm = functools.partial(ConstantLayerNorm, hidden_size) + + linear_cls: Callable[..., LinearV2] + if quantization_config: + linear_cls = functools.partial( + GPTQLinearV2, quantization_config=quantization_config + ) + else: + linear_cls = LinearV2 + mlp_cls = StackedMLP if stacked_mlp else Llama3MLP + attention_cls: Callable[..., AttentionWithRopeV2] + if quantization_config: + attention_cls = functools.partial( + GPTQAttentionWithRope, + quantization_config=quantization_config, + scale=attention_multiplier, + ) + else: + attention_cls = functools.partial( + AttentionWithRopeV2, + stacked_qkv=stacked_qkv, + scale=attention_multiplier, + clip_qkv=clip_qkv, + ) + + layers = [ + TransformerBlock( + attention=attention_cls( + num_attention_heads=num_attention_heads, + num_key_value_heads=num_key_value_heads, + hidden_size=hidden_size, + kv_params=kv_params, + layer_idx=i, + dtype=dtype, + rope=rope, + linear_cls=linear_cls, + device=devices[0], + ), + mlp=mlp_cls( + dtype, + quantization_encoding, + hidden_size, + intermediate_size, + linear_cls, + # devices=devices, # TODO(kathywu): setting devices causes issues + ), + attention_norm=create_norm(), + mlp_norm=create_norm(), + residual_multiplier=residual_multiplier, + ) + for i in range(num_hidden_layers) + ] + + # Create Embedding and output layers. + embedding_output_dtype = dtype + embedding_output_quantization = quantization_encoding + if quantization_encoding == QuantizationEncoding.GPTQ: + embedding_output_dtype = DType.bfloat16 + embedding_output_quantization = None + + embedding_layer = EmbeddingV2( + vocab_size, + hidden_size, + embedding_output_dtype, + None, # TODO(kathywu): setting devices causes issues + quantization_encoding=embedding_output_quantization, + ) + output = LinearV2( + hidden_size, + vocab_size, + embedding_output_dtype, + None, # TODO(kathywu): setting devices causes issues + quantization_encoding=embedding_output_quantization, + ) + + if tie_word_embeddings: + output.set_shared_weight("weight", embedding_layer.weight) + + kv_collection_cls: ( + type[FetchContinuousBatchingKVCacheCollection] + | type[FetchPagedKVCacheCollection] + ) + if kv_params.cache_strategy == KVCacheStrategy.CONTINUOUS: + kv_collection_cls = FetchContinuousBatchingKVCacheCollection + elif kv_params.cache_strategy == KVCacheStrategy.PAGED: + kv_collection_cls = FetchPagedKVCacheCollection + else: + raise ValueError( + "Unsupported caching strategy " + str(kv_params.cache_strategy) + ) + + super().__init__( + dim=hidden_size, + n_heads=num_attention_heads, + layers=layers, + norm=create_norm(), + output=output, + embedding=embedding_layer, + kv_params=kv_params, + kv_collection_constructor=kv_collection_cls(kv_params), + all_logits=all_logits, + embedding_multiplier=embedding_multiplier, + logits_postprocessor=logits_postprocessor, + ) diff --git a/src/max/pipelines/architectures/llama3/model.py b/src/max/pipelines/architectures/llama3/model.py new file mode 100644 index 0000000000..eeff3afa16 --- /dev/null +++ b/src/max/pipelines/architectures/llama3/model.py @@ -0,0 +1,817 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import math +import time +from typing import Any, Callable, List, Literal, Sequence, cast + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession, Model +from max.graph import DeviceRef, Graph, TensorType, TensorValue +from max.graph.weights import Weights +from max.pipelines import ( + LogProbabilities, + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + RopeType, + SupportedEncoding, + TextContext, + WeightsFormat, + upper_bounded_default, +) +from max.pipelines.dataprocessing import batch_padded_tokens_and_mask +from max.pipelines.kv_cache import ( + KVCacheInputs, + KVCacheManager, + KVCacheParams, + estimate_kv_cache_size, + load_kv_manager, +) +from max.pipelines.nn import Signals +from max.pipelines.nn.compute_log_probabilities import compute_log_probabilities + +from .gguf import distributed_transformer_opaque +from .llama3 import Llama3 +from .naive_llama3 import NaiveLlama3 +from .weight_adapters import LlamaSafetensorWeights + +logger = logging.getLogger("max.pipelines") + + +class Llama3Inputs(ModelInputs): + """A class representing inputs for the Llama3 model. + + This class encapsulates the input tensors required for the Llama3 model + execution. + """ + + tokens: np.ndarray | Tensor + """Tensor containing the input token IDs.""" + + input_row_offsets_or_attn_mask: np.ndarray | Tensor + """Tensor containing the offsets for each row in the ragged input sequence, + or the attention mask for the padded input sequence.""" + + signal_buffers: list[Tensor] + """Device buffers used for synchronization in communication collectives.""" + + def __init__( + self, + tokens: np.ndarray | Tensor, + input_row_offsets_or_attn_mask: np.ndarray | Tensor, + signal_buffers: list[Tensor], + ) -> None: + """ + Args: + tokens: Input token IDs. + input_row_offsets_or_attn_mask: Input row offsets (ragged tensors) + or attention mask (padded tensors). + signal_buffers: Device buffers used for synchronization in + communication collectives. + """ + self.tokens = tokens + self.input_row_offsets_or_attn_mask = input_row_offsets_or_attn_mask + self.signal_buffers = signal_buffers + + @property + def input_row_offsets(self) -> np.ndarray | Tensor: + """Gets the row offsets of the ragged input sequence.""" + # TODO(bduke): this should implement a ragged tensor interface. + return self.input_row_offsets_or_attn_mask + + +class LlamaModelBase(PipelineModel[TextContext]): + """Base Llama pipeline model implementation.""" + + model: Model + """Compiled and initialized model ready for inference.""" + + signal_buffers: list[Tensor] + """Device buffers used for synchronization in communication collectives.""" + + norm_method: Literal["rms_norm"] | Literal["layer_norm"] + """Normalization layer.""" + + logits_postprocessor: Callable[[TensorValue], TensorValue] | None = None + """Postprocessor for the logits.""" + + state_dict: dict[str, Any] + """Weights to load into the model.""" + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + """ + Args: + pipeline_config: The configuration for this pipeline. + session: The container for the runtime for this model. + """ + super().__init__(pipeline_config, session) + self.model = self.load_model(session) + + # Initialize state needed for communication collectives. + self.signal_buffers = ( + [ + Tensor.zeros( + shape=(Signals.NUM_BYTES,), + dtype=DType.uint8, + device=dev, + ) + for dev in pipeline_config.devices + ] + if len(pipeline_config.devices) > 1 + # Skip creating buffers for single-device, where communication + # collectives shouldn't be called. + else [] + ) + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.num_key_value_heads, + head_dim=( + pipeline_config.huggingface_config.hidden_size + // pipeline_config.huggingface_config.num_attention_heads + ), + page_size=pipeline_config.kv_cache_page_size, + cache_strategy=pipeline_config.cache_strategy, + enable_prefix_caching=pipeline_config.enable_prefix_caching, + n_devices=len(pipeline_config.devices), + ) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return pipeline_config.huggingface_config.num_hidden_layers + + def execute( + self, + model_inputs: ModelInputs, + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + model_inputs = cast(Llama3Inputs, model_inputs) + if kv_cache_inputs is None: + kv_cache_inputs = () # type: ignore + model_outputs = self.model.execute( + model_inputs.tokens, + model_inputs.input_row_offsets_or_attn_mask, + *model_inputs.signal_buffers, + *kv_cache_inputs, # type: ignore + copy_inputs_to_device=( + not self.pipeline_config.cache_strategy.uses_opaque() + ), + ) + + if self.pipeline_config.enable_echo: + return ModelOutputs( + next_token_logits=cast(Tensor, model_outputs[0]), + logits=cast(Tensor, model_outputs[1]), + ) + else: + return ModelOutputs( + next_token_logits=cast(Tensor, model_outputs[0]) + ) + + def _prepare_ragged_initial_token_inputs( + self, context_batch: Sequence[TextContext] + ) -> Llama3Inputs: + # Get input_row_offsets: start and end position of each batch in the + # combined total_seq_len dimension. + input_row_offsets = np.cumsum( + [0] + [ctx.active_length for ctx in context_batch], + dtype=np.uint32, + ) + + # Create a ragged token vector of length: sum(len(t) for t in tokens). + tokens = np.concatenate([ctx.next_tokens for ctx in context_batch]) + + return Llama3Inputs( + tokens=Tensor.from_numpy(tokens).to( + self.pipeline_config.devices[0] + ), + input_row_offsets_or_attn_mask=Tensor.from_numpy( + input_row_offsets + ).to(self.pipeline_config.devices[0]), + signal_buffers=self.signal_buffers, + ) + + def _prepare_padded_initial_token_inputs( + self, context_batch: Sequence[TextContext] + ) -> Llama3Inputs: + # Get tokens and seq_ids + tokens = [ctx.next_tokens for ctx in context_batch] + + # Pad tokens and compute attention mask for the batch. + max_seq_len = self.kv_manager.max_sequence_length + start_pos = [max_seq_len] * len(context_batch) + next_tokens_batch, _, attn_mask = batch_padded_tokens_and_mask( + start_pos=start_pos, + tokens=tokens, + pad_to_multiple_of=self.pipeline_config.pad_to_multiple_of, + ) + + return Llama3Inputs( + tokens=next_tokens_batch, + input_row_offsets_or_attn_mask=attn_mask, + signal_buffers=self.signal_buffers, + ) + + def prepare_initial_token_inputs( + self, context_batch: Sequence[TextContext] + ) -> Llama3Inputs: + """Prepare the inputs for the first pass in multistep execution.""" + if self.pipeline_config.cache_strategy.uses_opaque(): + return self._prepare_ragged_initial_token_inputs(context_batch) + else: + return self._prepare_padded_initial_token_inputs(context_batch) + + def _prepare_ragged_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: Llama3Inputs, + ) -> Llama3Inputs: + row_offsets_size = ( + prev_model_inputs.input_row_offsets_or_attn_mask.shape[0] + ) + next_row_offsets = self._input_row_offsets_prealloc[:row_offsets_size] + + return Llama3Inputs( + tokens=next_tokens, + input_row_offsets_or_attn_mask=next_row_offsets, + signal_buffers=self.signal_buffers, + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> Llama3Inputs: + """Prepare the inputs for the next token in multistep execution. + This should avoid any device synchronization or copy operations. + """ + prev_model_inputs = cast(Llama3Inputs, prev_model_inputs) + if self.pipeline_config.cache_strategy.uses_opaque(): + return self._prepare_ragged_next_token_inputs( + next_tokens, prev_model_inputs + ) + else: + # TODO(MODELS-407): Consider deleting the padded path entirely. + msg = "multistep unsupported for padded token batches" + raise ValueError(msg) + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.max_position_embeddings, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for Llama3, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_position_embeddings " + f"({pipeline_config.huggingface_config.max_position_embeddings})." + ) + raise ValueError(msg) from e + + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: int, + ) -> KVCacheManager: + return load_kv_manager( + params=self.get_kv_params(self.pipeline_config), + max_batch_size=self.pipeline_config.max_batch_size, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + num_layers=self.pipeline_config.huggingface_config.num_hidden_layers, + devices=self.pipeline_config.devices, + available_cache_memory=available_cache_memory, + page_size=self.pipeline_config.kv_cache_page_size, + session=session, + ) + + @classmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: List[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + return estimate_kv_cache_size( + params=cls.get_kv_params(pipeline_config), + max_batch_size=pipeline_config.max_batch_size, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=pipeline_config.huggingface_config.num_hidden_layers, + available_cache_memory=available_cache_memory, + devices=devices, + ) + + def load_model( + self, + session: InferenceSession, + ) -> Model: + # Pre-allocate a buffer for input_row_offsets in multistep execution. + # We do this to avoid materializing and copying a buffer with each multistep step + assert self.pipeline_config.max_batch_size, ( + "Expected max_batch_size to be set" + ) + self._input_row_offsets_prealloc = Tensor.from_numpy( + np.arange(self.pipeline_config.max_batch_size + 1, dtype=np.uint32) + ).to(self.pipeline_config.devices[0]) + + # Read in weights. + self._weights = self.pipeline_config.load_weights() + + if serialized_path := self.pipeline_config.serialized_model_path: + # Hydrate all weights to be referenced by the serialized path. + weights_registry = {} + for name, weight in self._weights.items(): + weights_registry[name] = weight.raw_tensor() + + logger.info("Loading serialized model from %s", serialized_path) + + return session.load( + serialized_path, weights_registry=weights_registry + ) + + else: + logger.info("Building and compiling model...") + before = time.perf_counter() + graph = self._build_graph(self._weights) + model = session.load(graph, weights_registry=self.state_dict) + after = time.perf_counter() + logger.info( + f"Building and compiling model took {after - before:.6f} seconds" + ) + if ( + export_path + := self.pipeline_config.save_to_serialized_model_path + ): + logger.info("Exporting serialized model to %s", export_path) + model._export_mef(export_path) + return model + + def _unflatten_kv_inputs( + self, kv_inputs_flat: Sequence[TensorValue] + ) -> List[tuple[TensorValue, ...]]: + kv_params = self.get_kv_params(self.pipeline_config) + n_devices = kv_params.n_devices + fetch_types = self.kv_manager.input_symbols()[0] + len_of_kv_tuple_per_dev = len(list(fetch_types)) + kv_caches_per_dev = [ + tuple( + kv_inputs_flat[ + i * len_of_kv_tuple_per_dev : (i + 1) + * len_of_kv_tuple_per_dev + ] + ) + for i in range(n_devices) + ] + return kv_caches_per_dev + + @property + def _attention_multiplier(self) -> float: + """The attention multiplier is a scalar that scales the attention scores. + It is used to control the variance of the attention scores. + + This function is used to get the attention multiplier from the + huggingface config. If the attention multiplier is not set, it will be + calculated as the square root of 1.0 divided by the head dimension. + """ + return getattr( + self.pipeline_config.huggingface_config, + "attention_multiplier", + math.sqrt(1.0 / self.get_kv_params(self.pipeline_config).head_dim), + ) + + def _build_opaque_graph(self, weights: Weights) -> Graph: + device0 = self.pipeline_config.devices[0] + device_ref = DeviceRef(device0.label, device0.id) + tokens_type = TensorType( + DType.int64, shape=["total_seq_len"], device=device_ref + ) + # NOTE: input_row_offsets_len should be batch_size + 1. + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"], device=device_ref + ) + + huggingface_config = self.pipeline_config.huggingface_config + + if len(self.pipeline_config.devices) > 1: + kv_cache_args = self.kv_manager.input_symbols() + flattened_kv_types = [ + kv_type for sublist in kv_cache_args for kv_type in sublist + ] + + # Create metadata for signal buffers. + signals = Signals( + devices=( + DeviceRef(d.label, d.id) + for d in self.pipeline_config.devices + ) + ) + + # Distributed Llama still uses GGUF weights, so make sure that + # safetensor weights are converted to GGUF. + if self.pipeline_config.weights_format == WeightsFormat.safetensors: + weights = LlamaSafetensorWeights.from_safetensor_weights( + weights, huggingface_config + ) + with Graph( + getattr(huggingface_config, "model_type", "llama3"), + input_types=[ + tokens_type, + input_row_offsets_type, + *signals.input_types(), + *flattened_kv_types, + ], + ) as graph: + distributed_model = distributed_transformer_opaque( + graph=graph, + pipeline_config=self.pipeline_config, + weights=weights, + max_seq_len=self.calculate_max_seq_len( + self.pipeline_config + ), + kv_params=self.get_kv_params(self.pipeline_config), + norm_method=self.norm_method, + ) + self.state_dict = weights.allocated_weights + tokens, input_row_offsets, *variadic_args = graph.inputs + + # Multi-GPU passes a signal buffer per device: unmarshal those. + signal_buffers = [ + v.buffer + for v in variadic_args[: len(self.pipeline_config.devices)] + ] + + # Unmarshal the remaining arguments, which are for KV cache. + kv_cache = [ + v.tensor + for v in variadic_args[len(self.pipeline_config.devices) :] + ] + + kv_caches_per_dev = self._unflatten_kv_inputs(kv_cache) + + outputs = distributed_model( + tokens.tensor, + signal_buffers, + kv_caches_per_dev, + input_row_offsets=input_row_offsets, + ) + graph.output(*outputs) + return graph + else: + adapter = self.pipeline_config._weight_adapters.get( + self.pipeline_config.weights_format + ) + if adapter: + state_dict = adapter( + dict(weights.items()), + huggingface_config=huggingface_config, + pipeline_config=self.pipeline_config, + ) + else: + state_dict = { + key: value.data() for key, value in weights.items() + } + + if ( + rope_freqs := state_dict.pop("rope_freqs.weight", None) + ) is not None: + rope_scaling = rope_freqs.data + else: + rope_scaling = None + + interleaved_rope_weights = ( + self.pipeline_config.weights_format == WeightsFormat.gguf + and self.pipeline_config.rope_type == RopeType.normal + ) + rms_norm_eps = None + if self.norm_method == "rms_norm": + if huggingface_config.model_type == "exaone": + rms_norm_eps = huggingface_config.layer_norm_epsilon + else: + rms_norm_eps = huggingface_config.rms_norm_eps + + device_refs = [ + DeviceRef(spec.device_type, spec.id) + for spec in self.pipeline_config.device_specs + ] + + # When tie_word_embeddings=True, the embedding weights are shared with + # the output weights. + tie_word_embeddings = ( + getattr(huggingface_config, "tie_word_embeddings", False) + or "lm_head.weight" not in state_dict + ) + embedding_multiplier = getattr( + huggingface_config, "embedding_multiplier", 1.0 + ) + residual_multiplier = getattr( + huggingface_config, "residual_multiplier", 1.0 + ) + nn_model = Llama3( + hidden_size=huggingface_config.hidden_size, + num_attention_heads=huggingface_config.num_attention_heads, + num_key_value_heads=huggingface_config.num_key_value_heads, + num_hidden_layers=huggingface_config.num_hidden_layers, + rope_theta=huggingface_config.rope_theta, + rms_norm_eps=rms_norm_eps, + intermediate_size=huggingface_config.intermediate_size, + interleaved_rope_weights=interleaved_rope_weights, + rope_scaling=rope_scaling, + vocab_size=huggingface_config.vocab_size, + dtype=self.pipeline_config.dtype, + quantization_encoding=self.pipeline_config.graph_quantization_encoding, + quantization_config=self.pipeline_config._quant_config, + all_logits=self.pipeline_config.enable_echo, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + kv_params=self.get_kv_params(self.pipeline_config), + norm_method=self.norm_method, + tie_word_embeddings=tie_word_embeddings, + stacked_mlp="layers.0.mlp.gate_up_proj.weight" in state_dict, + stacked_qkv="layers.0.self_attn.qkv_proj.weight" in state_dict, + logits_postprocessor=self.logits_postprocessor, + attention_multiplier=self._attention_multiplier, + embedding_multiplier=embedding_multiplier, + residual_multiplier=residual_multiplier, + devices=device_refs, + clip_qkv=getattr( + self.pipeline_config.huggingface_config, "clip_qkv", None + ), + ) + nn_model.load_state_dict(state_dict) + self.state_dict = nn_model.state_dict() + with Graph( + "llama3", + input_types=[ + tokens_type, + input_row_offsets_type, + *self.kv_manager.input_symbols()[0], + ], + ) as graph: + tokens, input_row_offsets, *kv_cache_inputs = graph.inputs + outputs = nn_model( + tokens.tensor, + [inp.tensor for inp in kv_cache_inputs], + input_row_offsets=input_row_offsets, + ) + graph.output(*outputs) + return graph + + def _build_graph(self, weights: Weights) -> Graph: + if self.pipeline_config.cache_strategy.uses_opaque(): + return self._build_opaque_graph(weights) + + tokens_type = TensorType(DType.int64, shape=["batch_size", "seq_len"]) + attn_mask_type = TensorType( + DType.float32, shape=["batch_size", "seq_len", "post_seq_len"] + ) + + if len(self.pipeline_config.devices) > 1: + raise ValueError( + "Naive mode does not support distributed execution" + ) + + kv_inputs = self.kv_manager.input_symbols()[0] + + interleaved_rope_weights = ( + self.pipeline_config.weights_format == WeightsFormat.gguf + and self.pipeline_config.rope_type == RopeType.normal + ) + adapter = self.pipeline_config._weight_adapters.get( + self.pipeline_config.weights_format + ) + huggingface_config = self.pipeline_config.huggingface_config + if adapter: + state_dict = adapter( + dict(weights.items()), + huggingface_config=huggingface_config, + pipeline_config=self.pipeline_config, + ) + else: + state_dict = {key: value.data() for key, value in weights.items()} + if ( + rope_freqs := state_dict.pop("rope_freqs.weight", None) + ) is not None: + rope_scaling = rope_freqs.data + else: + rope_scaling = None + + rms_norm_eps = None + if self.norm_method == "rms_norm": + if huggingface_config.model_type == "exaone": + rms_norm_eps = huggingface_config.layer_norm_epsilon + else: + rms_norm_eps = huggingface_config.rms_norm_eps + + device_refs = [ + DeviceRef(spec.device_type, spec.id) + for spec in self.pipeline_config.device_specs + ] + + # When tie_word_embeddings=True, the embedding weights are shared with + # the output weights. + tie_word_embeddings = ( + getattr(huggingface_config, "tie_word_embeddings", False) + or "lm_head.weight" not in state_dict + ) + embedding_multiplier = getattr( + huggingface_config, "embedding_multiplier", 1.0 + ) + residual_multiplier = getattr( + huggingface_config, "residual_multiplier", 1.0 + ) + nn_model = NaiveLlama3( + hidden_size=huggingface_config.hidden_size, + num_attention_heads=huggingface_config.num_attention_heads, + num_key_value_heads=huggingface_config.num_key_value_heads, + num_hidden_layers=huggingface_config.num_hidden_layers, + rope_theta=huggingface_config.rope_theta, + rms_norm_eps=rms_norm_eps, + intermediate_size=huggingface_config.intermediate_size, + interleaved_rope_weights=interleaved_rope_weights, + rope_scaling=rope_scaling, + vocab_size=huggingface_config.vocab_size, + dtype=self.pipeline_config.dtype, + quantization_encoding=self.pipeline_config.graph_quantization_encoding, + quantization_config=self.pipeline_config._quant_config, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + kv_params=self.get_kv_params(self.pipeline_config), + norm_method=self.norm_method, + tie_word_embeddings=tie_word_embeddings, + stacked_mlp="layers.0.mlp.gate_up_proj.weight" in state_dict, + stacked_qkv="layers.0.self_attn.qkv_proj.weight" in state_dict, + logits_postprocessor=self.logits_postprocessor, + attention_multiplier=self._attention_multiplier, + embedding_multiplier=embedding_multiplier, + residual_multiplier=residual_multiplier, + devices=device_refs, + clip_qkv=getattr( + self.pipeline_config.huggingface_config, "clip_qkv", None + ), + ) + + # Load weights. We allow the weight types to be overriden due to + # multiple quantization enodings in GGUF checkpoints. + nn_model.load_state_dict( + state_dict, override_quantization_encoding=True + ) + self.state_dict = nn_model.state_dict() + + with Graph( + getattr(huggingface_config, "model_type", "llama3"), + input_types=[ + tokens_type, + attn_mask_type, + *kv_inputs, + ], + ) as graph: + tokens, attention_mask, k_cache, v_cache, start_pos, _ = ( + graph.inputs + ) + mask_dtype = ( + self.pipeline_config.dtype + if self.pipeline_config.quantization_encoding + in [ + SupportedEncoding.float32, + SupportedEncoding.bfloat16, + ] + else ( + DType.float32 + if self.pipeline_config.devices[0].label == "cpu" + else DType.bfloat16 + ) + ) + logits = nn_model( + tokens.tensor, + attention_mask.tensor.cast(mask_dtype), + k_cache.buffer, + v_cache.buffer, + start_pos.tensor, + )[0] + + if self.pipeline_config.enable_echo: + graph.output(logits[:, -1], logits) + else: + graph.output(logits[:, -1]) + + return graph + + def compute_log_probabilities( + self, + model_inputs: ModelInputs, + model_outputs: ModelOutputs, + next_tokens: Tensor, + batch_top_n: list[int], + batch_echo: list[bool], + ) -> list[LogProbabilities | None] | None: + if any(echo for echo in batch_echo): + if model_outputs.logits is None: + logger.warning( + "Could not get logprobs with echo because the full logits" + f" were not returned by {self.pipeline_config.model_path}" + " model. Please ensure that this model is started with " + "`--enable-echo`." + ) + assert not self.pipeline_config.enable_echo, ( + "Echo was enabled but logits were not returned." + ) + return None + logits = model_outputs.logits.to_numpy() + + llama3_inputs = cast(Llama3Inputs, model_inputs) + next_token_logits = cast( + Tensor, model_outputs.next_token_logits + ).to_numpy() + + sampled_tokens = next_tokens.to_numpy() + if self.pipeline_config.cache_strategy.uses_opaque(): + # Handle the ragged inputs + tokens = cast(Tensor, llama3_inputs.tokens).to_numpy() + input_row_offsets = cast( + Tensor, llama3_inputs.input_row_offsets + ).to_numpy() + + def _get_logits_and_samples( + batch_index: int, echo: bool + ) -> tuple[np.ndarray, np.ndarray]: + if echo: + start_offset = input_row_offsets[batch_index] + end_offset = input_row_offsets[batch_index + 1] + batch_logits = logits[start_offset:end_offset] + samples = np.concatenate( + ( + tokens[start_offset + 1 : end_offset], + sampled_tokens[batch_index : batch_index + 1], + ) + ) + else: + batch_logits = next_token_logits[ + batch_index : batch_index + 1 + ] + samples = sampled_tokens[batch_index : batch_index + 1] + return batch_logits, samples + + else: + # Handle batched inputs. Llama pads them to the right so the seq + # lengths can be computed by finding the first 0 token. + tokens = cast(np.ndarray, llama3_inputs.tokens) + seq_lens = np.sum(tokens > 0, axis=1) + + def _get_logits_and_samples( + batch_index: int, echo: bool + ) -> tuple[np.ndarray, np.ndarray]: + if echo: + seq_len = seq_lens[batch_index] + padded_tokens = tokens[batch_index] + + batch_logits = logits[batch_index, :seq_len, :] + samples = np.concatenate( + ( + padded_tokens[1:seq_len], + sampled_tokens[batch_index : batch_index + 1], + ) + ) + else: + batch_logits = next_token_logits[ + batch_index : batch_index + 1, : + ] + samples = sampled_tokens[batch_index : batch_index + 1] + return batch_logits, samples + + return compute_log_probabilities( + _get_logits_and_samples, batch_top_n, batch_echo + ) + + +class Llama3Model(LlamaModelBase): + """Llama 3 pipeline model implementation.""" + + norm_method: Literal["rms_norm"] | Literal["layer_norm"] = "rms_norm" + """Normalization layer.""" + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) diff --git a/src/max/pipelines/architectures/llama3/naive_llama3.py b/src/max/pipelines/architectures/llama3/naive_llama3.py new file mode 100644 index 0000000000..c79badcbde --- /dev/null +++ b/src/max/pipelines/architectures/llama3/naive_llama3.py @@ -0,0 +1,317 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Builds a Llama3 model that uses naive KV-caching.""" + +from __future__ import annotations + +import functools +from collections.abc import Sequence +from typing import Callable, Literal, Optional, Union + +import numpy as np +from max.dtype import DType +from max.graph import DeviceRef, TensorValue, ops +from max.graph.quantization import QuantizationConfig, QuantizationEncoding +from max.pipelines.kv_cache import KVCacheParams +from max.pipelines.nn import ( + MLPV2, + EmbeddingV2, + GPTQLinearV2, + LayerV2, + LinearV2, + NaiveAttentionWithRope, + NaiveTransformer, + NaiveTransformerBlock, + OptimizedRotaryEmbedding, + RMSNormV2, + RotaryEmbedding, +) + + +class ConstantLayerNorm(LayerV2): + """Layer normalization block with constant gamma and beta values.""" + + gamma: np.ndarray + beta: np.ndarray + eps: float = 1e-5 + + def __init__(self, dims, eps: float = 1e-5): + super().__init__() + self.gamma = np.ones(dims) + self.beta = np.zeros(dims) + self.eps = eps + + def __call__(self, input: TensorValue): + gamma = ops.constant(self.gamma, DType.float32) + beta = ops.constant(self.beta, DType.float32) + return ops.cast( + ops.layer_norm( + ops.cast(input, DType.float32), + gamma=gamma, + beta=beta, + epsilon=self.eps, + ), + input.dtype, + ) + + +class NaiveLlama3(NaiveTransformer): + def __init__( + self, + *, + hidden_size: int, + num_attention_heads: int, + num_key_value_heads: int, + num_hidden_layers: int, + rope_theta: float, + max_seq_len: int, + rms_norm_eps: Optional[float], + intermediate_size: int, + interleaved_rope_weights: bool, + rope_scaling: Optional[np.ndarray], + vocab_size: int, + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + quantization_config: Optional[QuantizationConfig], + kv_params: KVCacheParams, + norm_method: Literal["rms_norm"] | Literal["layer_norm"], + tie_word_embeddings: bool, + stacked_mlp: bool, + stacked_qkv: bool, + logits_postprocessor: Callable[[TensorValue], TensorValue] | None, + attention_multiplier: float, + embedding_multiplier: float, + residual_multiplier: float, + devices: list[DeviceRef], + clip_qkv: float | None, + ): + if stacked_qkv: + raise ValueError( + "Stacked QKV is not supported with naive caching strategy." + ) + rope = RotaryEmbedding( + dim=hidden_size, + n_heads=num_attention_heads, + theta=rope_theta, + max_seq_len=max_seq_len, + rope_scaling=rope_scaling, + interleaved=interleaved_rope_weights, + ) + + create_norm: Callable[..., LayerV2] + if norm_method == "rms_norm": + if rms_norm_eps is None: + raise ValueError( + "rms_norm_eps cannot be None for model that uses RMSNorm." + ) + create_norm = functools.partial( + RMSNormV2, hidden_size, rms_norm_eps + ) + else: + create_norm = functools.partial(ConstantLayerNorm, hidden_size) + + linear_cls: Callable[..., LinearV2] + if quantization_config: + linear_cls = functools.partial( + GPTQLinearV2, quantization_config=quantization_config + ) + else: + linear_cls = LinearV2 + + mlp_cls = StackedMLP if stacked_mlp else Llama3MLP + layers = [ + NaiveTransformerBlock( + attention=NaiveLLama3Attention( + kv_params, + hidden_size, + num_attention_heads, + num_key_value_heads, + rope, + dtype, + quantization_encoding, + linear_cls, + scale=attention_multiplier, + device=devices[0], + clip_qkv=clip_qkv, + ), + mlp=mlp_cls( + dtype, + quantization_encoding, + hidden_size, + intermediate_size, + linear_cls, + devices=devices, + ), + attention_norm=create_norm(), + mlp_norm=create_norm(), + residual_multiplier=residual_multiplier, + ) + for i in range(num_hidden_layers) + ] + + embedding_layer = EmbeddingV2( + vocab_size, + hidden_size, + dtype, + devices[0], + quantization_encoding=quantization_encoding, + ) + + output = LinearV2( + hidden_size, + vocab_size, + dtype, + devices[0], + quantization_encoding=quantization_encoding, + ) + if tie_word_embeddings: + output.set_shared_weight("weight", embedding_layer.weight) + + super().__init__( + dim=hidden_size, + n_heads=num_attention_heads, + layers=layers, + norm=create_norm(), + output=output, + theta=rope_theta, + embedding=embedding_layer, + embedding_multiplier=embedding_multiplier, + logits_postprocessor=logits_postprocessor, + ) + + +class NaiveLLama3Attention(NaiveAttentionWithRope): + def __init__( + self, + kv_params: KVCacheParams, + hidden_size: int, + num_attention_heads: int, + num_key_value_heads: int, + rope: Union[OptimizedRotaryEmbedding, RotaryEmbedding], + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + linear_cls: Callable[..., LinearV2], + scale: float | None, + device: DeviceRef, + clip_qkv: float | None, + ): + kv_weight_dim = ( + hidden_size // num_attention_heads + ) * num_key_value_heads + + super().__init__( + n_heads=num_attention_heads, + kv_params=kv_params, + dim=hidden_size, + wk=linear_cls( + in_dim=hidden_size, + out_dim=kv_weight_dim, + dtype=dtype, + device=device, + quantization_encoding=quantization_encoding, + ), + wv=linear_cls( + in_dim=hidden_size, + out_dim=kv_weight_dim, + dtype=dtype, + device=device, + quantization_encoding=quantization_encoding, + ), + wq=linear_cls( + in_dim=hidden_size, + out_dim=hidden_size, + dtype=dtype, + device=device, + quantization_encoding=quantization_encoding, + ), + wo=linear_cls( + in_dim=hidden_size, + out_dim=hidden_size, + dtype=dtype, + device=device, + quantization_encoding=quantization_encoding, + ), + rope=rope, + scale=scale, + clip_qkv=clip_qkv, + ) + + +class Llama3MLP(MLPV2): + def __init__( + self, + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + hidden_dim: int, + feed_forward_length: int, + linear_cls: Callable[..., LinearV2], + devices: Sequence[DeviceRef] = (), + ): + super().__init__( + gate_proj=linear_cls( + in_dim=hidden_dim, + out_dim=feed_forward_length, + dtype=dtype, + device=devices[0] if devices else None, + quantization_encoding=quantization_encoding, + ), + down_proj=linear_cls( + in_dim=feed_forward_length, + out_dim=hidden_dim, + dtype=dtype, + device=devices[0] if devices else None, + quantization_encoding=quantization_encoding, + ), + up_proj=linear_cls( + in_dim=hidden_dim, + out_dim=feed_forward_length, + dtype=dtype, + device=devices[0] if devices else None, + quantization_encoding=quantization_encoding, + ), + ) + + +class StackedMLP(LayerV2): + def __init__( + self, + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + hidden_dim: int, + feed_forward_length: int, + linear_cls: Callable[..., LinearV2], + devices: Sequence[DeviceRef] = (), + ): + super().__init__() + self.gate_up_proj = linear_cls( + in_dim=hidden_dim, + out_dim=feed_forward_length * 2, + dtype=dtype, + device=devices[0] if devices else None, + quantization_encoding=quantization_encoding, + ) + self.down_proj = linear_cls( + in_dim=feed_forward_length, + out_dim=hidden_dim, + dtype=dtype, + device=devices[0] if devices else None, + quantization_encoding=quantization_encoding, + ) + + def __call__(self, x: TensorValue) -> TensorValue: + up_states = self.gate_up_proj(x) + + gate = up_states[:, : up_states.shape.static_dims[0] // 2] + up_states = up_states[:, up_states.shape.static_dims[0] // 2 :] + + return self.down_proj(ops.silu(gate) * up_states) diff --git a/src/max/pipelines/architectures/llama3/weight_adapters.py b/src/max/pipelines/architectures/llama3/weight_adapters.py new file mode 100644 index 0000000000..fb3831322a --- /dev/null +++ b/src/max/pipelines/architectures/llama3/weight_adapters.py @@ -0,0 +1,289 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import math +from functools import cached_property +from os import PathLike +from typing import Sequence + +import numpy as np +import torch +from max.dtype import DType +from max.graph.weights import SafetensorWeights, WeightData, Weights +from max.graph.weights._torch_dtype_map import ( + modular_to_torch_type, + torch_to_modular_type, +) +from max.pipelines import PipelineConfig +from transformers import LlamaConfig + + +def _compute_safetensor_rope_scaling( + huggingface_config: LlamaConfig, +) -> np.ndarray | None: + # Unlike the `transformers` library's Llama model, MAX Llama expects the + # rope scaling value to be in the state dict (this is similar to GGUF). + if rope_scaling := getattr(huggingface_config, "rope_scaling", None): + if rope_scaling.get("rope_type", "").lower() == "llama3": + return _compute_rope_scaling( + rope_scaling, huggingface_config + ).numpy() + return None + + +# Maps from Safetensor to MAX weight names. +LLAMA_SAFETENSOR_MAPPING = { + "model.": "", # Removes the "model" prefix. + "g_idx": "perm_idx", # Specific to Llama GPT-Q weights. +} + + +def convert_safetensor_state_dict( + state_dict: dict[str, Weights], + huggingface_config: LlamaConfig, + pipeline_config: PipelineConfig, + **unused_kwargs, +) -> dict[str, WeightData]: + new_state_dict: dict[str, WeightData] = {} + # Map the weight names. + for safetensor_name, value in state_dict.items(): + max_name = safetensor_name + for before, after in LLAMA_SAFETENSOR_MAPPING.items(): + max_name = max_name.replace(before, after) + new_state_dict[max_name] = value.data() + # Add rope scaling to the state dict. + rope_scaling = _compute_safetensor_rope_scaling(huggingface_config) + if rope_scaling is not None: + new_state_dict["rope_freqs.weight"] = WeightData.from_numpy( + rope_scaling, "rope_freqs.weight" + ) + if pipeline_config._quant_config: + # hack: argsort the perm_idx array + for key, weight_data in new_state_dict.items(): + if key.endswith("perm_idx"): + new_state_dict[key] = WeightData.from_numpy( + np.argsort(weight_data.data).astype(np.int32), key + ) + return new_state_dict + + +# Maps from GGUF to MAX weight names. +LLAMA_GGUF_MAPPING = { + "token_embd": "embed_tokens", + "blk": "layers", + "ffn_up": "mlp.up_proj", + "ffn_down": "mlp.down_proj", + "ffn_gate": "mlp.gate_proj", + "ffn_norm": "post_attention_layernorm", + "attn_norm": "input_layernorm", + "attn_q": "self_attn.q_proj", + "attn_v": "self_attn.v_proj", + "attn_k": "self_attn.k_proj", + "attn_output": "self_attn.o_proj", + "output.weight": "lm_head.weight", + "output_norm": "norm", +} + + +def convert_gguf_state_dict( + state_dict: dict[str, Weights], **unused_kwargs +) -> dict[str, WeightData]: + new_state_dict: dict[str, WeightData] = {} + # Map the weight names. + for gguf_name, value in state_dict.items(): + max_name = gguf_name + for before, after in LLAMA_GGUF_MAPPING.items(): + max_name = max_name.replace(before, after) + new_state_dict[max_name] = value.data() + return new_state_dict + + +def _compute_rope_scaling( + rope_scaling, huggingface_config: LlamaConfig +) -> torch.Tensor: + # From llama.cpp's HF to GGUF conversion script: + # https://github.com/ggerganov/llama.cpp/blob/40c6d79fb52f995f47507fedfeaae2ac05d9b35c/convert_hf_to_gguf.py#L1627-L1654 + base = huggingface_config.rope_theta + dim = huggingface_config.head_dim + freqs = 1.0 / (base ** (torch.arange(0, dim, 2, dtype=torch.float32) / dim)) + + factor = rope_scaling.get("factor", 8.0) + low_freq_factor = rope_scaling.get("low_freq_factor", 1.0) + high_freq_factor = rope_scaling.get("high_freq_factor", 4.0) + old_context_len = rope_scaling.get("original_max_position_embeddings", 8192) + + low_freq_wavelen = old_context_len / low_freq_factor + high_freq_wavelen = old_context_len / high_freq_factor + assert low_freq_wavelen != high_freq_wavelen + + rope_factors = [] + for freq in freqs: + wavelen = 2 * math.pi / freq + if wavelen < high_freq_wavelen: + rope_factors.append(1) + elif wavelen > low_freq_wavelen: + rope_factors.append(factor) + else: + smooth = (old_context_len / wavelen - low_freq_factor) / ( + high_freq_factor - low_freq_factor + ) + rope_factors.append(1 / ((1 - smooth) / factor + smooth)) + return torch.tensor(rope_factors, dtype=torch.float32) + + +# Required for Multi-GPU LLama3 until it is migrated to new Layers API + +# Map from GGUF tensor names to Safetensor names. +# https://github.com/huggingface/transformers/blob/7bbc62474391aff64f63fcc064c975752d1fa4de/src/transformers/integrations/ggml.py#L36 +LLAMA_GGUF_TENSOR_MAPPING = { + "token_embd": "model.embed_tokens", + "blk": "model.layers", + "ffn_up": "mlp.up_proj", + "ffn_down": "mlp.down_proj", + "ffn_gate": "mlp.gate_proj", + "ffn_norm": "post_attention_layernorm", + "attn_norm": "input_layernorm", + "attn_q": "self_attn.q_proj", + "attn_v": "self_attn.v_proj", + "attn_k": "self_attn.k_proj", + "attn_output": "self_attn.o_proj", + "output.weight": "lm_head.weight", + "output_norm": "model.norm", +} + + +class LlamaSafetensorWeights(SafetensorWeights): + """Loads Safetensor weights with GGUF names. + + Does the following when loading weights: + (1) converts Safetensor weight names to and from GGUF names. For example, + the GGUF weight "blk.{i}.attn_q.weight" is instead saved as + "model.layers.{i}.self_attn.q_proj.weight" in Safetensor. + (2) Computes the rope_freqs.weight using the HuggingFace config + (3) Transposes the q_proj and k_proj weights. + + """ + + def __init__( + self, + filepaths: Sequence[PathLike], + huggingface_config: LlamaConfig, + has_rope_scaling: bool, + rope_freqs_tensor: torch.Tensor | None, + **kwargs, + ): + super().__init__(filepaths, **kwargs) + self._gguf_name_map = LLAMA_GGUF_TENSOR_MAPPING + self._huggingface_config = huggingface_config + self._has_rope_scaling = has_rope_scaling + self._rope_freqs_tensor = rope_freqs_tensor + + @classmethod + def from_safetensor_weights( + cls, weights: Weights, huggingface_config: LlamaConfig + ): + assert isinstance(weights, SafetensorWeights) + has_rope_scaling = False + rope_freqs_tensor = None + if rope_scaling := getattr(huggingface_config, "rope_scaling", None): + if rope_scaling.get("rope_type", "").lower() == "llama3": + has_rope_scaling = True + rope_freqs_tensor = _compute_rope_scaling( + rope_scaling, huggingface_config + ) + return cls( + weights._filepaths, + huggingface_config=huggingface_config, + has_rope_scaling=has_rope_scaling, + rope_freqs_tensor=rope_freqs_tensor, + tensors=weights._tensors, + tensors_to_file_idx=weights._tensors_to_file_idx, + prefix="", + allocated=weights._allocated, + _st_weight_map=weights._st_weight_map, + ) + + def items(self): + """Iterate through all allocable weights that start with the prefix.""" + # `self._tensor` contains Safetensor names, but the Llama pipeline + # expects GGUF names so this function should return GGUF names. + for safetensor_name in self._tensors: + if safetensor_name.startswith(self.name): + gguf_name = safetensor_name + + # The _gguf_name_map maps gguf -> safetensor names. + # We want the reverse transformation from safetensor -> gguf. + for after, before in self._gguf_name_map.items(): + gguf_name = gguf_name.replace(before, after) + yield ( + gguf_name, + LlamaSafetensorWeights( + self._filepaths, + huggingface_config=self._huggingface_config, + has_rope_scaling=self._has_rope_scaling, + rope_freqs_tensor=self._rope_freqs_tensor, + tensors=self._tensors, + tensors_to_file_idx=self._tensors_to_file_idx, + prefix=gguf_name, + allocated=self._allocated, + _st_weight_map=self._st_weight_map, + ), + ) + + @cached_property + def name(self) -> str: + """The current weight name or prefix.""" + # Convert the prefix, which follows the GGUF naming pattern, to + # Safetensor weight name. + name = self._prefix + for before, after in self._gguf_name_map.items(): + name = name.replace(before, after) + return name + + def __getattr__(self, attr) -> LlamaSafetensorWeights: + if self._prefix: + full_path = f"{self._prefix}.{attr}" + else: + full_path = str(attr) + return LlamaSafetensorWeights( + self._filepaths, + huggingface_config=self._huggingface_config, + has_rope_scaling=self._has_rope_scaling, + rope_freqs_tensor=self._rope_freqs_tensor, + tensors=self._tensors, + tensors_to_file_idx=self._tensors_to_file_idx, + prefix=full_path, + allocated=self._allocated, + _st_weight_map=self._st_weight_map, + ) + + def exists(self) -> bool: + return self.name in self._tensors_to_file_idx or ( + self._has_rope_scaling and self.name == "rope_freqs.weight" + ) + + def _load_tensor(self, dtype: DType | None = None): + if self._has_rope_scaling and self.name == "rope_freqs.weight": + tensor = self._rope_freqs_tensor + assert isinstance(tensor, torch.Tensor) + if ( + dtype is not None + and torch_to_modular_type(tensor.dtype) != dtype + ): + tensor = tensor.to(modular_to_torch_type(dtype)) + return tensor + tensor = super()._load_tensor(dtype) + + return tensor diff --git a/src/max/pipelines/architectures/llama_vision/README.md b/src/max/pipelines/architectures/llama_vision/README.md new file mode 100644 index 0000000000..d0656223e0 --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/README.md @@ -0,0 +1,138 @@ +# Llama 3.2 Vision + +**Language:** Python + +**API**: MAX Graph + +This pipeline provides optimized support for the +`MllamaForConditionalGeneration` family of multimodal models, as exemplified +by the Llama 3.2 Vision multimodal text generation model. The model itself has +been constructed in Python using the +[MAX Graph API](https://docs.modular.com/max/graph/). + +The MAX Graph API provides an accessible interface to the construction of +flexible accelerated compute graphs, which are then optimized by the MAX +Engine's advanced graph compiler. This pipeline showcases how a multimodal +model can be fully defined using Python and MAX Graphs and then compiled for +optimal inference performance via the MAX Engine. + +> [!NOTE] +> This pipeline is under active development, and while many layers have been +> implemented, the entire pipeline is not fully functional at present. + +## Model + +[Llama 3.2 Vision](https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/) +is an open source multimodal model released by Meta. It handles both text and +image input, and allows for text generation based on those multimodal inputs. +This implementation is based on +[the version located on Hugging Face](https://huggingface.co/blog/llama32), and +follows its convention of only attending to a single image at a time. + +Note that the Llama 3.2 1B and 3B text-only models use the `LlamaForCausalLM` +architecture, which is covered in [our Llama 3.x pipeline](../../llama3/). + +The default settings for this pipeline use the 11B set of pretrained weights in +the `bfloat16` encoding. + +## Usage + +The easiest way to try out this pipeline is with our Magic command-line tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this pipeline's + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/pipelines + ``` + +3. Host a multimodal chat completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + You can configure the pipeline to be hosted by using the `serve` command. + Weights hosted on Hugging Face for any compatible + `MllamaForConditionalGeneration` model can be used with this optimized + architecture. For example: + + ```shell + magic run serve --model-path meta-llama/Llama-3.2-11B-Vision-Instruct + ``` + + A request can be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "meta-llama/Llama-3.2-11B-Vision-Instruct", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": [ + {"type": "text", "text": "What is in this image?"}, + {"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}} + ]} + ] + }' + ``` + +## Options + +The following command-line options are available to customize operation of the +pipeline: + +- `--model-path`: Specify the repository ID of a Hugging Face model + repository to use. This is used to load tokenizers, architectures and model + weights. +- `--force-download`: Specify whether to force a download of configuration + files and weights even if they already exist in the local cache. Set this + if you want to ensure you have the correct version of the model. +- `--max-batch-size`: Specifies the maximum batch size to be used. + Default is 1. +- `--max-ce-batch-size`: Set the maximum cache size reserved for a single + context encoding batch. The effective limit will be the lesser of this value + and `max-cache-batch-size`. + Default is 32. +- `--max-length`: Controls the maximum length of the text sequence (includes the + input tokens). Defaults to huggingface model config's max sequence length. +- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 + value is provided, the model will continue to generate tokens for the entire + context length. (Default value: -1) +- `--quantization-encoding`: The encoding to use for a datatype that can be + quantized to a low bits per weight format. + Valid values: `q4_0`, `q4_k`, `q6_k`, `bfloat16`, `float32`. + (Default value: `bfloat16`). +- `--save-to-serialized-model-path`: If specified, writes the serialized model + to this path. +- `--serialized-model-path`: If specified, tries to load a serialized model + from this path. +- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. +- `--trust-remote-code`: Indicate whether to allow custom modeling files from + Hugging Face repositories. Set this to true with caution, as it may + introduce security risks. +- `--weight-path`: Overrides the default URL, and allows for an + already-downloaded pretrained weight file to be used with the model. +- `--devices`: Specifies the device(s) to use for the model. This can optionally + be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". + Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/llama_vision/__init__.py b/src/max/pipelines/architectures/llama_vision/__init__.py new file mode 100644 index 0000000000..10bbcab277 --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import llama_vision_arch + +__all__ = ["llama_vision_arch"] diff --git a/src/max/pipelines/architectures/llama_vision/arch.py b/src/max/pipelines/architectures/llama_vision/arch.py new file mode 100644 index 0000000000..a1ac78137d --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/arch.py @@ -0,0 +1,36 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + SupportedArchitecture, + SupportedEncoding, + TextAndVisionTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from .llama_vision import LlamaVision + +llama_vision_arch = SupportedArchitecture( + name="MllamaForConditionalGeneration", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=["meta-llama/Llama-3.2-11B-Vision-Instruct"], + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.bfloat16: [KVCacheStrategy.CONTINUOUS] + }, + pipeline_model=LlamaVision, + tokenizer=TextAndVisionTokenizer, + default_weights_format=WeightsFormat.safetensors, +) diff --git a/src/max/pipelines/architectures/llama_vision/attention.py b/src/max/pipelines/architectures/llama_vision/attention.py new file mode 100644 index 0000000000..7129da3b7f --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/attention.py @@ -0,0 +1,107 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""An attention layer used in Llama 3.2 vision pipeline.""" + +import math +from dataclasses import dataclass + +from max.graph import TensorValue, ops +from max.pipelines.nn import Linear +from max.pipelines.nn.layer import Layer + + +@dataclass +class Attention(Layer): + n_heads: int + head_dim: int + + wq: Linear + wk: Linear + wv: Linear + wo: Linear + + def attention( + self, + xq: TensorValue, + xk: TensorValue, + xv: TensorValue, + attn_mask: TensorValue, + ) -> TensorValue: + # Broadcast the attention mask across heads. + # Do so in the graph so that the broadcast can be fused into downstream + # ops. + batch, _, seq_len, post_seq_len = attn_mask.shape + attn_mask = attn_mask.broadcast_to( + ( + batch, + self.n_heads, + seq_len, + post_seq_len, + ) + ) + + scale = math.sqrt(1.0 / self.head_dim) + scores = xq @ ops.transpose(xk, -2, -1) + # Note, the graph compiler currently requires the order of operands + # to be `scores * scale` in order to pattern match the fused attention + # operator. + scores = ops.softmax(scores * scale + attn_mask) + + return scores @ xv + + def __call__( + self, x: TensorValue, attention_mask: TensorValue + ) -> TensorValue: + """Computes attention on x, reusing the KV cache. + + Args: + x: Activations with shape (batch, seq_len, dim). + Returns the result of multi-headed self attention on the input. + """ + batch, seq_len = x.shape[0], x.shape[1] + # matmul weights + xq = self.wq(x) + xk = self.wk(x) + xv = self.wv(x) + + xq = ops.reshape(xq, [batch, seq_len, self.n_heads, self.head_dim]) + + xk = ops.reshape( + xk, + [ + batch, + seq_len, + self.n_heads, + self.head_dim, + ], + ) + xv = ops.reshape( + xv, + [ + batch, + seq_len, + self.n_heads, + self.head_dim, + ], + ) + + xq = xq.transpose(1, 2) + xk = xk.transpose(1, 2) + xv = xv.transpose(1, 2) + + # (1, 16, 4128, 80) -> (1, 4128, 16, 80) + attn_out = self.attention(xq, xk, xv, attention_mask).transpose(1, 2) + output = attn_out.reshape( + [batch, seq_len, self.n_heads * self.head_dim] + ) # (1, 4128, 16 * 80) + return self.wo(output) diff --git a/src/max/pipelines/architectures/llama_vision/cross_attention_decoder.py b/src/max/pipelines/architectures/llama_vision/cross_attention_decoder.py new file mode 100644 index 0000000000..d4635f2a3c --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/cross_attention_decoder.py @@ -0,0 +1,173 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Llama 3.2 Transformer Vision Language Model cross attention decoder.""" + +from __future__ import annotations + +import math +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import TensorValue, Weight, ops +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + KVCacheParams, +) +from max.pipelines.nn import MLP, RMSNorm +from max.pipelines.nn.kernels import ( + MHAMaskVariant, + cross_attention_ragged, + matmul_kv_cache_ragged, + rms_norm_key_cache, +) +from max.pipelines.nn.layer import Layer +from max.pipelines.nn.linear import Linear + + +@dataclass +class CrossSdpaAttention(Layer): + """Cross attention layer using SDPA (Scaled Dot Product Attention).""" + + n_heads: int + """The number of attention heads.""" + + kv_params: KVCacheParams + """KV Cache Params, including the number of kv heads, the head dim, and data type.""" + + layer_idx: int + """Index into the cross attention layers' KV cache.""" + + q_proj: Linear + """A linear layer for the query projection.""" + + wk: Weight + """The k weight vector. Combines with wv to form a Linear.""" + + wv: Weight + """The v weight vector. Combines with wk to form a Linear.""" + + o_proj: Linear + """A linear layer for the output projection.""" + + q_norm: RMSNorm + """Layer normalization.""" + + k_norm: RMSNorm + """Layer normalization.""" + + def __call__( + self, + hidden_states: TensorValue, + hidden_input_row_offsets: TensorValue, + hidden_max_seq_len: TensorValue, + cross_attention_states: TensorValue, + cross_input_row_offsets: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + ) -> TensorValue: + """Computes attention on hidden (query) and cross (key and value). + + Returns: + Attended hidden activation. + """ + wkv = ops.concat((self.wk, self.wv), axis=0) + + query_states = self.q_proj(hidden_states) + query_states = query_states.reshape( + [ + -1, + self.n_heads, + self.kv_params.head_dim, + ] + ) + query_states = self.q_norm(query_states) + + matmul_kv_cache_ragged( + kv_params=self.kv_params, + # Here, hidden_states correspond to cross_attention_states. + hidden_states=cross_attention_states, + layer_idx=self.layer_idx, + input_row_offsets=cross_input_row_offsets, + weight=wkv, + kv_collection=kv_collection, + ) + rms_norm_key_cache( + self.kv_params, + kv_collection, + gamma=ops.cast(self.k_norm.weight, hidden_states.dtype), + epsilon=self.k_norm.eps, + layer_idx=self.layer_idx, + # Use the total sequence length of the cross attention states. + total_seq_len=cross_attention_states.shape[0], + input_row_offsets=cross_input_row_offsets, + ) + + # Calculate Flash Attention. + attn_out = cross_attention_ragged( + self.kv_params, + input=query_states, + kv_collection=kv_collection, + layer_idx=ops.constant(self.layer_idx, DType.uint32), + input_row_offsets=hidden_input_row_offsets, + # Use the null mask to attend to all vision tokens. + mask_variant=MHAMaskVariant.NULL_MASK, + kv_input_row_offsets=cross_input_row_offsets, + q_max_seq_len=hidden_max_seq_len, + scale=math.sqrt(1.0 / self.kv_params.head_dim), + ) + + # Reshape back to (hidden total seq len, hidden size). + attn_out = ops.reshape(attn_out, shape=[hidden_states.shape[0], -1]) + + return self.o_proj(attn_out) + + +@dataclass +class CrossAttentionDecoderLayer(Layer): + """Cross-attention transformer block with tanh-gated attention and feedforward.""" + + cross_attn: CrossSdpaAttention + input_layernorm: RMSNorm + cross_attn_attn_gate: Weight + mlp: MLP + post_attention_layernorm: RMSNorm + cross_attn_mlp_gate: Weight + + def __call__( + self, + hidden_states: TensorValue, + hidden_input_row_offsets: TensorValue, + hidden_max_seq_len: TensorValue, + cross_attention_states: TensorValue, + cross_input_row_offsets: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + ) -> TensorValue: + residual = hidden_states + hidden_states = self.input_layernorm(hidden_states) + + hidden_states = self.cross_attn( + hidden_states, + hidden_input_row_offsets, + hidden_max_seq_len, + cross_attention_states, + cross_input_row_offsets, + kv_collection, + ) + hidden_states = ( + residual + ops.tanh(self.cross_attn_attn_gate) * hidden_states + ) + + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + return residual + ops.tanh(self.cross_attn_mlp_gate) * hidden_states diff --git a/src/max/pipelines/architectures/llama_vision/encoder.py b/src/max/pipelines/architectures/llama_vision/encoder.py new file mode 100644 index 0000000000..604057c531 --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/encoder.py @@ -0,0 +1,105 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Llama 3.2 Transformer Vision Encoder.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.nn import LayerNorm +from max.pipelines.nn.layer import Layer + +from .attention import Attention +from .mlp import MLP + + +@dataclass +class VisionEncoderLayer(Layer): + """ + This class implements a layer within Llama 3.2 vision transformer encoder. + """ + + mlp: MLP + input_layernorm: LayerNorm + post_attention_layernorm: LayerNorm + self_attn: Attention + is_gated: bool = False + gate_attn: TensorValueLike | None = None + gate_ffn: TensorValueLike | None = None + + def __call__( + self, hidden_state: TensorValue, attention_mask: TensorValue + ) -> TensorValue: + # Self Attention. + residual = hidden_state + hidden_state = self.input_layernorm(hidden_state) + + hidden_state = self.self_attn( + x=hidden_state, + attention_mask=attention_mask, + ) + + if self.is_gated: + hidden_state = ops.tanh(self.gate_attn) * hidden_state + hidden_state = residual + hidden_state + + # Feed forward. + residual = hidden_state + hidden_state = self.post_attention_layernorm(hidden_state) + hidden_state = self.mlp(hidden_state) + + # Gating criteria. + if self.is_gated: + hidden_state = ops.tanh(self.gate_ffn) * hidden_state + return residual + hidden_state + + +@dataclass +class VisionEncoder(Layer): + """ + Transformer encoder consisting of # of hidden self attention + layers. Each layer is a [`VisionEncoderLayer`]. + """ + + layers: list[VisionEncoderLayer] + + def __call__( + self, + hidden_states: TensorValue, + attention_mask: TensorValue, + output_hidden_states: bool, + ) -> tuple[TensorValue, tuple[TensorValue] | None]: + r""" + Args: + hidden_states (Tensor of shape `(batch_size, sequence_length, hidden_size)`): + attention_mask (Tensor of shape `(batch_size, sequence_length)`): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more detail. + """ + encoder_states: tuple | None = () if output_hidden_states else None + for encoder_layer in self.layers: + if encoder_states is not None: + encoder_states = encoder_states + (hidden_states,) + hidden_states = encoder_layer(hidden_states, attention_mask) + + if encoder_states is not None: + encoder_states = encoder_states + (hidden_states,) + + return hidden_states, encoder_states diff --git a/src/max/pipelines/architectures/llama_vision/language_model.py b/src/max/pipelines/architectures/llama_vision/language_model.py new file mode 100644 index 0000000000..0d0e282185 --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/language_model.py @@ -0,0 +1,468 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Llama 3.2 Transformer Vision Language Model.""" + +from __future__ import annotations + +import math +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import TensorValue, ops +from max.graph.weights import Weights +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + KVCacheParams, +) +from max.pipelines.nn import ( + MLP, + AttentionWithRopeQKV, + Embedding, + Linear, + OptimizedRotaryEmbedding, + RMSNorm, + TransformerBlock, +) +from max.pipelines.nn.layer import Layer + +from .cross_attention_decoder import ( + CrossAttentionDecoderLayer, + CrossSdpaAttention, +) + + +@dataclass +class TextModel(Layer): + """ + The Llama text model which consists of transformer with self and cross attention layers. + """ + + dtype: DType + kv_params: KVCacheParams + embed_tokens: Embedding + layers: list[CrossAttentionDecoderLayer | TransformerBlock] + norm: RMSNorm + cross_attention_layers: list[int] + rotary_emb: OptimizedRotaryEmbedding + + def __call__( + self, + text_kv_cache_inputs: tuple[TensorValue, ...], + vision_kv_cache_inputs: tuple[TensorValue, ...], + input_ids: TensorValue, + hidden_input_row_offsets: TensorValue, + hidden_max_seq_len: TensorValue, + cross_attention_states: TensorValue, + cross_input_row_offsets: TensorValue, + ) -> TensorValue: + inputs_embeds = self.embed_tokens(input_ids) + + hidden_states = ops.cast(inputs_embeds, self.dtype) + + before_attention_blocks_shape = hidden_states.shape + + # Assume that text and vision KV caches have the same KV params for now. + # So they can share the KV collection constructor object. + kv_collection_constructor = FetchContinuousBatchingKVCacheCollection( + self.kv_params + ) + + # Construct text and vision KV collections with their distinct inputs. + text_kv_collection = kv_collection_constructor(*text_kv_cache_inputs) + vision_kv_collection = kv_collection_constructor( + *vision_kv_cache_inputs + ) + + for decoder_layer in self.layers: + # For text-only path we should skip cross attention layers. + # We expect cross_attention_states to be zeroes if it's a text-only path. + # The underlying implementation should be a no-op when a zeroed out cross + # attention states is passed in. + + if isinstance(decoder_layer, CrossAttentionDecoderLayer): + hidden_states = decoder_layer( + hidden_states, + hidden_input_row_offsets, + hidden_max_seq_len, + cross_attention_states, + cross_input_row_offsets, + vision_kv_collection, + ) + else: + hidden_states = decoder_layer( + hidden_states, + text_kv_collection, + input_row_offsets=hidden_input_row_offsets, + ) + + assert hidden_states.shape == before_attention_blocks_shape + + return self.norm(hidden_states) + + +@dataclass +class CausalLanguageModel(Layer): + """The Llama Vision Text Model with a language modeling head on top.""" + + dtype: DType + kv_params: KVCacheParams + model: TextModel + lm_head: Linear + + def __call__( + self, + text_kv_cache_inputs: tuple[TensorValue, ...], + vision_kv_cache_inputs: tuple[TensorValue, ...], + input_ids: TensorValue, + hidden_input_row_offsets: TensorValue, + hidden_max_seq_len: TensorValue, + cross_attention_states: TensorValue, + cross_input_row_offsets: TensorValue, + ) -> TensorValue: + last_hidden_state = self.model( + text_kv_cache_inputs, + vision_kv_cache_inputs, + input_ids, + hidden_input_row_offsets, + hidden_max_seq_len, + cross_attention_states, + cross_input_row_offsets, + ) + + # For ragged tensors gather the last tokens from packed dim 0. + last_token_indices = hidden_input_row_offsets[1:] - 1 + last_token_logits = ops.gather( + last_hidden_state, last_token_indices, axis=0 + ) + return ops.cast(self.lm_head(last_token_logits), self.dtype) # logits + + +def cross_attention_decoder_layer( + dtype: DType, + num_attention_heads: int, + hidden_size: int, + num_key_value_heads: int, + rms_norm_eps: float, + kv_params: KVCacheParams, + intermediate_size: int, + weights: Weights, + layer_idx: int, +) -> CrossAttentionDecoderLayer: + head_dim = hidden_size // num_attention_heads + sdpa_attn = CrossSdpaAttention( + n_heads=num_attention_heads, + kv_params=kv_params, + layer_idx=layer_idx, + q_proj=Linear( + weights.cross_attn.q_proj.weight.allocate( + dtype, + [ + num_attention_heads * head_dim, + hidden_size, + ], + ), + bias=None, + ), + wk=weights.cross_attn.k_proj.weight.allocate( + dtype, + [ + num_key_value_heads * head_dim, + hidden_size, + ], + ), + wv=weights.cross_attn.v_proj.weight.allocate( + dtype, + [ + num_key_value_heads * head_dim, + hidden_size, + ], + ), + o_proj=Linear( + weight=weights.cross_attn.o_proj.weight.allocate( + dtype, + [ + hidden_size, + num_attention_heads * head_dim, + ], + ), + bias=None, + ), + q_norm=RMSNorm( + weight=weights.cross_attn.q_norm.weight.allocate( + dtype, + [head_dim], + ), + eps=rms_norm_eps, + ), + k_norm=RMSNorm( + weight=weights.cross_attn.k_norm.weight.allocate( + dtype, + [head_dim], + ), + eps=rms_norm_eps, + ), + ) + return CrossAttentionDecoderLayer( + cross_attn=sdpa_attn, + input_layernorm=RMSNorm( + weight=weights.input_layernorm.weight.allocate( + dtype, + [hidden_size], + ), + eps=rms_norm_eps, + ), + cross_attn_attn_gate=weights.cross_attn_attn_gate.allocate( + dtype, + [1], + ), + mlp=MLP( + gate_proj=Linear( + weight=weights.mlp.gate_proj.weight.allocate( + dtype, + [ + intermediate_size, + hidden_size, + ], + ), + bias=None, + ), + down_proj=Linear( + weight=weights.mlp.down_proj.weight.allocate( + dtype, + [ + hidden_size, + intermediate_size, + ], + ), + bias=None, + ), + up_proj=Linear( + weight=weights.mlp.up_proj.weight.allocate( + dtype, + [ + intermediate_size, + hidden_size, + ], + ), + bias=None, + ), + ), + post_attention_layernorm=RMSNorm( + weight=weights.post_attention_layernorm.weight.allocate( + dtype, + [hidden_size], + ), + eps=rms_norm_eps, + ), + cross_attn_mlp_gate=weights.cross_attn_mlp_gate.allocate( + dtype, + [1], + ), + ) + + +def self_attention_decoder_layer( + dtype: DType, + num_attention_heads: int, + hidden_size: int, + num_key_value_heads: int, + intermediate_size: int, + rms_norm_eps: float, + kv_params: KVCacheParams, + weights: Weights, + layer_idx: int, + rotary_embedding: OptimizedRotaryEmbedding, +) -> TransformerBlock: + head_dim = hidden_size // num_attention_heads + + wq = weights.self_attn.q_proj.weight.allocate( + dtype, shape=[num_attention_heads * head_dim, hidden_size] + ) + wk = weights.self_attn.k_proj.weight.allocate( + dtype, shape=[num_key_value_heads * head_dim, hidden_size] + ) + wv = weights.self_attn.v_proj.weight.allocate( + dtype, shape=[num_key_value_heads * head_dim, hidden_size] + ) + o_proj = Linear( + weight=weights.self_attn.o_proj.weight.allocate( + dtype, + shape=[hidden_size, num_attention_heads * head_dim], + ) + ) + + attention = AttentionWithRopeQKV( + n_heads=num_attention_heads, + kv_params=kv_params, + layer_idx=layer_idx, + wq=wq, + wk=wk, + wv=wv, + wo=o_proj, + rope=rotary_embedding, + scale=math.sqrt(1.0 / head_dim), + ) + + return TransformerBlock( + attention=attention, + mlp=MLP( + gate_proj=Linear( + weight=weights.mlp.gate_proj.weight.allocate( + dtype, + [intermediate_size, hidden_size], + ), + bias=None, + ), + down_proj=Linear( + weight=weights.mlp.down_proj.weight.allocate( + dtype, + [hidden_size, intermediate_size], + ), + bias=None, + ), + up_proj=Linear( + weight=weights.mlp.up_proj.weight.allocate( + dtype, + [intermediate_size, hidden_size], + ), + bias=None, + ), + ), + attention_norm=RMSNorm( + weight=weights.input_layernorm.weight.allocate( + dtype, + [hidden_size], + ), + eps=rms_norm_eps, + ), + mlp_norm=RMSNorm( + weight=weights.post_attention_layernorm.weight.allocate( + dtype, [hidden_size] + ), + eps=rms_norm_eps, + ), + ) + + +def instantiate_language_model( + dtype: DType, + hidden_size: int, + n_heads: int, + rope_theta: int, + max_seq_len: int, + num_hidden_layers: int, + cross_attention_layers: list[int], + vocab_size: int, + rms_norm_eps: float, + num_key_value_heads: int, + intermediate_size: int, + kv_params: KVCacheParams, + weights: Weights, +) -> CausalLanguageModel: + layers: list[CrossAttentionDecoderLayer | TransformerBlock] = [] + + # We don't really have a rotary embedding layer within the graph as it's largely + # folded into the custom kernel, but leaving this here for now. + rotary_embedding = OptimizedRotaryEmbedding( + dim=hidden_size, + n_heads=n_heads, + theta=rope_theta, + max_seq_len=max_seq_len, + # TODO: Figure out how we want to pass this + # rope_scaling=params.rope_scaling, + interleaved=False, + ) + + # Track the cross attention KV cache layer index to compute the self + # attention KV layer index. + cross_kv_layer_idx = -1 + for layer_idx in range( + num_hidden_layers, + ): + curr_layer_weight = weights.language_model.model.layers[layer_idx] + + if layer_idx in cross_attention_layers: + cross_kv_layer_idx = cross_attention_layers.index(layer_idx) + layers.append( + cross_attention_decoder_layer( + dtype=dtype, + num_attention_heads=n_heads, + hidden_size=hidden_size, + num_key_value_heads=num_key_value_heads, + rms_norm_eps=rms_norm_eps, + kv_params=kv_params, + intermediate_size=intermediate_size, + weights=curr_layer_weight, + layer_idx=cross_kv_layer_idx, + ) + ) + else: + layers.append( + self_attention_decoder_layer( + dtype=dtype, + num_attention_heads=n_heads, + hidden_size=hidden_size, + num_key_value_heads=num_key_value_heads, + intermediate_size=intermediate_size, + rms_norm_eps=rms_norm_eps, + kv_params=kv_params, + weights=curr_layer_weight, + # Self KV layer index is the total layer index minus the + # number of cross KV layers so far. + layer_idx=layer_idx - cross_kv_layer_idx + 1, + rotary_embedding=rotary_embedding, + ) + ) + + text_model = TextModel( + dtype=dtype, + kv_params=kv_params, + embed_tokens=Embedding( + weights.language_model.model.embed_tokens.weight.allocate( + dtype, + [ + # Upstream in the Huggingface llama reference, 8 is added to the vocab size. + vocab_size + 8, + hidden_size, + ], + ), + ), + norm=RMSNorm( + weight=weights.language_model.model.norm.weight.allocate( + dtype, + [hidden_size], + ), + eps=rms_norm_eps, + ), + layers=layers, + cross_attention_layers=cross_attention_layers, + # TODO: Verify if these values passed are even correct. + rotary_emb=rotary_embedding, + ) + + return CausalLanguageModel( + dtype=dtype, + kv_params=kv_params, + model=text_model, + lm_head=Linear( + weights.language_model.lm_head.weight.allocate( + dtype, + [ + vocab_size, + hidden_size, + ], + ), + bias=None, + ), + ) diff --git a/src/max/pipelines/architectures/llama_vision/llama_vision.py b/src/max/pipelines/architectures/llama_vision/llama_vision.py new file mode 100644 index 0000000000..3dc23904eb --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/llama_vision.py @@ -0,0 +1,1184 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import time +from collections.abc import Sequence +from concurrent.futures import ThreadPoolExecutor +from dataclasses import dataclass +from typing import Any, Iterable, Optional, cast, final + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession, Model +from max.graph import Dim, Graph, Shape, TensorType, TensorValue, ops +from max.graph.weights import Weights +from max.pipelines import ( + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + TextAndVisionContext, + upper_bounded_default, +) +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheManager, + KVCacheInputs, + KVCacheInputSymbols, + KVCacheManager, + KVCacheParams, + KVCacheStrategy, + PaddedKVCacheInputs, + RaggedKVCacheInputs, + estimate_kv_cache_size, + infer_optimal_batch_size, + load_kv_manager, +) +from max.pipelines.kv_cache._utils import build_max_lengths_tensor +from max.pipelines.nn import Linear +from max.pipelines.nn.layer import Layer + +from .language_model import CausalLanguageModel, instantiate_language_model +from .vision_model import instantiate_vision_model + +logger = logging.getLogger("max.pipelines") + + +@dataclass +class MultimodalKVCacheInputSymbols(KVCacheInputSymbols): + text_kv_input_symbols: KVCacheInputSymbols + vision_kv_input_symbols: KVCacheInputSymbols + + +@dataclass +class MultimodalKVCacheInputs(KVCacheInputs): + text_kv_cache_inputs: KVCacheInputs + vision_kv_cache_inputs: KVCacheInputs + + +class MultimodalKVCacheManager(KVCacheManager): + """A lightweight wrapper around text and vision KV managers. + + Note on runtime and graph build time return types: + - Currently the multi modal KV manager doesn't support multiple devices. + So all lists that should be of length num_devices will have length 1. + - Individual modality KV cache managers return a 4-tuple of KV cache inputs. + Since this is a pair of KV cache managers, it returns an 8-tuple, + where the first 4 elements are the text KV cache inputs and the remaining + 4 elements are the vision KV cache inputs. + - This 8-tuple applies for both input symbols and return KV cache inputs. + - TODO(bduke): We should fix both multi-device and multi-modality using an + extensible KVCacheInput type. + """ + + text_kv_manager: KVCacheManager + """KV cache manager for text inputs.""" + + vision_kv_manager: ContinuousBatchingKVCacheManager + """KV cache manager for image inputs.""" + + def __init__( + self, + params: KVCacheParams, + max_batch_size: Optional[int], + text_max_seq_len: int, + vision_max_seq_len: int, + text_num_layers: int, + vision_num_layers: int, + devices: list[Device], + session: InferenceSession, + available_cache_memory: int, + page_size: int, + ) -> None: + assert max_batch_size, "Expected max_batch_size to be set" + self.text_kv_manager = load_kv_manager( + params=params, + max_batch_size=max_batch_size, + max_seq_len=text_max_seq_len, + num_layers=text_num_layers, + devices=devices, + available_cache_memory=available_cache_memory, + page_size=page_size, + session=session, + ) + + # Always use continuous batching KV cache for the vision KV projections, + # since the number of vision tokens is fixed per batch until we support + # multi-image, at least. + self.vision_kv_manager = ContinuousBatchingKVCacheManager( + params=params, + max_batch_size=max_batch_size, + max_seq_len=vision_max_seq_len, + num_layers=vision_num_layers, + devices=devices, + session=session, + ) + + # Call superclass after initializing modality KV managers since the + # superclass ctor calls methods that use the modality KV managers. + super().__init__( + params, + max_batch_size, + text_max_seq_len, + text_num_layers, + devices, + session, + is_ragged=True, + ) + + @classmethod + @final + def estimated_memory_size( + cls, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: list[Device], + **kwargs: Any, + ) -> int: + """Returns the estimated total memory usage of the kv cache.""" + assert "num_vision_layers" in kwargs, "num_vision_layers must be set" + num_vision_layers = kwargs["num_vision_layers"] + assert "max_vision_seq_len" in kwargs, "max_vision_seq_len must be set" + max_vision_seq_len = kwargs["max_vision_seq_len"] + + vision_kv_cache_size = ( + ContinuousBatchingKVCacheManager.estimated_memory_size( + params, + max_batch_size, + max_vision_seq_len, + num_vision_layers, + available_cache_memory, + devices, + ) + ) + + remaining_memory = available_cache_memory - vision_kv_cache_size + if remaining_memory > 0: + text_kv_cache_size = estimate_kv_cache_size( + params, + max_batch_size, + max_seq_len, + num_layers, + remaining_memory, + devices, + ) + return vision_kv_cache_size + text_kv_cache_size + + @classmethod + def infer_optimal_batch_size( + cls, + params: KVCacheParams, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: list[Device], + **kwargs: Any, + ) -> int: + """Returns the estimated optimal batch size for the kv cache.""" + assert "num_vision_layers" in kwargs, "num_vision_layers must be set" + num_vision_layers = kwargs["num_vision_layers"] + assert "max_vision_seq_len" in kwargs, "max_vision_seq_len must be set" + max_vision_seq_len = kwargs["max_vision_seq_len"] + + # figure out the relative sizes of caches based on KV Cach settings + text_size_per_token = num_layers * max_seq_len + vision_size_per_token = num_vision_layers * max_vision_seq_len + text_to_vision_ratio = text_size_per_token / ( + text_size_per_token + vision_size_per_token + ) + + # divvy up our allocation based on this ratio + text_cache_size = available_cache_memory * text_to_vision_ratio + vision_cache_size = available_cache_memory - text_cache_size + + # infer the optimal batch size for each modality based on its cache size + text_batch_size = infer_optimal_batch_size( + params, + max_seq_len, + num_layers, + text_cache_size, + devices, + ) + vision_batch_size = ( + ContinuousBatchingKVCacheManager.infer_optimal_batch_size( + params, + max_vision_seq_len, + num_vision_layers, + vision_cache_size, + devices, + ) + ) + + return min(text_batch_size, vision_batch_size) + + @final + def _fetch( + self, seq_ids_and_prompts: dict[int, np.ndarray], num_steps: int = 1 + ) -> list[KVCacheInputs]: + """Returns KV cache inputs for both modalities' KV managers.""" + # Here we call into the text KV manager's fetch method to update + # its fetch metadata. + text_fetch_results = self.text_kv_manager.fetch( + seq_ids_and_prompts, num_steps + )[0] + + # For the vision KV manager, fetch metadata isn't applicable since + # autoregressive generation is text only. + active_batch_size = len(seq_ids_and_prompts) + + # Lookup table and seq_ids are redundant identical tensors. + lookup_table_tensor = Tensor.from_numpy( + np.array(list(seq_ids_and_prompts.keys()), np.uint32) + ) + cache_lengths_np = np.zeros(active_batch_size, np.uint32) + + max_seq_length = 0 + max_cache_length = 0 + + device = self.vision_kv_manager.devices[0] + for i, seq_id in enumerate(seq_ids_and_prompts): + # Assumption: all seq_ids with + # `vision_kv_manager.cache_lengths[seq_id] == 0` + # are context encoding steps and have the max image sequence length. + # TODO(bduke): pass the vision sequence lengths in from next_token. + + # Omit validity checks on seq ids, which are done in the text fetch. + cache_len = self.vision_kv_manager.cache_lengths[seq_id] + if cache_len == 0: + max_seq_length = self.vision_kv_manager.max_seq_len + + cache_lengths_np[i] = cache_len + + # Update the maximum lengths seen so far. + max_cache_length = max(max_cache_length, cache_len) + + # Build a tensor of maximum lengths. Each step slices the first row to + # advance to the values for the next row. + max_lengths_host = build_max_lengths_tensor( + num_steps, max_seq_length, max_cache_length + ) + + vision_fetch_results = RaggedKVCacheInputs( + # Block 0 for the first device (since MultimodalKVCacheManager + # assumes only 1 device). + blocks=self.vision_kv_manager.blocks[0], + cache_lengths=Tensor.from_numpy(cache_lengths_np).to(device), + lookup_table=lookup_table_tensor.to(device), + max_lengths=max_lengths_host, + ) + + multimodal_kv_inputs = [ + MultimodalKVCacheInputs(text_fetch_results, vision_fetch_results) + ] + return cast(list[KVCacheInputs], multimodal_kv_inputs) + + @final + def input_symbols( + self, + ) -> Sequence[MultimodalKVCacheInputSymbols]: + """Returns concatenated input symbols for text and vision KV managers. + + This has to rename input symbols that aren't necessarily the same: + `num_layers` and `max_seq_len` differ in general between text and + vision modalities. + """ + + def _input_symbols( + manager: KVCacheManager, num_layers_key: str, max_seq_len_key: str + ) -> KVCacheInputSymbols: + input_symbols = manager.input_symbols()[0] + # Get first element from input_symbols sequence + first_input_symbols = input_symbols[0] + assert isinstance(first_input_symbols, TensorType) + first_input_symbols.shape = Shape( + [ + "num_blocks", + 2, + num_layers_key, + max_seq_len_key, + "num_kv_heads", + "head_dim", + ] + ) + return input_symbols + + return [ + MultimodalKVCacheInputSymbols( + text_kv_input_symbols=_input_symbols( + self.text_kv_manager, "text_num_layers", "text_max_seq_len" + ), + vision_kv_input_symbols=_input_symbols( + self.vision_kv_manager, + "vision_num_layers", + "vision_max_seq_len", + ), + ) + ] + + def step(self, seq_ids_and_new_tokens: dict[int, np.ndarray]) -> None: + """Steps both text and vision modalities' KV managers.""" + # Step the text KV manager as usual for autoregressive text generation. + self.text_kv_manager.step(seq_ids_and_new_tokens) + + # Keep the base class's state in sync with the text KV manager's. + super().step(seq_ids_and_new_tokens) + + # Increment cache lengths for the vision KV manager iff this is a + # context encoding (CE) step with an image input. + # It's a CE step if the existing cache_lengths[seq_id] is 0. + for seq_id in seq_ids_and_new_tokens: + self.vision_kv_manager.cache_lengths[seq_id] += ( + self.vision_kv_manager.max_seq_len + if self.vision_kv_manager.cache_lengths[seq_id] == 0 + else 0 + ) + + def external_claim(self, seq_ids: list[int]) -> None: + """Reserves the same sequence ids for both modalities' KV caches.""" + self.text_kv_manager.external_claim(seq_ids) + self.vision_kv_manager.external_claim(seq_ids) + + # Keep the base class's state in sync with the text KV manager's. + super().external_claim(seq_ids) + + def release(self, seq_id: int) -> None: + """Marks the sequence complete for both modalities' KV caches.""" + self.text_kv_manager.release(seq_id) + self.vision_kv_manager.release(seq_id) + super().release(seq_id) + + def contains(self, seq_id: int) -> bool: + """Returns whether `seq_id` is in the KV cache.""" + text_kv_contains = self.text_kv_manager.contains(seq_id) + + # Assume that the modalities' KV caches have consistent sequence ids. + assert text_kv_contains == self.vision_kv_manager.contains(seq_id) + + return text_kv_contains + + def num_kv_inputs(self) -> int: + """Returns the sum of the KV input lengths for both modalities.""" + return ( + self.text_kv_manager.num_kv_inputs() + + self.vision_kv_manager.num_kv_inputs() + ) + + def increment_cache_lengths( + self, + kv_cache_inputs: list[RaggedKVCacheInputs] | list[PaddedKVCacheInputs], + prev_model_inputs: Iterable[Any], + ) -> list[RaggedKVCacheInputs] | list[PaddedKVCacheInputs]: + """Updates the cache lengths for multistep execution. + + This increments the text and vision KV cache lengths separately using + their respective KV cache inputs. + """ + # Cast the input to MultimodalKVCacheInputs to access its components + multimodal_inputs = cast(list[MultimodalKVCacheInputs], kv_cache_inputs) + text_kv_inputs = multimodal_inputs[0].text_kv_cache_inputs + vision_kv_inputs = multimodal_inputs[0].vision_kv_cache_inputs + + multimodal_kv_inputs = [ + MultimodalKVCacheInputs( + text_kv_cache_inputs=self.text_kv_manager.increment_cache_lengths( + [text_kv_inputs], # type: ignore + prev_model_inputs, + )[0], + vision_kv_cache_inputs=self.vision_kv_manager.increment_cache_lengths( + [vision_kv_inputs], # type: ignore + prev_model_inputs, + )[0], + ) + ] + return cast(list[RaggedKVCacheInputs], multimodal_kv_inputs) + + +# TODO(bduke): use `@dataclass(slots=True)` when we drop 3.9 support. +class LlamaVisionInputs(ModelInputs): + """Holds language model inputs and (optionally) vision model inputs.""" + + # Language model inputs. + input_id_values: Tensor + input_row_offsets: Tensor + input_id_max_seq_len: Tensor + pixel_row_offsets: Tensor + + # Vision model inputs. + _pixel_values: Tensor | None = None + _aspect_ratio_ids: Tensor | None = None + _aspect_ratio_mask: Tensor | None = None + + def __init__( + self, + input_id_values: Tensor, + input_row_offsets: Tensor, + input_id_max_seq_len: Tensor, + pixel_row_offsets: Tensor, + pixel_values: Tensor | None = None, + aspect_ratio_ids: Tensor | None = None, + aspect_ratio_mask: Tensor | None = None, + ): + self.input_id_values = input_id_values + self.input_row_offsets = input_row_offsets + self.input_id_max_seq_len = input_id_max_seq_len + self.pixel_row_offsets = pixel_row_offsets + self._pixel_values = pixel_values + self._aspect_ratio_ids = aspect_ratio_ids + self._aspect_ratio_mask = aspect_ratio_mask + + def __post_init__(self) -> None: + """Validate consistency between vision fields. + + If pixel_values is set, then aspect_ratio_ids, aspect_ratio_mask, + and pixel_row_offsets must also be set, and vice versa. + """ + if self.has_vision_inputs: + if not all( + x is not None + for x in ( + self._aspect_ratio_ids, + self._aspect_ratio_mask, + self.pixel_row_offsets, + ) + ): + msg = "provide all or none of Llama Vision vision model inputs" + raise ValueError(msg) + else: + for field_name in ("_aspect_ratio_ids", "_aspect_ratio_mask"): + if getattr(self, field_name) is not None: + msg = f"{field_name} must be None if _pixel_values is None" + raise ValueError(msg) + + @property + def has_vision_inputs(self) -> bool: + """Returns true iff this includes vision model inputs.""" + return self._pixel_values is not None + + @property + def pixel_values(self) -> Tensor: + assert self._pixel_values is not None + return self._pixel_values + + @property + def aspect_ratio_ids(self) -> Tensor: + assert self._aspect_ratio_ids is not None + return self._aspect_ratio_ids + + @property + def aspect_ratio_mask(self) -> Tensor: + assert self._aspect_ratio_mask is not None + return self._aspect_ratio_mask + + def update_for_next_token( + self, next_tokens: Tensor, next_row_offsets: Tensor + ) -> LlamaVisionInputs: + """Updates next_tokens and row_offsets after an initial step.""" + return LlamaVisionInputs( + input_id_values=next_tokens, + input_row_offsets=next_row_offsets, + input_id_max_seq_len=self.input_id_max_seq_len, + pixel_row_offsets=self.pixel_row_offsets, + # Set vision model inputs to None after the first `next_token`. + pixel_values=None, + aspect_ratio_ids=None, + aspect_ratio_mask=None, + ) + + +class LlamaVisionModel(Layer): + """The Llama 3.2 vision model.""" + + def __init__( + self, pipeline_config: PipelineConfig, weights: Weights + ) -> None: + # Set convenience attributes for the text and vision configs. + self.vision_config = pipeline_config.huggingface_config.vision_config + self.text_config = pipeline_config.huggingface_config.text_config + + self.vision_model = instantiate_vision_model( + dtype=pipeline_config.dtype, + image_size=self.vision_config.image_size, + patch_size=self.vision_config.patch_size, + supported_aspect_ratios=self.vision_config.supported_aspect_ratios, + hidden_size=self.vision_config.hidden_size, + max_num_tiles=self.vision_config.max_num_tiles, + num_channels=self.vision_config.num_channels, + norm_eps=self.vision_config.norm_eps, + attention_heads=self.vision_config.attention_heads, + num_hidden_layers=self.vision_config.num_hidden_layers, + intermediate_size=self.vision_config.intermediate_size, + num_global_layers=self.vision_config.num_global_layers, + intermediate_layers_indices=self.vision_config.intermediate_layers_indices, + weights=weights, + ) + + self.multi_modal_projector = Linear( + weights.multi_modal_projector.weight.allocate( + pipeline_config.dtype, + [ + self.text_config.hidden_size, + self.vision_config.vision_output_dim, + ], + ), + weights.multi_modal_projector.bias.allocate( + pipeline_config.dtype, + [self.text_config.hidden_size], + ), + ) + + def __call__( + self, + pixel_values: TensorValue, + aspect_ratio_ids: TensorValue, + aspect_ratio_mask: TensorValue, + ) -> TensorValue: + if aspect_ratio_ids is None: + msg = "`aspect_ratio_ids` must be provided if `pixel_values` is provided" + raise ValueError(msg) + + # Get vision tokens from vision model. + vision_outputs = self.vision_model( + pixel_values=pixel_values, + aspect_ratio_ids=aspect_ratio_ids, + aspect_ratio_mask=aspect_ratio_mask, + ) + cross_attention_states = vision_outputs[0] + + num_patches = cross_attention_states.shape[-2] + + return self.multi_modal_projector(cross_attention_states).reshape( + [ + Dim("batch_size") + * Dim("num_concurrent_media") + * self.vision_config.max_num_tiles + * num_patches, + self.text_config.hidden_size, + ] + ) + + +class LlamaVisionLanguageModel(Layer): + """The Llama 3.2 vision language model.""" + + language_model: CausalLanguageModel + """Language model composed of self and cross attention layers.""" + + num_text_kv_cache_inputs: int + """Number of KV cache inputs for self attention layers.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + weights: Weights, + kv_params: KVCacheParams, + max_seq_len: int, + num_text_kv_cache_inputs: int, + ) -> None: + text_config = pipeline_config.huggingface_config.text_config + + self.language_model = instantiate_language_model( + dtype=pipeline_config.dtype, + hidden_size=text_config.hidden_size, + n_heads=text_config.num_attention_heads, + rope_theta=text_config.rope_theta, + max_seq_len=max_seq_len, + num_hidden_layers=text_config.num_hidden_layers, + cross_attention_layers=text_config.cross_attention_layers, + vocab_size=text_config.vocab_size, + rms_norm_eps=text_config.rms_norm_eps, + num_key_value_heads=text_config.num_key_value_heads, + intermediate_size=text_config.intermediate_size, + kv_params=kv_params, + weights=weights, + ) + self.num_text_kv_cache_inputs = num_text_kv_cache_inputs + + def __call__( + self, + cross_attention_states: TensorValue, + input_ids: TensorValue, + hidden_input_row_offsets: TensorValue, + hidden_max_seq_len: TensorValue, + cross_input_row_offsets: TensorValue, + *kv_cache_inputs: TensorValue, + ) -> TensorValue: + logits = self.language_model( + text_kv_cache_inputs=kv_cache_inputs[ + : self.num_text_kv_cache_inputs + ], + vision_kv_cache_inputs=kv_cache_inputs[ + self.num_text_kv_cache_inputs : + ], + input_ids=input_ids, + hidden_input_row_offsets=hidden_input_row_offsets, + hidden_max_seq_len=hidden_max_seq_len, + cross_attention_states=cross_attention_states, + cross_input_row_offsets=cross_input_row_offsets, + ) + + # Always return float32 logits, no matter the activation type + return ops.cast(logits, DType.float32) + + +class LlamaVision(PipelineModel[TextAndVisionContext]): + """The entire (multimodal) Llama3.2 vision model. + + A note on multi-step and vision inputs: + + - `has_images` in `prepare_initial_token_inputs` is determined by whether or + not `pixel_values` is set on each TextAndVisionContext in the batch. + So on the context encoding call, the caller sets pixel_values, making + `has_images` True. + - `prepare_initial_token_inputs` unsets `ctx.pixel_values` (sets it to an + empty list). + So the next prepare_initial_token_inputs will have has_images == False + (the next multi-step train will skip the vision encoder). + - That covers the num_steps = 1 case. + - For multistep, the prepare_next_token_inputs function will unset + LlamaVisionInputs.pixel_values (and aspect ratio ids/mask). + So for multistep, step > 1, subsequent steps won't run the vision encoder. + - Note the 2 different mechanisms: `has_images` is determined by + `TextAndVisionContext.pixel_values` in `prepare_initial_token_inputs`, + but it is determined by `LlamaVisionInputs.pixel_values` in + `PipelineModel.execute` (which is called multiple times in a multi-step + train, so `prepare_next_token_inputs` needs to unset + `LlamaVisionInputs.pixel_values`). + """ + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + # Set convenience attributes for the text and vision configs. + self.vision_config = pipeline_config.huggingface_config.vision_config + self.text_config = pipeline_config.huggingface_config.text_config + + # These need to be set at graph instantiation time. + self.vision_graph_input_size = -1 + self.language_graph_input_size = -1 + + super().__init__(pipeline_config, session) + self.vision_model, self.language_model = self.load_model(session) + # Note that in a multimodal model, the language model is the last model in the + # pipeline. Unfortunately, self.model is still being used (and exposed) + # in the token generation code, so we still need to set it here. + self.model = self.language_model + + def _llama3_vision_vision_graph(self) -> Graph: + # Inserted a manual CHW -> HWC transpose here. + pixel_values_type = TensorType( + # This has to be of type float32 as we construct tensors from a numpy + # array (which has no notion of some dtypes like bfloat16). Explicit + # casting will happen inside the graph. + DType.float32, + shape=[ + "batch_size", + "num_concurrent_media", + self.vision_config.max_num_tiles, + self.vision_config.image_size, # height + self.vision_config.image_size, # width + self.vision_config.num_channels, + ], + ) + aspect_ratio_ids_type = TensorType( + DType.int64, + shape=["batch_size", "num_concurrent_media"], + ) + aspect_ratio_mask_type = TensorType( + DType.int64, + shape=[ + "batch_size", + "num_concurrent_media", + self.vision_config.max_num_tiles, + ], + ) + + input_types = [ + pixel_values_type, + aspect_ratio_ids_type, + aspect_ratio_mask_type, + ] + self.vision_graph_input_size = len(input_types) + return Graph( + "llama3-vision-vision-model-graph", + forward=LlamaVisionModel( + pipeline_config=self.pipeline_config, weights=self.weights + ), + input_types=input_types, + ) + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.text_config.max_position_embeddings, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for Llama Vision, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_position_embeddings " + f"({pipeline_config.huggingface_config.text_config.max_position_embeddings})." + ) + raise ValueError(msg) from e + + def _llama3_vision_language_graph(self) -> Graph: + # Pre-allocate a buffer for input_row_offsets in multistep execution. + # We do this to avoid materializing and copying a buffer with each multistep step + assert self.pipeline_config.max_batch_size, ( + "Expected max_batch_size to be set" + ) + self._input_row_offsets_prealloc = Tensor.from_numpy( + np.arange(self.pipeline_config.max_batch_size + 1, dtype=np.uint32) + ).to(self.pipeline_config.devices[0]) + + input_ids_type = TensorType(DType.int64, shape=["total_seq_len"]) + # image_size = self.vision_config.image_size + # patch_size = self.vision_config.patch_size + cross_attention_states_type = TensorType( + self.pipeline_config.dtype, + shape=[ + # TODO(bduke): fix algebraic dim creation outside of graph + # contexts. + # Dim("batch_size") + # * "num_concurrent_media" + # * self.vision_config.max_num_tiles + # * ((image_size // patch_size) ** 2 + 1), + "num_vision_embeddings", + self.text_config.hidden_size, + ], + ) + input_ids_max_seq_len_type = TensorType(DType.uint32, [1]) + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"] + ) + cross_row_offsets_type = input_row_offsets_type + + # Unpack multimodal KV inputs. + assert isinstance(self.kv_manager, MultimodalKVCacheManager) + input_symbols = self.kv_manager.input_symbols()[0] + text_kv_input_symbols = input_symbols.text_kv_input_symbols + vision_kv_input_symbols = input_symbols.vision_kv_input_symbols + + input_types = [ + cross_attention_states_type, + input_ids_type, + input_row_offsets_type, + input_ids_max_seq_len_type, + cross_row_offsets_type, + *text_kv_input_symbols, + *vision_kv_input_symbols, + ] + self.language_graph_input_size = len(input_types) + + return Graph( + "llama3-vision-language-model-graph", + forward=LlamaVisionLanguageModel( + pipeline_config=self.pipeline_config, + weights=self.weights, + kv_params=self.get_kv_params(self.pipeline_config), + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + num_text_kv_cache_inputs=len(list(text_kv_input_symbols)), + ), + input_types=input_types, + ) + + @property + def vision_max_seq_len(self) -> int: + """Returns the maximum number of vision tokens.""" + return self._calculate_vision_max_seq_len(self.pipeline_config) + + @classmethod + def _calculate_vision_max_seq_len(cls, config: PipelineConfig) -> int: + """Returns the maximum number of vision tokens.""" + # Marshal out hyperparameters. + height = config.huggingface_config.vision_config.image_size + width = config.huggingface_config.vision_config.image_size + max_num_tiles = config.huggingface_config.vision_config.max_num_tiles + patch_size = config.huggingface_config.vision_config.patch_size + # TODO(bduke): account for the actual instead of max number of tiles. + # num_tiles * (image_dim**2 // patch_dim**2 + 1 (cls token)) + return max_num_tiles * ((height * width) // patch_size**2 + 1) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return ( + pipeline_config.huggingface_config.vision_config.num_hidden_layers + ) + + def _prepare_vision_inputs( + self, + context_batch: Sequence[TextAndVisionContext], + ) -> tuple[Tensor, Tensor, Tensor]: + """Batches up pixel_values, aspect_ratio_ids, and aspect_ratio_masks.""" + images = [] + aspect_ratio_ids_list = [] + aspect_ratio_mask_list = [] + for context in context_batch: + # Get first image in first batch and permute the order to (HWC). + image = np.transpose(context.pixel_values, (0, 1, 3, 4, 2)) + + # Add batch_size, num_concurrent_media, and max_num_tiles dimensions + # [1, num_concurrent_media, max_num_tiles, H, W, C] + image = np.expand_dims(image, axis=(0)) + images.append(image) + + if "aspect_ratio_ids" not in context.extra_model_args: + msg = "aspect_ratio_ids is required for image / vision model input" + raise ValueError(msg) + + if "aspect_ratio_mask" not in context.extra_model_args: + msg = "aspect_ratio_mask is required for image / vision model input" + raise ValueError(msg) + + aspect_ratio_ids_list.append( + context.extra_model_args["aspect_ratio_ids"] + ) + aspect_ratio_mask_list.append( + context.extra_model_args["aspect_ratio_mask"] + ) + + # Convert the list into a single NumPy array with shape + # (batch_size, 1, max_num_tiles, H, W, C). + final_images = np.concatenate(images, axis=0) + + pixel_values = Tensor.from_numpy(final_images).to( + self.pipeline_config.devices[0] + ) + + final_aspect_ratio_ids = np.concatenate(aspect_ratio_ids_list, axis=0) + + aspect_ratio_ids = Tensor.from_numpy(final_aspect_ratio_ids).to( + self.pipeline_config.devices[0] + ) + + final_aspect_ratio_mask = np.concatenate(aspect_ratio_mask_list, axis=0) + + aspect_ratio_mask = Tensor.from_numpy(final_aspect_ratio_mask).to( + self.pipeline_config.devices[0] + ) + + return pixel_values, aspect_ratio_ids, aspect_ratio_mask + + def prepare_initial_token_inputs( + self, + context_batch: Sequence[TextAndVisionContext], + ) -> LlamaVisionInputs: + """Creates tensors of token and image inputs, if applicable.""" + if self.pipeline_config.cache_strategy != KVCacheStrategy.CONTINUOUS: + msg = "Llama Vision only supports continuous batching" + raise ValueError(msg) + + def has_image(pixel_values: np.ndarray | list[np.ndarray]) -> bool: + return pixel_values is not None and len(pixel_values) > 0 + + has_images = any(has_image(ctx.pixel_values) for ctx in context_batch) + if has_images and not all( + has_image(ctx.pixel_values) for ctx in context_batch + ): + msg = ( + "expected context batch to all have images, or no images at all" + ) + raise RuntimeError(msg) + + def initial_prompt_missing_image(ctx: TextAndVisionContext) -> bool: + return ctx.is_initial_prompt and not has_image(ctx.pixel_values) + + if any(initial_prompt_missing_image(ctx) for ctx in context_batch): + msg = "The Llama Vision model currently requires a prompt with an image. Consider using the regular text-only models for non-image prompts" + raise RuntimeError(msg) + + # Prepare vision inputs if applicable. + pixel_values = None + aspect_ratio_ids = None + aspect_ratio_mask = None + if has_images: + pixel_values, aspect_ratio_ids, aspect_ratio_mask = ( + self._prepare_vision_inputs(context_batch) + ) + + # Input row offset type: ["input_row_offsets_len"], UInt32 + input_id_row_offsets = Tensor.from_numpy( + np.cumsum( + [0] + [ctx.active_length for ctx in context_batch], + dtype=np.uint32, + ) + ).to(self.pipeline_config.devices[0]) + + pixel_row_offsets = Tensor.from_numpy( + np.cumsum( + [0] + + [ + # Use an input row offset of 0 to mean no image. + self.vision_max_seq_len + if has_image(ctx.pixel_values) + else 0 + for ctx in context_batch + ], + dtype=np.uint32, + ) + ).to(self.pipeline_config.devices[0]) + + # Input Ids: ["total_seq_len"], Int64 + # Create a ragged token vector of length: sum(len(t) for t in tokens). + tokens = np.concatenate([ctx.next_tokens for ctx in context_batch]) + input_id_values = Tensor.from_numpy(tokens).to( + self.pipeline_config.devices[0] + ) + # This lives on host / in the CPU kernel, but is later casted to a scalar on + # device kernel side. No need for explicit .to(pipeline_config.device) call here. + input_id_max_seq_len = Tensor.from_numpy( + np.array( + [max(ctx.active_length for ctx in context_batch)], + dtype=np.uint32, + ) + ) + + # Unset the context's pixel values so that subsequent next_token + # calls reusing the same context won't run the vision encoder. + for ctx in context_batch: + ctx.pixel_values = [] + + return LlamaVisionInputs( + input_id_values=input_id_values, + input_row_offsets=input_id_row_offsets, + input_id_max_seq_len=input_id_max_seq_len, + pixel_row_offsets=pixel_row_offsets, + pixel_values=pixel_values, + aspect_ratio_ids=aspect_ratio_ids, + aspect_ratio_mask=aspect_ratio_mask, + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_inputs: ModelInputs, + ) -> LlamaVisionInputs: + """Produce the updated LlamaVisionInputs for the next token. + + This sets existing vision inputs to none and replaces text tokens and + row offsets. + """ + prev_inputs = cast(LlamaVisionInputs, prev_inputs) + next_row_offsets = self._input_row_offsets_prealloc[ + : prev_inputs.input_row_offsets.shape[0] + ] + + return prev_inputs.update_for_next_token(next_tokens, next_row_offsets) + + def execute( + self, + model_inputs: ModelInputs, + # TODO(zheng): This should be folded as KVCacheInputs into ModelInputs. + kv_cache_inputs: Optional[KVCacheInputs] = None, + ) -> ModelOutputs: + assert kv_cache_inputs is not None + # batch_size * num_concurrent_media * max_num_tiles * num_patches + # are set to 0 here to imitate a dummy tensor (used in text-only mode). + cross_attention_states = Tensor.zeros( + shape=[0, self.text_config.hidden_size], + dtype=self.pipeline_config.dtype, + ).to(self.pipeline_config.devices[0]) + + model_inputs = cast(LlamaVisionInputs, model_inputs) + if model_inputs.has_vision_inputs: + # Compute the cross attention states if this is a CE step. + exec_result = self.vision_model.execute( + model_inputs.pixel_values, + model_inputs.aspect_ratio_ids, + model_inputs.aspect_ratio_mask, + copy_inputs_to_device=False, + )[0] + assert isinstance(exec_result, Tensor) + cross_attention_states = exec_result + + all_kv_cache_inputs: list[Tensor] = [] + if isinstance(kv_cache_inputs, MultimodalKVCacheInputs): + all_kv_cache_inputs.extend(kv_cache_inputs.text_kv_cache_inputs) + all_kv_cache_inputs.extend(kv_cache_inputs.vision_kv_cache_inputs) + else: + all_kv_cache_inputs = list(kv_cache_inputs) + + model_outputs = self.language_model.execute( + cross_attention_states, + model_inputs.input_id_values, + model_inputs.input_row_offsets, + model_inputs.input_id_max_seq_len, + model_inputs.pixel_row_offsets, + *all_kv_cache_inputs, + copy_inputs_to_device=False, + ) + assert not self.pipeline_config.enable_echo + assert isinstance(model_outputs[0], Tensor) + return ModelOutputs(next_token_logits=model_outputs[0]) + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.text_config.num_key_value_heads, + head_dim=( + pipeline_config.huggingface_config.text_config.hidden_size + // pipeline_config.huggingface_config.text_config.num_attention_heads + ), + page_size=pipeline_config.kv_cache_page_size, + cache_strategy=pipeline_config.cache_strategy, + enable_prefix_caching=pipeline_config.enable_prefix_caching, + ) + + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: int, + ) -> KVCacheManager: + """Loads KV cache management objects for Llama vision. + + Args: + session: Inference session to compile and init the KV cache. + available_cache_memory: Amount of memory available to the KV cache, + in bytes. + + Returns: + A pair of KV managers: one for self the other for cross attention. + """ + num_cross_attn_layers = len(self.text_config.cross_attention_layers) + return MultimodalKVCacheManager( + params=self.get_kv_params(self.pipeline_config), + max_batch_size=self.pipeline_config.max_batch_size, + text_max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + vision_max_seq_len=self.vision_max_seq_len, + text_num_layers=self.text_config.num_hidden_layers + - num_cross_attn_layers, + vision_num_layers=num_cross_attn_layers, + devices=self.pipeline_config.devices, + session=session, + available_cache_memory=available_cache_memory, + page_size=self.pipeline_config.kv_cache_page_size, + ) + + @classmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: list[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + assert pipeline_config.max_batch_size is not None + + num_cross_attn_layers = len( + pipeline_config.huggingface_config.text_config.cross_attention_layers + ) + return MultimodalKVCacheManager.estimated_memory_size( + params=cls.get_kv_params(pipeline_config), + max_batch_size=pipeline_config.max_batch_size, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=pipeline_config.huggingface_config.text_config.num_hidden_layers + - num_cross_attn_layers, + available_cache_memory=available_cache_memory, + devices=devices, + max_vision_seq_len=cls._calculate_vision_max_seq_len( + pipeline_config + ), + num_vision_layers=num_cross_attn_layers, + ) + + @classmethod + def infer_optimal_batch_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + ) -> int: + if ( + len(pipeline_config.devices) == 1 + and pipeline_config.devices[0].is_host + ): + return 1 + + num_cross_attn_layers = len( + pipeline_config.huggingface_config.text_config.cross_attention_layers + ) + optimal_batch_size = MultimodalKVCacheManager.infer_optimal_batch_size( + params=cls.get_kv_params(pipeline_config), + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=pipeline_config.huggingface_config.text_config.num_hidden_layers + - num_cross_attn_layers, + # TODO(GEX-1843): we underestimate the memory usage of the + # vision model due to multiple activations in flight while executing the + # vision encoder and first few layers of the text encoder in parallel. + # This is a hacky workaround to account for this, in the long term we + # should more accurately measure a model's memory consumption via + # an interface in the graph compiler. + available_cache_memory=int(available_cache_memory * 0.8), + devices=pipeline_config.devices, + max_vision_seq_len=cls._calculate_vision_max_seq_len( + pipeline_config + ), + num_vision_layers=num_cross_attn_layers, + ) + return max( + cls._MIN_DEFAULT_BATCH_SIZE, + min(optimal_batch_size, cls._MAX_DEFAULT_BATCH_SIZE), + ) + + def load_model( + self, + session: InferenceSession, + ) -> tuple[Model, Model]: + """ + Load the Llama vision multimodal model. Since this is a multimodal model, + we have vision and language models (graph) loaded. + """ + self.weights = self.pipeline_config.load_weights() + + def build_vision_model(): + logger.info("Building and compiling vision model...") + before = time.perf_counter() + vision_model_graph = self._llama3_vision_vision_graph() + vision_model = session.load( + vision_model_graph, + weights_registry=self.weights.allocated_weights, + ) + after = time.perf_counter() + logger.info( + f"Compiling vision model took {after - before:.6f} seconds" + ) + return vision_model + + def build_language_model(): + logger.info("Building and compiling language model...") + before = time.perf_counter() + language_model_graph = self._llama3_vision_language_graph() + language_model = session.load( + language_model_graph, + weights_registry=self.weights.allocated_weights, + ) + after = time.perf_counter() + logger.info( + f"Building and compiling language model took {after - before:.6f} seconds" + ) + return language_model + + with ThreadPoolExecutor(max_workers=2) as executor: + vision_model_future = executor.submit(build_vision_model) + language_model_future = executor.submit(build_language_model) + vision_model = vision_model_future.result() + language_model = language_model_future.result() + + return (vision_model, language_model) diff --git a/src/max/pipelines/architectures/llama_vision/mlp.py b/src/max/pipelines/architectures/llama_vision/mlp.py new file mode 100644 index 0000000000..01909f6e42 --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/mlp.py @@ -0,0 +1,36 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Multi-layer Perceptron for Llama 3.2 vision transformer.""" + +from dataclasses import dataclass + +from max.graph import TensorValue, ops +from max.pipelines.nn import Linear +from max.pipelines.nn.layer import Layer + + +@dataclass +class MLP(Layer): + """ + Simple multi-layer perceptron composed of two linear layers. + Uses GELU activation function. + """ + + fc1: Linear + fc2: Linear + + def __call__(self, hidden_states: TensorValue) -> TensorValue: + hidden_states = self.fc1(hidden_states) + hidden_states = ops.gelu(hidden_states) + return self.fc2(hidden_states) diff --git a/src/max/pipelines/architectures/llama_vision/positional_embedding.py b/src/max/pipelines/architectures/llama_vision/positional_embedding.py new file mode 100644 index 0000000000..b581fa76fc --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/positional_embedding.py @@ -0,0 +1,131 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Llama 3.2 Transformer Vision Model Positional Embeddings.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from max.graph import TensorValue, Weight, ops +from max.pipelines.nn import Embedding +from max.pipelines.nn.layer import Layer + + +@dataclass +class PrecomputedAspectRatioEmbedding(Layer): + """ + Llama 3.2 precomputed aspect ratio embedding. + + Args: + params: Hyperparameters for this PrecomputedAspectRatioEmbedding layer. + gate: The gating parameter to control the contribution of the aspect + ratio embedding. + embedding: The aspect ratio embedding. + """ + + max_num_tiles: int + hidden_size: int + gate: Weight + embedding: Embedding + is_gated: bool = False + + def __call__( + self, hidden_state: TensorValue, aspect_ratio_ids: TensorValue + ) -> TensorValue: + batch_size, num_tiles, _, hidden_size = hidden_state.shape + embeddings = self.embedding(aspect_ratio_ids) + embeddings = embeddings.reshape((-1, num_tiles, 1, self.hidden_size)) + + if self.is_gated: + embeddings = embeddings * ops.tanh(self.gate) + + # We're broadcasting in the add operation below, so we call reshape() + # on embeddings first. + embeddings = embeddings.reshape( + ( + batch_size, + num_tiles, + embeddings.shape[2], + hidden_size, + ) + ) + return hidden_state + embeddings + + +@dataclass +class PrecomputedPositionEmbedding(Layer): + """ + Llama 3.2 precomputed position embedding. + + Args: + gate: The gating parameter to control the contribution of the position + embedding or another component of the model. + embedding: The precomputed position embedding. + tile_embedding: The embedding associated with tiles or patches in a + vision model. + """ + + image_size: int + patch_size: int + hidden_size: int + max_num_tiles: int + gate: Weight + embedding: Weight + tile_embedding: Embedding + + def __call__( + self, hidden_state: TensorValue, aspect_ratio_ids: TensorValue + ) -> TensorValue: + # position embeddings + gated_position_embedding = (1 - ops.tanh(self.gate)) * self.embedding + + num_patches = (self.image_size // self.patch_size) ** 2 + 1 + gated_position_embedding = gated_position_embedding.reshape( + ( + 1, + 1, + num_patches, + self.hidden_size, + ) + ) + # We're broadcasting gated_position_embedding in the add operation below, + # so we call reshape() on hidden_state first. + batch_size, num_tiles, _, _ = hidden_state.shape + hidden_state = hidden_state.reshape( + ( + batch_size, + num_tiles, + num_patches, + self.hidden_size, + ) + ) + hidden_state = hidden_state + gated_position_embedding + + # precomputed tile position embeddings + tile_position_embedding = self.tile_embedding(aspect_ratio_ids) + tile_position_embedding = tile_position_embedding.reshape( + ( + batch_size, + self.max_num_tiles, + num_patches, + self.hidden_size, + ) + ) + gated_tile_position_embedding = ( + ops.tanh(self.gate) * tile_position_embedding + ) + # This explicit reshape is called only to match num_tiles dim in + # tile_position_embedding. + hidden_state = hidden_state.reshape(tile_position_embedding.shape) + return hidden_state + gated_tile_position_embedding diff --git a/src/max/pipelines/architectures/llama_vision/vision_model.py b/src/max/pipelines/architectures/llama_vision/vision_model.py new file mode 100644 index 0000000000..695f2666cb --- /dev/null +++ b/src/max/pipelines/architectures/llama_vision/vision_model.py @@ -0,0 +1,741 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Llama 3.2 Transformer Vision Model.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import Dim, StaticDim, TensorValue, TensorValueLike, ops +from max.graph.weights import Weights +from max.pipelines.nn import Conv2D, Embedding, LayerNorm, Linear +from max.pipelines.nn.layer import Layer + +from .attention import Attention +from .encoder import VisionEncoder, VisionEncoderLayer +from .mlp import MLP +from .positional_embedding import ( + PrecomputedAspectRatioEmbedding, + PrecomputedPositionEmbedding, +) + + +# TODO(MAXCORE-170): We should clean this up. This is just a RSCF layout permutation so it +# conforms with our conv op API. +@dataclass +class VisionConv2D(Conv2D): + def __call__(self, x: TensorValue) -> TensorValue: + # Permute first before calling the parent forward pass. + self.filter = ops.permute(self.filter, [2, 3, 1, 0]) + return super().__call__(x=x) + + +@dataclass +class VisionModel(Layer): + """ + Llama 3.2 vision model responsible for encoding images. It consists of two + vision encoders. + + This model is designed to process input images through a combination of convolutional + layers and transformer-based encoders. It utilizes gated and precomputed positional + embeddings to handle spatial information effectively, and supports multi-aspect ratio inputs. + + Args: + params : Hyperparameters that define the architecture and training behavior of the vision model. + gated_positional_embedding: Precomputed positional embeddings that are gated for enhanced spatial encoding. + pre_tile_positional_embedding: Precomputed aspect ratio positional embeddings applied before tiling the input patches. + post_tile_positional_embedding: Precomputed aspect ratio positional embeddings applied after tiling the input patches. + patch_embedding: Convolutional layer that extracts features from input image patches. + class_embedding: Embedding that is concatenated to the sequence for classification tasks. + layernorm_pre: Layer normalization applied before feeding inputs into the transformer encoders. + layernorm_post: Layer normalization applied after processing through the transformer layers. + transformer: Transformer responsible for capturing local spatial relationships in the image. + global_transformer: Transformer focused on global context and capturing long-range dependencies within the image. + """ + + gated_positional_embedding: PrecomputedPositionEmbedding + pre_tile_positional_embedding: PrecomputedAspectRatioEmbedding + post_tile_positional_embedding: PrecomputedAspectRatioEmbedding + patch_embedding: VisionConv2D + class_embedding: TensorValueLike + layernorm_pre: LayerNorm + layernorm_post: LayerNorm + transformer: VisionEncoder + global_transformer: VisionEncoder + dtype: DType + intermediate_layers_indices: list[int] + num_patches: int + + def apply_class_embedding(self, hidden_state: TensorValue) -> TensorValue: + """ + Adds a learnable class token embedding to the sequence of patch embeddings for a vision transformer. + + This function is responsible for prepending a class token to the sequence of image patch embeddings. + The class token is a learnable parameter that captures global information from the image through + the self-attention mechanism. After processing through the transformer layers, the class token + serves as a summary representation of the entire image, typically used for classification tasks. + + Args: + embedding_sequence (TensorValue): A tensor representing the sequence of embedded image patches. + Shape: (batch_size, num_patches, embedding_dim) + + Returns: + TensorValue: A tensor with the class token prepended to the sequence of patch embeddings. + Shape: (batch_size, num_patches + 1, embedding_dim) + The first token in the sequence is the class token, followed by the image patch embeddings. + + Example: + >>> class_token = model.apply_class_embedding(patch_embeddings) + >>> # class_token now holds the class embedding prepended to the patch embeddings + """ + batch_size, _, hidden_size = hidden_state.shape + # This was a reshape in torch reference implementation but we need to + # broadcast this into the right shapes. + class_embedding = TensorValue(self.class_embedding) + + class_embedding = class_embedding.broadcast_to( + (batch_size, 1, hidden_size) + ) + return ops.concat((class_embedding, hidden_state), axis=1) + + def _prepare_aspect_ratio_attention_mask( + self, + aspect_ratio_mask: TensorValue, + num_patches: int, + target_length: int, + dtype: DType, + ) -> TensorValue: + # Expand aspect ratio mask to target_length + batch_size, max_num_tiles = aspect_ratio_mask.shape + attention_mask = aspect_ratio_mask.reshape( + (batch_size, max_num_tiles, 1, 1) + ).cast(dtype) # (1, 4, 1, 1) + # attention_shape (1, 4, 1, 1) -> (1, 4, 1032, 1) + attention_mask = ops.tile(attention_mask, (1, 1, target_length, 1)) + + # Mask padding patches + pad_patches = target_length - num_patches + + # The snippet below is a workaround for + # attention_mask[:, :, 0 - pad_patches :] = 0 + valid_mask = attention_mask[:, :, :-pad_patches, :] + zero_pad = ops.constant(0, dtype).broadcast_to( + (batch_size, max_num_tiles, pad_patches, attention_mask.shape[-1]) + ) + attention_mask = ops.concat((valid_mask, zero_pad), axis=2) + + # Invert the mask (0 -> 1, 1 -> 0) + attention_mask = 1 - attention_mask + + # Reshape to 2D and create 4D attention mask + # (batch_size, 1, max_num_tiles * target_length, max_num_tiles * target_length) + attention_mask = attention_mask.reshape( + (batch_size, max_num_tiles * target_length, 1) + ) + + # TODO: Hardcoded for now. Reference implementation uses torch.finfo(torch.bfloat16).min + bfloat_dtype_min_val = -3.3895313892515355e38 + # Perform outer product by broadcasting elementwise multiplication. + attention_mask = ( + attention_mask + * attention_mask.reshape( + (batch_size, 1, max_num_tiles * target_length) + ) + ) * bfloat_dtype_min_val + + # before unsqueeze: attention_mask shape: (1, 4128, 4128) + return ops.unsqueeze(attention_mask, axis=1) + + def _manual_constant_pad_4d( + self, + dtype: DType, + input_tensor, + pad: tuple[int, int, int, int], + value=0, + ) -> TensorValue: + """ + Manually pads a 4D tensor (batch of images) with constant values. + + Args: + input_tensor (TensorValue): The input 4D tensor (batch_size, channels, height, width). + pad (tuple): Tuple of the form (left, right, top, bottom) specifying padding sizes. + value (float): The value to pad with. + + Returns: + TensorValue: Padded tensor. + """ + left, right, top, bottom = pad + batch_size, channels, height, width = input_tensor.shape + + # Compute new height and width after padding + new_height = height + top + bottom + new_width = width + left + right + + padded_tensor = ops.constant(value, dtype).broadcast_to( + (batch_size, channels, new_height, new_width) + ) + + # Insert the original tensor into the center of the padded tensor + # The code snippet below is a workaround for: + # padded_tensor[ + # :, :, top : top + height, left : left + width + # ] = input_tensor + + # Slice regions along height (dim=2) + # Unchanged region above + top_region = padded_tensor[:, :, :top, :] + # Unchanged region below + bottom_region = padded_tensor[:, :, top + height.dim :, :] + + # Slice regions along width (dim=3) + # Unchanged region to the left + left_region = padded_tensor[:, :, top : top + height.dim, :left] + width_tuple: tuple[TensorValue, ...] = (left_region, input_tensor) + if left > 0: + # Unchanged region to the right + right_region = padded_tensor[ + :, :, top : top + height.dim, left + width.dim : + ] + width_tuple += (right_region,) + + # Concatenate along width (axis=3) + middle_region = ops.concat(width_tuple, axis=3) + + # Concatenate along height (axis=2) + updated_padded_tensor = ops.concat( + (top_region, middle_region, bottom_region), axis=2 + ) + + return updated_padded_tensor + + def __call__( + self, + pixel_values: TensorValue, + aspect_ratio_ids: TensorValue, + aspect_ratio_mask: TensorValue, + ) -> tuple[TensorValue, TensorValue | None, TensorValue | None]: + ( + batch_size, + num_concurrent_media, + num_tiles, + height, + width, + num_channels, + ) = pixel_values.shape + + # Pixel values isn't always guaranteed to be the same dtype as configured + # at the pipeline config level. We insert an explicit cast here to account + # for it. + pixel_values = ops.cast(pixel_values, self.dtype) + + pixel_values = pixel_values.reshape( + ( + batch_size * num_concurrent_media * num_tiles, + height, + width, + num_channels, + ) + ) + + aspect_ratio_ids = aspect_ratio_ids.reshape( + (batch_size * num_concurrent_media, -1) + ) + + # Patch embedding + patch_embeds = self.patch_embedding(pixel_values) + + # Permute it back to original dim of (4, 1280, 32, 32) + patch_embeds = patch_embeds.permute([0, 3, 1, 2]) + + hidden_state = patch_embeds.flatten(2).transpose(1, 2) + + # Tile embeddings + _, num_patches, dim = hidden_state.shape + + hidden_state = hidden_state.reshape( + (batch_size * num_concurrent_media, num_tiles, -1, dim) + ) + + hidden_state = self.pre_tile_positional_embedding( + hidden_state, aspect_ratio_ids + ) + + # Add cls token + hidden_state = hidden_state.reshape( + (batch_size * num_concurrent_media * num_tiles, num_patches, dim) + ) + hidden_state = self.apply_class_embedding(hidden_state) + num_patches += 1 + + # Position embeddings + hidden_state = hidden_state.reshape( + (batch_size * num_concurrent_media, num_tiles, num_patches, dim) + ) + hidden_state = self.gated_positional_embedding( + hidden_state, aspect_ratio_ids + ) + + hidden_state = self.layernorm_pre(hidden_state) + + # Compute the number of tokens to pad + curr_num_patches = StaticDim(hidden_state.shape[-2]).dim + num_padding_patches = (8 - (curr_num_patches % 8)) % 8 + # Compute padding tuple for pad function + padding = ( + 0, + 0, + 0, + num_padding_patches, + ) # (pad_left, pad_right, pad_left for dim -2, pad_right for dim -2) + # Pad the tensor + hidden_state = self._manual_constant_pad_4d( + dtype=self.dtype, + input_tensor=hidden_state, + pad=padding, + value=0, + ) + + slice_index = -num_padding_patches if num_padding_patches > 0 else None + + # Prepare attention mask + attention_mask = aspect_ratio_mask.reshape( + (batch_size * num_concurrent_media, -1) + ) # (1, 4) + + attention_mask = self._prepare_aspect_ratio_attention_mask( + aspect_ratio_mask=attention_mask, + num_patches=self.num_patches, + target_length=StaticDim(hidden_state.shape[2]).dim, + dtype=self.dtype, + ) + + # Apply encoder + hidden_state = hidden_state.reshape( + (batch_size * num_concurrent_media, -1, dim) + ) + + # hidden_state: 1, 4128, 1280 + # attention_mask: 1, 1, 4128, 4128 + + hidden_state, all_intermediate_hidden_states = self.transformer( + hidden_state, + attention_mask=attention_mask, + output_hidden_states=True, + ) + assert all_intermediate_hidden_states is not None, ( + "expect intermediate hidden states output" + ) + + hidden_state = self.layernorm_post(hidden_state) + + # Apply global encoder + hidden_state = hidden_state.reshape( + ( + batch_size * num_concurrent_media, # 1 + num_tiles, # 4 + num_patches + num_padding_patches, # 1025 + 7 = 1032 + dim, + ) + ) + hidden_state = self.post_tile_positional_embedding( + hidden_state, aspect_ratio_ids + ) + hidden_state = hidden_state.reshape( + ( + batch_size * num_concurrent_media, + num_tiles * (num_patches + num_padding_patches), + dim, + ) + ) + + global_output = self.global_transformer( + hidden_state, + attention_mask=attention_mask, + output_hidden_states=False, + ) + hidden_state = global_output[0] + + # Remove padding from hidden state. + hidden_state = hidden_state.reshape( + ( + batch_size * num_concurrent_media, # 1 + num_tiles, # 4 + num_patches + num_padding_patches, # 1025 + 7 = 1032 + dim, + ) + ) + hidden_state = hidden_state[:, :, :slice_index] + hidden_state = hidden_state.reshape( + (batch_size, num_concurrent_media, num_tiles, num_patches, dim) + ) + + # Collect intermediate layer outputs from encoder output. + intermediate_hidden_states = ops.stack( + all_intermediate_hidden_states, axis=-1 + ) + + # These two operations are similar to: + # `intermediate_hidden_states + # = intermediate_hidden_states[..., self.intermediate_layers_indices]` + # We don't currently support slicing based on a provided list of indices + # yet. + selected_hidden_states_list = [ + intermediate_hidden_states[:, :, :, idx] + for idx in self.intermediate_layers_indices + ] + intermediate_hidden_states = ops.stack( + selected_hidden_states_list, axis=-1 + ) + + # Remove padding from intermediate hidden states. + # ('batch_size' * 'num_concurrent_media', 4128, 1280, 5) + intermediate_hidden_states = intermediate_hidden_states.reshape( + ( + Dim(batch_size) * num_concurrent_media, # 1 + num_tiles, # 4 + num_patches + num_padding_patches, # 1025 + 7 = 1032 + dim * len(self.intermediate_layers_indices), + ) + ) + + # (1, 4, 1032, 6400) -> (1, 4, 1025, 6400) + intermediate_hidden_states = intermediate_hidden_states[ + :, :, :slice_index + ] + + intermediate_hidden_states = intermediate_hidden_states.reshape( + ( + batch_size, + num_concurrent_media, + num_tiles, + num_patches, + dim * len(self.intermediate_layers_indices), + ) + ) + + # Concatenate final hidden state and intermediate hidden states. + hidden_state = ops.concat( + (hidden_state, intermediate_hidden_states), axis=-1 + ) + + # output_attentions: False, output_hidden_states: False in reference + # implementation, so these are just returned as `None`s. + return ( + hidden_state, # "last_hidden_state" + None, # "hidden_states" + None, # "attentions" + ) + + +def instantiate_vision_model( + dtype: DType, + image_size: int, + patch_size: int, + supported_aspect_ratios: list[list[int]], + hidden_size: int, + max_num_tiles: int, + num_channels: int, + norm_eps: float, + attention_heads: int, + num_hidden_layers: int, + intermediate_size: int, + num_global_layers: int, + intermediate_layers_indices: list[int], + weights: Weights, +) -> VisionModel: + # Shared variables. + num_patches = (image_size // patch_size) ** 2 + 1 + max_aspect_ratio_id = (len(supported_aspect_ratios)) + 1 + + gated_positional_embedding = PrecomputedPositionEmbedding( + image_size=image_size, + patch_size=patch_size, + hidden_size=hidden_size, + max_num_tiles=max_num_tiles, + gate=weights.vision_model.gated_positional_embedding.gate.allocate( + dtype, [1] + ), + embedding=weights.vision_model.gated_positional_embedding.embedding.allocate( + dtype, + [ + num_patches, + hidden_size, + ], + ), + tile_embedding=Embedding( + weights.vision_model.gated_positional_embedding.tile_embedding.weight.allocate( + dtype, + [ + max_aspect_ratio_id, + max_num_tiles * num_patches * hidden_size, + ], + ), + ), + ) + + pre_tile_positional_embedding = PrecomputedAspectRatioEmbedding( + max_num_tiles=max_num_tiles, + hidden_size=hidden_size, + gate=weights.vision_model.pre_tile_positional_embedding.gate.allocate( + dtype, [1] + ), + embedding=Embedding( + weights.vision_model.pre_tile_positional_embedding.embedding.weight.allocate( + dtype, + [max_aspect_ratio_id, max_num_tiles * hidden_size], + ), + ), + is_gated=True, + ) + + post_tile_positional_embedding = PrecomputedAspectRatioEmbedding( + max_num_tiles=max_num_tiles, + hidden_size=hidden_size, + gate=weights.vision_model.post_tile_positional_embedding.gate.allocate( + dtype, [1] + ), + embedding=Embedding( + weights.vision_model.post_tile_positional_embedding.embedding.weight.allocate( + dtype, + [ + max_aspect_ratio_id, + max_num_tiles * hidden_size, + ], + ), + ), + is_gated=True, + ) + + # patch_embedding filter has a shape of (1280, 3, 14, 14). + patch_embedding = VisionConv2D( + filter=weights.vision_model.patch_embedding.weight.allocate( + dtype, + [hidden_size, num_channels, patch_size, patch_size], + ), + stride=patch_size, + padding=(0, 0, 0, 0), + bias=None, + ) + + class_embedding = weights.vision_model.class_embedding.allocate( + dtype, + [hidden_size], + ) + + layernorm_pre = LayerNorm( + weights.vision_model.layernorm_pre.weight.allocate( + dtype, [hidden_size] + ), + bias=weights.vision_model.layernorm_pre.bias.allocate( + dtype, [hidden_size] + ), + eps=norm_eps, + ) + + layernorm_post = LayerNorm( + weights.vision_model.layernorm_post.weight.allocate( + dtype, [hidden_size] + ), + bias=weights.vision_model.layernorm_post.bias.allocate( + dtype, [hidden_size] + ), + eps=norm_eps, + ) + + transformer_encoder_layers: list[VisionEncoderLayer] = [] + + head_dim = hidden_size // attention_heads + + for index in range(num_hidden_layers): + curr_layer_weight = weights.vision_model.transformer.layers[index] + transformer_encoder_layers.append( + VisionEncoderLayer( + mlp=MLP( + Linear( + curr_layer_weight.mlp.fc1.weight.allocate( + dtype, + [intermediate_size, hidden_size], + ), + bias=curr_layer_weight.mlp.fc1.bias.allocate( + dtype, [intermediate_size] + ), + ), + Linear( + curr_layer_weight.mlp.fc2.weight.allocate( + dtype, + [hidden_size, intermediate_size], + ), + bias=curr_layer_weight.mlp.fc2.bias.allocate( + dtype, [hidden_size] + ), + ), + ), + input_layernorm=LayerNorm( + curr_layer_weight.input_layernorm.weight.allocate( + dtype, [hidden_size] + ), + bias=curr_layer_weight.input_layernorm.bias.allocate( + dtype, [hidden_size] + ), + eps=norm_eps, + ), + post_attention_layernorm=LayerNorm( + curr_layer_weight.post_attention_layernorm.weight.allocate( + dtype, [hidden_size] + ), + bias=curr_layer_weight.post_attention_layernorm.bias.allocate( + dtype, [hidden_size] + ), + eps=norm_eps, + ), + self_attn=Attention( + n_heads=attention_heads, + head_dim=head_dim, + wk=Linear( + curr_layer_weight.self_attn.k_proj.weight.allocate( + dtype, + [attention_heads * head_dim, hidden_size], + ), + bias=None, + ), + wv=Linear( + curr_layer_weight.self_attn.v_proj.weight.allocate( + dtype, + [attention_heads * head_dim, hidden_size], + ), + bias=None, + ), + wq=Linear( + curr_layer_weight.self_attn.q_proj.weight.allocate( + dtype, + [attention_heads * head_dim, hidden_size], + ), + bias=None, + ), + wo=Linear( + curr_layer_weight.self_attn.o_proj.weight.allocate( + dtype, + [hidden_size, attention_heads * head_dim], + ), + bias=None, + ), + ), + is_gated=False, + gate_attn=None, + gate_ffn=None, + ) + ) + transformer = VisionEncoder(transformer_encoder_layers) + + global_transformer_layers: list[VisionEncoderLayer] = [] + + for index in range(num_global_layers): + curr_layer_weight = weights.vision_model.global_transformer.layers[ + index + ] + + global_transformer_layers.append( + VisionEncoderLayer( + mlp=MLP( + Linear( + curr_layer_weight.mlp.fc1.weight.allocate( + dtype, + [intermediate_size, hidden_size], + ), + bias=curr_layer_weight.mlp.fc1.bias.allocate( + dtype, [intermediate_size] + ), + ), + Linear( + curr_layer_weight.mlp.fc2.weight.allocate( + dtype, + [hidden_size, intermediate_size], + ), + bias=curr_layer_weight.mlp.fc2.bias.allocate( + dtype, [hidden_size] + ), + ), + ), + input_layernorm=LayerNorm( + curr_layer_weight.input_layernorm.weight.allocate( + dtype, [hidden_size] + ), + bias=curr_layer_weight.input_layernorm.bias.allocate( + dtype, [hidden_size] + ), + eps=norm_eps, + ), + post_attention_layernorm=LayerNorm( + curr_layer_weight.post_attention_layernorm.weight.allocate( + dtype, [hidden_size] + ), + curr_layer_weight.post_attention_layernorm.bias.allocate( + dtype, [hidden_size] + ), + eps=norm_eps, + ), + self_attn=Attention( + n_heads=attention_heads, + head_dim=head_dim, + wk=Linear( + curr_layer_weight.self_attn.k_proj.weight.allocate( + dtype, + [hidden_size, attention_heads * head_dim], + ), + bias=None, + ), + wv=Linear( + curr_layer_weight.self_attn.v_proj.weight.allocate( + dtype, + [hidden_size, attention_heads * head_dim], + ), + bias=None, + ), + wq=Linear( + curr_layer_weight.self_attn.q_proj.weight.allocate( + dtype, + [hidden_size, attention_heads * head_dim], + ), + bias=None, + ), + wo=Linear( + curr_layer_weight.self_attn.o_proj.weight.allocate( + dtype, + [attention_heads * head_dim, hidden_size], + ), + bias=None, + ), + ), + is_gated=True, + gate_attn=curr_layer_weight.gate_attn.allocate(dtype, [1]), + gate_ffn=curr_layer_weight.gate_ffn.allocate(dtype, [1]), + ) + ) + global_transformer = VisionEncoder(global_transformer_layers) + + return VisionModel( + gated_positional_embedding=gated_positional_embedding, + pre_tile_positional_embedding=pre_tile_positional_embedding, + post_tile_positional_embedding=post_tile_positional_embedding, + patch_embedding=patch_embedding, + class_embedding=class_embedding, + layernorm_pre=layernorm_pre, + layernorm_post=layernorm_post, + transformer=transformer, + global_transformer=global_transformer, + dtype=dtype, + intermediate_layers_indices=intermediate_layers_indices, + num_patches=(image_size // patch_size) ** 2 + 1, + ) diff --git a/src/max/pipelines/architectures/mistral/README.md b/src/max/pipelines/architectures/mistral/README.md new file mode 100644 index 0000000000..4603761d44 --- /dev/null +++ b/src/max/pipelines/architectures/mistral/README.md @@ -0,0 +1,129 @@ +# Mistral NeMo + +**Language:** Python + +**API**: MAX Graph + +This pipeline provides optimized support for the `MistralForCausalLM` family +of large language models, as exemplified by the Mistral NeMo 12B text +completion model. The model itself has been constructed in Python +using the [MAX Graph API](https://docs.modular.com/max/graph/). + +The MAX Graph API provides an accessible interface to the construction of +flexible accelerated compute graphs, which are then optimized by the MAX +Engine's advanced graph compiler. This pipeline showcases how a large language +model can be fully defined using Python and MAX Graphs and then compiled for +optimal inference performance via the MAX Engine. + +## Model + +[Mistral NeMo](https://mistral.ai/news/mistral-nemo/) is an open source large +language model released by [Mistral AI](https://mistral.ai) in partnership +with NVIDIA. The weight checkpoints have been released under an Apache 2.0 +license. + +The default settings for this pipeline use the NeMo 12B set of pretrained +weights in the `bfloat16` encoding. + +## Usage + +The easiest way to try out this pipeline is with our Magic command-line tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this pipeline's + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/ + ``` + +3. Now run the Mistral text completion demo with the following command: + + ```shell + magic run mistral --prompt "I believe the meaning of life is" + ``` + +4. Host a chat completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + You can configure the pipeline to be hosted by using the `--serve` argument. + For example: + + ```shell + magic run mistral --serve + ``` + + A request can be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "mistralai/Mistral-Nemo-Instruct-2407", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"} + ] + }' + ``` + + Additionally, finetuned weights hosted on Hugging Face for any compatible + `MistralForCausalLM` model can be used with this optimized architecture + via the `serve` command: + + ```shell + magic run serve --model-path=mistralai/Ministral-8B-Instruct-2410 + ``` + +## Options + +The following command-line options are available to customize operation of the +pipeline: + +- `--max-length`: Controls the maximum length of the text sequence + (includes the input tokens). + (Default value: 512) +- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 + value is provided, the model will continue to generate tokens for the entire + context length. (Default value: -1) +- `--prompt`: The text prompt to use for further generation. +- `--quantization-encoding`: The encoding to use for a datatype that can be + quantized to a low bits per weight format. The options for quantized formats + will download and cache default weights, but `float32` requires the use of + `--weight-path` to specify locally downloaded full-precision weights for use + in the model. + Valid values: `bfloat16`, `float32`. + (Default value: `float32`). +- `--save-to-serialized-model-path`: If specified, writes the serialized model + to this path. +- `--serialized-model-path`: If specified, tries to load a serialized model + from this path. +- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. +- `--weight-path`: Overrides the default URL, and allows for an + already-downloaded pretrained weight file to be used with the model. +- `--max-batch-size`: Specifies the maximum batch size to be used. + Default is 1. +- `--devices`: Specifies the device(s) to use for the model. This can optionally + be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". + Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/mistral/__init__.py b/src/max/pipelines/architectures/mistral/__init__.py new file mode 100644 index 0000000000..ca84b22cc4 --- /dev/null +++ b/src/max/pipelines/architectures/mistral/__init__.py @@ -0,0 +1,19 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import PIPELINE_REGISTRY + +from .arch import mistral_arch +from .model import MistralModel + +__all__ = ["MistralModel", "mistral_arch"] diff --git a/src/max/pipelines/architectures/mistral/arch.py b/src/max/pipelines/architectures/mistral/arch.py new file mode 100644 index 0000000000..fecc610b70 --- /dev/null +++ b/src/max/pipelines/architectures/mistral/arch.py @@ -0,0 +1,36 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from .model import MistralModel + +mistral_arch = SupportedArchitecture( + name="MistralForCausalLM", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=["mistralai/Mistral-Nemo-Instruct-2407"], + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.bfloat16: [KVCacheStrategy.CONTINUOUS] + }, + pipeline_model=MistralModel, + tokenizer=TextTokenizer, + default_weights_format=WeightsFormat.safetensors, +) diff --git a/src/max/pipelines/architectures/mistral/graph.py b/src/max/pipelines/architectures/mistral/graph.py new file mode 100644 index 0000000000..57056f8fcd --- /dev/null +++ b/src/max/pipelines/architectures/mistral/graph.py @@ -0,0 +1,253 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Build a Mistral model via Graph API from Safetensor weights.""" + +import math + +from max.dtype import DType +from max.graph import Graph, TensorType, ops +from max.graph.weights import SafetensorWeights +from max.pipelines import PipelineConfig +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + KVCacheManager, + KVCacheParams, +) +from max.pipelines.nn import ( + MLP, + AttentionWithRope, + Embedding, + Linear, + OptimizedRotaryEmbedding, + RMSNorm, + Transformer, + TransformerBlock, +) + + +def feed_forward( + dtype: DType, + hidden_dim: int, + feed_forward_length: int, + weights: SafetensorWeights, +): + return MLP( + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.gate_proj, + ), + linear( + dtype, + hidden_dim, + feed_forward_length, + weights.down_proj, + ), + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.up_proj, + ), + ) + + +def linear( + dtype: DType, + in_features: int, + out_features: int, + weights: SafetensorWeights, +) -> Linear: + return Linear( + weights.weight.allocate(dtype, [in_features, out_features], None) + ) + + +def rms_norm(dims: int, eps: float, weights: SafetensorWeights) -> RMSNorm: + return RMSNorm(weights.weight.allocate(DType.bfloat16, [dims]), eps) + + +def embedding( + params: PipelineConfig, + vocab_size: int, + hidden_dim: int, + weights: SafetensorWeights, +): + return Embedding( + weights.weight.allocate( + params.dtype, + [vocab_size, hidden_dim], + ) + ) + + +def _attention_opaque( + kv_params: KVCacheParams, + params: PipelineConfig, + rope: OptimizedRotaryEmbedding, + weights: SafetensorWeights, + layer_idx: int, +): + kv_weight_dim = ( + params.huggingface_config.head_dim + * params.huggingface_config.num_key_value_heads + ) + + wq = weights.self_attn.q_proj.weight.allocate( + params.dtype, + [ + params.huggingface_config.num_attention_heads + * params.huggingface_config.head_dim, + params.huggingface_config.hidden_size, + ], + ) + wk = weights.self_attn.k_proj.weight.allocate( + params.dtype, + [kv_weight_dim, params.huggingface_config.hidden_size], + ) + wv = weights.self_attn.v_proj.weight.allocate( + params.dtype, + [kv_weight_dim, params.huggingface_config.hidden_size], + ) + wqkv = ops.concat((wq, wk, wv)) + + return AttentionWithRope( + n_heads=params.huggingface_config.num_attention_heads, + kv_params=kv_params, + wqkv=wqkv, + wo=linear( + params.dtype, + params.huggingface_config.hidden_size, + params.huggingface_config.num_attention_heads + * params.huggingface_config.head_dim, + weights.self_attn.o_proj, + ), + rope=rope, + layer_idx=layer_idx, # type: ignore + scale=math.sqrt(1 / kv_params.head_dim), + ) + + +def _transformer( + graph: Graph, + params: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, +): + with graph: + rope = OptimizedRotaryEmbedding( + dim=params.huggingface_config.num_attention_heads + * params.huggingface_config.head_dim, + n_heads=params.huggingface_config.num_attention_heads, + theta=params.huggingface_config.rope_theta, + max_seq_len=max_seq_len, + rope_scaling=None, + interleaved=False, + ) + + layers = [ + TransformerBlock( + attention=_attention_opaque( + kv_params, + params, + rope, + weights.model.layers[i], + layer_idx=ops.constant(i, DType.uint32), # type: ignore + ), + mlp=feed_forward( + params.dtype, + params.huggingface_config.hidden_size, + params.huggingface_config.intermediate_size, + weights.model.layers[i].mlp, + ), + attention_norm=rms_norm( + params.huggingface_config.hidden_size, + params.huggingface_config.rms_norm_eps, + weights.model.layers[i].input_layernorm, + ), + mlp_norm=rms_norm( + params.huggingface_config.hidden_size, + params.huggingface_config.rms_norm_eps, + weights.model.layers[i].post_attention_layernorm, + ), + ) + for i in range(params.huggingface_config.num_hidden_layers) + ] + + embedding_layer = embedding( + params, + params.huggingface_config.vocab_size, + params.huggingface_config.hidden_size, + weights.model.embed_tokens, + ) + + output = linear( + params.dtype, + params.huggingface_config.vocab_size, + params.huggingface_config.hidden_size, + weights.lm_head, + ) + + kv_collection_cls = FetchContinuousBatchingKVCacheCollection + + return Transformer( + dim=params.huggingface_config.hidden_size, + n_heads=params.huggingface_config.num_attention_heads, + layers=layers, + norm=rms_norm( + params.huggingface_config.hidden_size, + params.huggingface_config.rms_norm_eps, + weights.model.norm, + ), + output=output, + embedding=embedding_layer, + kv_params=kv_params, + kv_collection_constructor=kv_collection_cls(kv_params), + ) + + +def _build_graph( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, + kv_manager: KVCacheManager, +) -> Graph: + tokens_type = TensorType(DType.int64, shape=["total_seq_len"]) + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"] + ) + + kv_cache_args = kv_manager.input_symbols()[0] + + with Graph( + "mistral", + input_types=[ + tokens_type, + input_row_offsets_type, + *kv_cache_args, + ], + ) as graph: + model = _transformer( + graph=graph, + params=pipeline_config, + weights=weights, + max_seq_len=max_seq_len, + kv_params=kv_params, + ) + tokens, input_row_offsets, *kv_cache = graph.inputs + outputs = model(tokens, kv_cache, input_row_offsets=input_row_offsets) + graph.output(*outputs) + return graph diff --git a/src/max/pipelines/architectures/mistral/model.py b/src/max/pipelines/architectures/mistral/model.py new file mode 100644 index 0000000000..69ba410ffa --- /dev/null +++ b/src/max/pipelines/architectures/mistral/model.py @@ -0,0 +1,254 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import time +from typing import Sequence, cast + +import numpy as np +from max.driver import Device, Tensor +from max.engine import InferenceSession, Model +from max.graph.weights import SafetensorWeights +from max.pipelines import ( + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + TextContext, + upper_bounded_default, +) +from max.pipelines.kv_cache import ( + KVCacheInputs, + KVCacheManager, + KVCacheParams, + estimate_kv_cache_size, + load_kv_manager, +) + +from .graph import _build_graph + +logger = logging.getLogger("max.pipelines") + + +class MistralInputs(ModelInputs): + """A class representing inputs for the Mistral model. + + This class encapsulates the input tensors required for the Mistral model execution: + - input_tokens: A tensor containing the input token IDs + - input_row_offsets: A tensor containing the offsets for each row in the ragged input sequence + """ + + input_tokens: Tensor + input_row_offsets: Tensor + + def __init__( + self, + input_tokens: Tensor, + input_row_offsets: Tensor, + ) -> None: + self.input_tokens = input_tokens + self.input_row_offsets = input_row_offsets + + +class MistralModel(PipelineModel[TextContext]): + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) + self.model = self.load_model(session) + + def execute( + self, + model_inputs: ModelInputs, + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + """Runs the graph.""" + model_inputs = cast(MistralInputs, model_inputs) + assert kv_cache_inputs is not None, ( + "Mistral has KV cache inputs, but none were provided" + ) + model_outputs = self.model.execute( + model_inputs.input_tokens, + model_inputs.input_row_offsets, + *kv_cache_inputs, + copy_inputs_to_device=False, + ) + assert isinstance(model_outputs[0], Tensor) + return ModelOutputs(next_token_logits=model_outputs[0]) + + def prepare_initial_token_inputs( + self, + context_batch: Sequence[TextContext], + ) -> MistralInputs: + # Get tokens and seq ids + tokens = [ctx.next_tokens for ctx in context_batch] + + # Get input_row_offsets: start and end position of each batch in the + # combined total_seq_len dimension. + input_row_offsets = Tensor.from_numpy( + np.cumsum( + [0] + [ctx.active_length for ctx in context_batch], + dtype=np.uint32, + ) + ).to(self.pipeline_config.devices[0]) + + # Create a ragged token vector of length: sum(len(t) for t in tokens). + next_tokens_batch = np.concatenate(tokens) + next_tokens_batch = Tensor.from_numpy(next_tokens_batch).to( + self.pipeline_config.devices[0] + ) + + return MistralInputs( + input_tokens=next_tokens_batch, + input_row_offsets=input_row_offsets, + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> MistralInputs: + prev_model_inputs = cast(MistralInputs, prev_model_inputs) + row_offsets_size = prev_model_inputs.input_row_offsets.shape[0] + next_row_offsets = self._input_row_offsets_prealloc[:row_offsets_size] + return MistralInputs( + input_tokens=next_tokens, + input_row_offsets=next_row_offsets, + ) + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + page_size=pipeline_config.kv_cache_page_size, + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.num_key_value_heads, + head_dim=pipeline_config.huggingface_config.head_dim, + cache_strategy=pipeline_config.cache_strategy, + enable_prefix_caching=pipeline_config.enable_prefix_caching, + ) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return pipeline_config.huggingface_config.num_hidden_layers + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.max_position_embeddings, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for Mistral, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_position_embeddings " + f"({pipeline_config.huggingface_config.max_position_embeddings})." + ) + raise ValueError(msg) from e + + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: int, + ) -> KVCacheManager: + assert self.pipeline_config.devices, ( + "devices must be provided to load kv manager." + ) + return load_kv_manager( + params=self.get_kv_params(self.pipeline_config), + max_batch_size=self.pipeline_config.max_batch_size, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + num_layers=self.pipeline_config.huggingface_config.num_hidden_layers, + devices=self.pipeline_config.devices, + available_cache_memory=available_cache_memory, + page_size=self.pipeline_config.kv_cache_page_size, + session=session, + ) + + @classmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: list[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + assert devices, "devices must be provided to estimate kv cache size." + return estimate_kv_cache_size( + params=cls.get_kv_params(pipeline_config), + max_batch_size=pipeline_config.max_batch_size, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=pipeline_config.huggingface_config.num_hidden_layers, + available_cache_memory=available_cache_memory, + devices=devices, + ) + + def load_model(self, session: InferenceSession) -> Model: + if self.pipeline_config.enable_echo: + msg = "Mistral model does not currently implement enable echo." + raise ValueError(msg) + + # Pre-allocate a buffer for input_row_offsets in multistep execution. + # We do this to avoid materializing and copying a buffer with each multistep step + assert self.pipeline_config.max_batch_size, ( + "Expected max_batch_size to be set" + ) + self._input_row_offsets_prealloc = Tensor.from_numpy( + np.arange(self.pipeline_config.max_batch_size + 1, dtype=np.uint32) + ).to(self.pipeline_config.devices[0]) + + self._weights = self.pipeline_config.load_weights() + + if not isinstance(self._weights, SafetensorWeights): + msg = "only safetensors weights are currently supported in Mistral models." + raise ValueError(msg) + + if serialized_path := self.pipeline_config.serialized_model_path: + # Hydrate all weights to be referenced by the serialized graph. + weights_registry = {} + for name, weight in self._weights.items(): + weights_registry[name] = weight.raw_tensor() + logger.info( + "Loading serialized model from ", serialized_path, "..." + ) + return session.load( + serialized_path, + weights_registry=weights_registry, + ) + else: + logger.info("Building and compiling model...") + before = time.perf_counter() + graph = _build_graph( + pipeline_config=self.pipeline_config, + weights=self._weights, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + kv_params=self.get_kv_params(self.pipeline_config), + kv_manager=self.kv_manager, + ) + model = session.load( + graph, weights_registry=self._weights.allocated_weights + ) + after = time.perf_counter() + logger.info( + f"Building and compiling model took {after - before:.6f} seconds" + ) + if ( + export_path + := self.pipeline_config.save_to_serialized_model_path + ): + logger.info("Exporting serialized model to %s", export_path) + model._export_mef(export_path) + return model diff --git a/src/max/pipelines/architectures/mpnet/__init__.py b/src/max/pipelines/architectures/mpnet/__init__.py new file mode 100644 index 0000000000..b1252f1b47 --- /dev/null +++ b/src/max/pipelines/architectures/mpnet/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import mpnet_arch + +__all__ = ["mpnet_arch"] diff --git a/src/max/pipelines/architectures/mpnet/arch.py b/src/max/pipelines/architectures/mpnet/arch.py new file mode 100644 index 0000000000..9c124954a6 --- /dev/null +++ b/src/max/pipelines/architectures/mpnet/arch.py @@ -0,0 +1,38 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) + +from .model import MPNetPipelineModel + +mpnet_arch = SupportedArchitecture( + name="MPNetForMaskedLM", + task=PipelineTask.EMBEDDINGS_GENERATION, + example_repo_ids=[ + "sentence-transformers/all-mpnet-base-v2", + ], + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.float32: [], + SupportedEncoding.bfloat16: [], + }, + pipeline_model=MPNetPipelineModel, + tokenizer=TextTokenizer, + default_weights_format=WeightsFormat.safetensors, +) diff --git a/src/max/pipelines/architectures/mpnet/graph.py b/src/max/pipelines/architectures/mpnet/graph.py new file mode 100644 index 0000000000..89173e9064 --- /dev/null +++ b/src/max/pipelines/architectures/mpnet/graph.py @@ -0,0 +1,493 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +from __future__ import annotations + +import math + +import numpy as np +from max.dtype import DType +from max.graph import Graph, TensorType, TensorValue, ops +from max.graph.quantization import QuantizationEncoding +from max.graph.weights import Weights +from max.pipelines import PipelineConfig +from max.pipelines.nn import Embedding, LayerNorm, Linear, Sequential +from max.pipelines.nn.layer import Layer + + +def _quantization_encoding( + pipeline_config: PipelineConfig, +) -> QuantizationEncoding | None: + if supported_encoding := pipeline_config.quantization_encoding: + return supported_encoding.quantization_encoding + return None + + +class MPNetEmbeddings(Layer): + """An embeddings layer that combines the tokens embeddings and positions + embeddings.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + config = self.config = pipeline_config.huggingface_config + self.word_embeddings = Embedding( + weights.word_embeddings.weight.allocate( + pipeline_config.dtype, + [ + config.vocab_size, + config.hidden_size, + ], + _quantization_encoding(pipeline_config), + ) + ) + self.position_embeddings = Embedding( + weights.position_embeddings.weight.allocate( + pipeline_config.dtype, + [ + config.max_position_embeddings, + config.hidden_size, + ], + ) + ) + self.layer_norm = LayerNorm( + weight=weights.LayerNorm.weight.allocate( + pipeline_config.dtype, + [config.hidden_size], + ), + bias=weights.LayerNorm.bias.allocate( + pipeline_config.dtype, [config.hidden_size] + ), + eps=config.layer_norm_eps, + ) + self.position_ids = weights.position_ids.allocate( + DType.int64, + [ + 1, + config.max_position_embeddings, + ], + ) + + def __call__( + self, + input_ids: TensorValue, + ) -> TensorValue: + position_ids = _create_position_ids_from_input_ids( + input_ids, self.config.pad_token_id + ) + inputs_embeds = self.word_embeddings(input_ids) + position_embeddings = self.position_embeddings(position_ids) + embeddings = inputs_embeds + position_embeddings + return self.layer_norm(embeddings) + + +def _create_position_ids_from_input_ids( + input_ids: TensorValue, padding_idx: int +) -> TensorValue: + mask = (input_ids != padding_idx).cast(DType.int64) + incremental_indices = ops.cumsum(mask, axis=1) * mask + return incremental_indices + padding_idx + + +class MPNetSelfAttention(Layer): + """Self-attention layer with position compensation.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + config = pipeline_config.huggingface_config + self.num_attention_heads = config.num_attention_heads + self.attention_head_size = int( + config.hidden_size / config.num_attention_heads + ) + self.all_head_size = self.num_attention_heads * self.attention_head_size + + self.q = Linear( + weights.q.weight.allocate( + pipeline_config.dtype, + [self.all_head_size, config.hidden_size], + _quantization_encoding(pipeline_config), + ), + bias=weights.q.bias.allocate( + pipeline_config.dtype, + [self.all_head_size], + _quantization_encoding(pipeline_config), + ), + ) + self.k = Linear( + weights.k.weight.allocate( + pipeline_config.dtype, + [self.all_head_size, config.hidden_size], + _quantization_encoding(pipeline_config), + ), + bias=weights.k.bias.allocate( + pipeline_config.dtype, + [self.all_head_size], + _quantization_encoding(pipeline_config), + ), + ) + self.v = Linear( + weights.v.weight.allocate( + pipeline_config.dtype, + [self.all_head_size, config.hidden_size], + _quantization_encoding(pipeline_config), + ), + bias=weights.v.bias.allocate( + pipeline_config.dtype, + [self.all_head_size], + _quantization_encoding(pipeline_config), + ), + ) + self.o = Linear( + weights.o.weight.allocate( + pipeline_config.dtype, + [config.hidden_size, config.hidden_size], + _quantization_encoding(pipeline_config), + ), + bias=weights.o.bias.allocate( + pipeline_config.dtype, + [config.hidden_size], + _quantization_encoding(pipeline_config), + ), + ) + + def transpose_for_scores(self, x: TensorValue) -> TensorValue: + new_x_shape = x.shape[:-1] + [ + self.num_attention_heads, + self.attention_head_size, + ] + x = ops.reshape(x, new_x_shape) + return ops.permute(x, [0, 2, 1, 3]) + + def __call__( + self, + hidden_states, + attention_mask: TensorValue, + position_bias: TensorValue, + ) -> TensorValue: + q = self.q(hidden_states) + k = self.k(hidden_states) + v = self.v(hidden_states) + + q = self.transpose_for_scores(q) + k = self.transpose_for_scores(k) + v = self.transpose_for_scores(v) + + # Take the dot product between "query" and "key" to get the raw attention scores. + attention_scores = q @ k.transpose(-1, -2) + attention_scores = attention_scores / math.sqrt( + self.attention_head_size + ) + + # Apply relative position embedding (precomputed in MPNetEncoder). + attention_scores += position_bias + + attention_scores = attention_scores + attention_mask + + # Normalize the attention scores to probabilities. + attention_probs = ops.softmax(attention_scores) + + c = attention_probs @ v + + c = ops.permute(c, [0, 2, 1, 3]) + new_c_shape = c.shape[:-2] + [self.all_head_size] + c = ops.reshape(c, new_c_shape) + + return self.o(c) + + +class MPNetAttention(Layer): + """Container for the attention and attention output layer norm layers.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + config = pipeline_config.huggingface_config + self.attn = MPNetSelfAttention(pipeline_config, weights.attn) + self.layer_norm = LayerNorm( + weight=weights.LayerNorm.weight.allocate( + DType.float32, [config.hidden_size] + ), + bias=weights.LayerNorm.bias.allocate( + DType.float32, [config.hidden_size] + ), + eps=config.layer_norm_eps, + ) + + def __call__( + self, + hidden_states: TensorValue, + attention_mask: TensorValue, + position_bias: TensorValue, + ) -> TensorValue: + attn_output = self.attn( + hidden_states, + attention_mask, + position_bias, + ) + return self.layer_norm(attn_output + hidden_states) + + +_ACTIVATIONS = { + "gelu": ops.gelu, + "relu": ops.relu, + "silu": ops.silu, + "sigmoid": ops.sigmoid, + "tanh": ops.tanh, +} + + +class MPNetIntermediate(Layer): + """Fully connected layer with an activation function.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + config = pipeline_config.huggingface_config + self.dense = Linear( + weights.dense.weight.allocate( + pipeline_config.dtype, + [config.intermediate_size, config.hidden_size], + _quantization_encoding(pipeline_config), + ), + bias=weights.dense.bias.allocate( + pipeline_config.dtype, + [config.intermediate_size], + _quantization_encoding(pipeline_config), + ), + ) + self.intermediate_act_fn = _ACTIVATIONS[config.hidden_act] + + def __call__(self, hidden_states: TensorValue) -> TensorValue: + hidden_states = self.dense(hidden_states) + hidden_states = self.intermediate_act_fn(hidden_states) + return hidden_states + + +class MPNetOutput(Layer): + """Layer that combines the outputs of the intermediate and attention layers.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + config = pipeline_config.huggingface_config + self.dense = Linear( + weights.dense.weight.allocate( + pipeline_config.dtype, + [config.hidden_size, config.intermediate_size], + _quantization_encoding(pipeline_config), + ), + bias=weights.dense.bias.allocate( + pipeline_config.dtype, + [config.hidden_size], + _quantization_encoding(pipeline_config), + ), + ) + self.layer_norm = LayerNorm( + weight=weights.LayerNorm.weight.allocate( + DType.float32, [config.hidden_size] + ), + bias=weights.LayerNorm.bias.allocate( + DType.float32, [config.hidden_size] + ), + eps=config.layer_norm_eps, + ) + + def __call__( + self, hidden_states: TensorValue, input_tensor: TensorValue + ) -> TensorValue: + hidden_states = self.dense(hidden_states) + hidden_states = self.layer_norm(hidden_states + input_tensor) + return hidden_states + + +class MPNetLayer(Layer): + """An Encoder layer block.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + self.attention = MPNetAttention(pipeline_config, weights.attention) + self.intermediate = MPNetIntermediate( + pipeline_config, weights.intermediate + ) + self.output = MPNetOutput(pipeline_config, weights.output) + + def __call__( + self, + hidden_states: TensorValue, + attention_mask: TensorValue, + position_bias: TensorValue, + ) -> TensorValue: + attention_output = self.attention( + hidden_states, + attention_mask, + position_bias=position_bias, + ) + intermediate_output = self.intermediate(attention_output) + layer_output = self.output(intermediate_output, attention_output) + return layer_output + + +class MPNetEncoder(Layer): + """Encoder that contains stacks of MPNetLayers.""" + + def __init__(self, pipeline_config: PipelineConfig, weights: Weights): + config = self.config = pipeline_config.huggingface_config + self.n_heads = config.num_attention_heads + num_hidden_layers = config.num_hidden_layers + self.layer = Sequential( + [ + MPNetLayer(pipeline_config, weights.layer[n]) + for n in range(num_hidden_layers) + ] + ) + self.relative_attention_bias = Embedding( + weights.relative_attention_bias.weight.allocate( + pipeline_config.dtype, + [ + config.relative_attention_num_buckets, + config.num_attention_heads, + ], + ) + ) + self.num_attention_heads = config.num_attention_heads + + def __call__( + self, + hidden_states: TensorValue, + attention_mask: TensorValue, + ) -> TensorValue: + position_bias = self.compute_position_bias(hidden_states) + for layer in self.layer.layers: + hidden_states = layer( + hidden_states, + attention_mask, + position_bias, + ) + return hidden_states + + def compute_position_bias(self, hidden_states: TensorValue) -> TensorValue: + shape = hidden_states.shape + bsz, qlen, klen = shape[0], shape[1], shape[1] + start = ops.constant(0, DType.int64) + step = ops.constant(1, DType.int64) + context_position = ops.range(start, qlen, step, qlen).cast(DType.int64)[ + :, None + ] + memory_position = ops.range(start, klen, step, klen).cast(DType.int64)[ + None, : + ] + relative_position = memory_position - context_position + rp_bucket = self.relative_position_bucket( + relative_position, + num_buckets=self.config.relative_attention_num_buckets, + ) + values = self.relative_attention_bias(rp_bucket) + values = ops.unsqueeze(ops.permute(values, [2, 0, 1]), 0) + values = ops.broadcast_to( + values, + [bsz, self.num_attention_heads, qlen, klen], + ) + return values + + @staticmethod + def relative_position_bucket( + relative_position: TensorValue, num_buckets=32, max_distance=128 + ) -> TensorValue: + n = -relative_position + + num_buckets //= 2 + ret = (n < 0).cast(DType.int64) * num_buckets + n = ops.abs(n) + + max_exact = num_buckets // 2 + is_small = n < max_exact + + val_if_large = max_exact + ops.cast( + ops.log(ops.cast(n, DType.float32) / max_exact) + / math.log(max_distance / max_exact) + * (num_buckets - max_exact), + DType.int64, + ) + + # Roundabout implementation of full_like(val_if_large, num_buckets - 1). + max_bucket = ops.broadcast_to( + ops.constant(num_buckets - 1, DType.int64), val_if_large.shape + ) + + val_if_large = ops.min(val_if_large, max_bucket) + ret += ops.select(is_small, n, val_if_large) + return ret + + +class MPNetModel(Layer): + """The MPNet encoder model. + + Based on the MPNetModel transformers implementation.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + weights: Weights, + ): + self.embeddings = MPNetEmbeddings(pipeline_config, weights.embeddings) + self.encoder = MPNetEncoder(pipeline_config, weights.encoder) + self.pool_outputs = pipeline_config.pool_embeddings + + def __call__( + self, + input_ids: TensorValue, + attention_mask: TensorValue, + ) -> TensorValue: + embedding_output = self.embeddings( + input_ids=input_ids, + ) + extended_attention_mask = ops.reshape( + attention_mask, ("batch_size", 1, 1, "seq_len") + ) + extended_attention_mask = (1 - extended_attention_mask) * ops.constant( + np.finfo(np.float32).min, DType.float32 + ) + encoded_results = self.encoder( + embedding_output, + attention_mask=extended_attention_mask, + ) + if self.pool_outputs: + # Pool the embeddings. + # TODO(KERN-1550): Since GPU can only apply reductions along the + # inner-most dimension, transpose the mask so the seq_len is last. + encoded_results = encoded_results.transpose(1, 2) + input_mask_expanded = ops.broadcast_to( + ops.unsqueeze(attention_mask, 1), + ("batch_size", encoded_results.shape[1], "seq_len"), + ) + input_lengths = ops.max( + ops.sum(input_mask_expanded), ops.constant(1e-9, DType.float32) + ) + pooled_output = ( + ops.sum(encoded_results * input_mask_expanded) / input_lengths + ) + return ops.squeeze(pooled_output, 2) + else: + return encoded_results + + +def build_graph( + pipeline_config: PipelineConfig, + weights: Weights, +) -> Graph: + # Graph input types. + input_ids_type = TensorType(DType.int64, shape=["batch_size", "seq_len"]) + attention_mask_type = TensorType( + DType.float32, shape=["batch_size", "seq_len"] + ) + + mpnet = MPNetModel(pipeline_config, weights) + + # Initialize Graph. + return Graph( + "mpnet", + mpnet, + input_types=[ + input_ids_type, + attention_mask_type, + ], + ) diff --git a/src/max/pipelines/architectures/mpnet/model.py b/src/max/pipelines/architectures/mpnet/model.py new file mode 100644 index 0000000000..72180fe367 --- /dev/null +++ b/src/max/pipelines/architectures/mpnet/model.py @@ -0,0 +1,200 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Defines the MPNet pipeline model. + +Implementation is based on MPNetModel from the transformers library. +""" + +from __future__ import annotations + +import logging +import time +from collections.abc import Sequence +from typing import cast + +import numpy as np +from max.driver import Tensor +from max.engine import InferenceSession, Model +from max.pipelines import ( + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + TextContext, + upper_bounded_default, +) +from max.pipelines.dataprocessing import collate_batch +from max.pipelines.kv_cache import KVCacheInputs, KVCacheParams + +from .graph import build_graph + +logger = logging.getLogger("max.pipelines") + +PAD_VALUE = 1 + + +class MPNetInputs(ModelInputs): + """A class representing inputs for the MPNet model. + + This class encapsulates the input tensors required for the MPNet model execution: + - next_tokens_batch: A tensor containing the input token IDs + - attention_mask: A tensor containing the extended attention mask + """ + + next_tokens_batch: Tensor + attention_mask: Tensor + + def __init__( + self, + next_tokens_batch: Tensor, + attention_mask: Tensor, + ) -> None: + self.next_tokens_batch = next_tokens_batch + self.attention_mask = attention_mask + + +class MPNetPipelineModel(PipelineModel[TextContext]): + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) + self.model = self.load_model(session) + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.num_attention_heads, + head_dim=( + pipeline_config.huggingface_config.hidden_size + // pipeline_config.huggingface_config.num_attention_heads + ), + cache_strategy=pipeline_config.cache_strategy, + enable_prefix_caching=pipeline_config.enable_prefix_caching, + ) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return pipeline_config.huggingface_config.num_hidden_layers + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.max_position_embeddings, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for MPNet, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_position_embeddings " + f"({pipeline_config.huggingface_config.max_position_embeddings})." + ) + raise ValueError(msg) from e + + def execute( + self, + model_inputs: ModelInputs, + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + model_inputs = cast(MPNetInputs, model_inputs) + assert kv_cache_inputs is None, "MPNet does not have KV cache inputs" + model_outputs = self.model.execute( + model_inputs.next_tokens_batch, + model_inputs.attention_mask, + copy_inputs_to_device=False, + ) + assert isinstance(model_outputs[0], Tensor) + return ModelOutputs(logits=model_outputs[0]) + + def prepare_initial_token_inputs( + self, + context_batch: Sequence[TextContext], + ) -> MPNetInputs: + # Get tokens and seq_ids. + tokens = [ctx.next_tokens for ctx in context_batch] + + # Pad tokens for the batch. + pad_value = getattr( + self.pipeline_config.huggingface_config, "pad_token_id", 1 + ) + next_tokens_batch, _ = collate_batch( + tokens, + pad_value=pad_value, + batch_size=len(tokens), + pad_to_multiple_of=self.pipeline_config.pad_to_multiple_of, + ) + + # Compute attention mask. + attention_mask = (next_tokens_batch != pad_value).astype(np.float32) + + return MPNetInputs( + next_tokens_batch=Tensor.from_numpy(next_tokens_batch).to( + self.pipeline_config.devices[0] + ), + attention_mask=Tensor.from_numpy(attention_mask).to( + self.pipeline_config.devices[0] + ), + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> MPNetInputs: + raise NotImplementedError( + "MPNet does not support preparing next tokens inputs." + ) + + def load_model( + self, + session: InferenceSession, + ) -> Model: + # Read in weights. + weights = self.pipeline_config.load_weights() + self._weights = weights + + if serialized_path := self.pipeline_config.serialized_model_path: + # Hydrate all weights to be referenced by the serialized path. + weights_registry = {} + for name, weight in self._weights.items(): + weights_registry[name] = weight.raw_tensor() + + logger.info("Loading serialized model from ", serialized_path) + + return session.load( + serialized_path, weights_registry=weights_registry + ) + + else: + logger.info("Building and compiling model...") + before = time.perf_counter() + graph = build_graph( + self.pipeline_config, + self._weights, + ) + model = session.load( + graph, weights_registry=self._weights.allocated_weights + ) + after = time.perf_counter() + logger.info( + f"Building and compiling model took {after - before:.6f} seconds" + ) + if ( + export_path + := self.pipeline_config.save_to_serialized_model_path + ): + logger.info("Exporting serialized model to %s", export_path) + model._export_mef(export_path) + return model diff --git a/src/max/pipelines/architectures/olmo/__init__.py b/src/max/pipelines/architectures/olmo/__init__.py new file mode 100644 index 0000000000..41fbdf80ac --- /dev/null +++ b/src/max/pipelines/architectures/olmo/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import olmo_arch + +__all__ = ["olmo_arch"] diff --git a/src/max/pipelines/architectures/olmo/arch.py b/src/max/pipelines/architectures/olmo/arch.py new file mode 100644 index 0000000000..b6047631c7 --- /dev/null +++ b/src/max/pipelines/architectures/olmo/arch.py @@ -0,0 +1,52 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + RopeType, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from ..llama3 import weight_adapters +from .model import OlmoModel + +olmo_arch = SupportedArchitecture( + name="OlmoForCausalLM", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=["allenai/OLMo-1B-hf", "allenai/OLMo-1B-0724-hf"], + default_weights_format=WeightsFormat.gguf, + default_encoding=SupportedEncoding.float32, + supported_encodings={ + SupportedEncoding.float32: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + }, + pipeline_model=OlmoModel, + tokenizer=TextTokenizer, + rope_type=RopeType.normal, + weight_adapters={ + WeightsFormat.safetensors: weight_adapters.convert_safetensor_state_dict, + WeightsFormat.gguf: weight_adapters.convert_gguf_state_dict, + }, +) diff --git a/src/max/pipelines/architectures/olmo/model.py b/src/max/pipelines/architectures/olmo/model.py new file mode 100644 index 0000000000..5abe981ecf --- /dev/null +++ b/src/max/pipelines/architectures/olmo/model.py @@ -0,0 +1,32 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from typing import Literal + +from max.engine import InferenceSession +from max.pipelines import PipelineConfig + +from ..llama3.model import LlamaModelBase + + +class OlmoModel(LlamaModelBase): + """Olmo pipeline model implementation.""" + + norm_method: Literal["rms_norm"] | Literal["layer_norm"] = "layer_norm" + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) diff --git a/src/max/pipelines/architectures/phi3/__init__.py b/src/max/pipelines/architectures/phi3/__init__.py new file mode 100644 index 0000000000..577e2e1a5b --- /dev/null +++ b/src/max/pipelines/architectures/phi3/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import phi3_arch + +__all__ = ["phi3_arch"] diff --git a/src/max/pipelines/architectures/phi3/arch.py b/src/max/pipelines/architectures/phi3/arch.py new file mode 100644 index 0000000000..ad4bf4a656 --- /dev/null +++ b/src/max/pipelines/architectures/phi3/arch.py @@ -0,0 +1,52 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + RopeType, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from ..llama3 import weight_adapters +from .model import Phi3Model + +phi3_arch = SupportedArchitecture( + name="Phi3ForCausalLM", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=["microsoft/phi-4", "microsoft/Phi-3.5-mini-instruct"], + default_weights_format=WeightsFormat.gguf, + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.float32: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + # KVCacheStrategy.NAIVE, # TODO(kathywu): Support naive caching for phi models + ], + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + # KVCacheStrategy.NAIVE, # TODO(kathywu): Support naive caching for phi models + ], + }, + pipeline_model=Phi3Model, + tokenizer=TextTokenizer, + rope_type=RopeType.normal, + weight_adapters={ + WeightsFormat.safetensors: weight_adapters.convert_safetensor_state_dict, + WeightsFormat.gguf: weight_adapters.convert_gguf_state_dict, + }, +) diff --git a/src/max/pipelines/architectures/phi3/model.py b/src/max/pipelines/architectures/phi3/model.py new file mode 100644 index 0000000000..494e8a53f9 --- /dev/null +++ b/src/max/pipelines/architectures/phi3/model.py @@ -0,0 +1,33 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from typing import Literal + +from max.engine import InferenceSession +from max.pipelines import PipelineConfig + +from ..llama3.model import LlamaModelBase + + +class Phi3Model(LlamaModelBase): + """Phi 3 pipeline model implementation.""" + + norm_method: Literal["rms_norm"] | Literal["layer_norm"] = "rms_norm" + """Normalization layer.""" + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) diff --git a/src/max/pipelines/architectures/pixtral/README.md b/src/max/pipelines/architectures/pixtral/README.md new file mode 100644 index 0000000000..4911c4ac85 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/README.md @@ -0,0 +1,134 @@ +# Pixtral + +**Language:** Python + +**API**: MAX Graph + +This pipeline provides optimized support for the +`LlavaForConditionalGeneration` family of multimodal models, as exemplified +by the Pixtral multimodal text generation model. The model itself has +been constructed in Python using the +[MAX Graph API](https://docs.modular.com/max/graph/). + +The MAX Graph API provides an accessible interface to the construction of +flexible accelerated compute graphs, which are then optimized by the MAX +Engine's advanced graph compiler. This pipeline showcases how a multimodal +model can be fully defined using Python and MAX Graphs and then compiled for +optimal inference performance via the MAX Engine. + +> [!NOTE] +> This pipeline is under active development, and while many layers have been +> implemented, the entire pipeline is not fully functional at present. + +## Model + +[Pixtral](https://mistral.ai/news/pixtral-12b/) +is an open source multimodal model released by Mistral AI. It handles both text +and image input, and allows for text generation based on those multimodal +inputs. The underlying architecture provides support for the broader +`LlavaForConditionalGeneration` family of models. + +The default settings for this pipeline use the 12B set of pretrained weights in +the `bfloat16` encoding. + +## Usage + +The easiest way to try out this pipeline is with our Magic command-line tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this pipeline's + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/pipelines + ``` + +3. Host a multimodal chat completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + You can configure the pipeline to be hosted by using the `serve` command. + Weights hosted on Hugging Face for any compatible + `LlavaForConditionalGeneration` model can be used with this optimized + architecture. For example: + + ```shell + magic run serve --model-path mistral-community/pixtral-12b + ``` + + A request can be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "mistral-community/pixtral-12b", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": [ + {"type": "text", "text": "What is in this image?"}, + {"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}} + ]} + ] + }' + ``` + +## Options + +The following command-line options are available to customize operation of the +pipeline: + +- `--model-path`: Specify the repository ID of a Hugging Face model + repository to use. This is used to load tokenizers, architectures and model + weights. +- `--force-download`: Specify whether to force a download of configuration + files and weights even if they already exist in the local cache. Set this + if you want to ensure you have the correct version of the model. +- `--max-batch-size`: Specifies the maximum batch size to be used. + Default is 1. +- `--max-ce-batch-size`: Set the maximum cache size reserved for a single + context encoding batch. The effective limit will be the lesser of this value + and `max-cache-batch-size`. + Default is 32. +- `--max-length`: Controls the maximum length of the text sequence (includes the + input tokens). Defaults to huggingface model config's max sequence length. +- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 + value is provided, the model will continue to generate tokens for the entire + context length. (Default value: -1) +- `--quantization-encoding`: The encoding to use for a datatype that can be + quantized to a low bits per weight format. + Valid values: `q4_0`, `q4_k`, `q6_k`, `bfloat16`, `float32`. + (Default value: `bfloat16`). +- `--save-to-serialized-model-path`: If specified, writes the serialized model + to this path. +- `--serialized-model-path`: If specified, tries to load a serialized model + from this path. +- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. +- `--trust-remote-code`: Indicate whether to allow custom modeling files from + Hugging Face repositories. Set this to true with caution, as it may + introduce security risks. +- `--weight-path`: Overrides the default URL, and allows for an + already-downloaded pretrained weight file to be used with the model. +- `--devices`: Specifies the device(s) to use for the model. This can optionally + be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". + Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/pixtral/__init__.py b/src/max/pipelines/architectures/pixtral/__init__.py new file mode 100644 index 0000000000..06f1d43e25 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import pixtral_arch + +__all__ = ["pixtral_arch"] diff --git a/src/max/pipelines/architectures/pixtral/arch.py b/src/max/pipelines/architectures/pixtral/arch.py new file mode 100644 index 0000000000..580d90e126 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/arch.py @@ -0,0 +1,39 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + SupportedArchitecture, + SupportedEncoding, + TextAndVisionTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from .pixtral import PixtralModel + +pixtral_arch = SupportedArchitecture( + name="LlavaForConditionalGeneration", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=["mistral-community/pixtral-12b"], + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + ], + }, + pipeline_model=PixtralModel, + tokenizer=TextAndVisionTokenizer, + default_weights_format=WeightsFormat.safetensors, +) diff --git a/src/max/pipelines/architectures/pixtral/llava/__init__.py b/src/max/pipelines/architectures/pixtral/llava/__init__.py new file mode 100644 index 0000000000..aae087fcca --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/llava/__init__.py @@ -0,0 +1,14 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Llava Code layer modules.""" diff --git a/src/max/pipelines/architectures/pixtral/llava/llava.py b/src/max/pipelines/architectures/pixtral/llava/llava.py new file mode 100644 index 0000000000..e6c5fe0dd5 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/llava/llava.py @@ -0,0 +1,178 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from dataclasses import dataclass + +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.architectures.pixtral.vision_encoder.vision_encoder import ( + VisionEncoder, +) +from max.pipelines.nn.layer import Layer + +from .llava_decoder import Transformer +from .llava_projector import LlavaMultiModalConnector + + +@dataclass +class LlavaConditionalGeneration(Layer): + """The LLAVA model which consists of a vision encoder and a language model. + + image_token_index: a specific token index used to denote images in input_ids. + """ + + vision_encoder: VisionEncoder + multi_modal_projector: LlavaMultiModalConnector + language_model: Transformer + vocab_size: int + image_token_index: int = 10 + vision_feature_layer: int = -1 + vision_feature_select_strategy: str = "full" + image_seq_length: int = 1 + + # TODO: change pixel_values type to List[TensorValue] to support multiple images. + def __call__( + self, + input_ids: TensorValueLike, + pixel_values: TensorValueLike, + attention_mask: TensorValueLike, + kv_cache_inputs: tuple[ + TensorValue, TensorValue, TensorValue, TensorValue + ], + **kwargs, + ) -> tuple[TensorValue, ...]: + """ + Args: + input_ids (ragged `TensorValue` of shape `(batch_size * sequence_length for each batch)`): + Indices of input sequence tokens in the vocabulary. Can be obtained from language model tokenizer. + input_ids[i] is a sequence of token ids (indices) in sequence i. Expanding inputs for + image tokens in LLaVa should be done in processing. Each image is represented in the + input_ids sequence by a sequence of patches that have index(id) = self.image_token_index. + The maximum number of image tokens in one sequence (prompt) = + (input_ids == self.image_token_index).sum(1).max()) + Padding will be ignored by default should you provide it. + pixel_values (list`TensorValue` of length batch_size + The tensors corresponding to the input image are of shape `(image_height, image_width, num_channels)): + Pixel values can be obtained using ImageProcessor. + """ + # inputs_embeds shape (total_sequence_length=text_and_image_tokens_length for all seqs, + # language_model_hidden_dim) + inputs_embeds = self.language_model.embedding(input_ids) + + # Replace image place-holders in inputs_embeds with image embeddings. + # Obtain image embeddings from the vision encoder and project it to text embeddings space. + # Output shape = (num_images, num_patches_in_image, language_model_hidden_dim) + # TODO(AIPIPE-320): If input pixel_values is a list of images, don't wrap it in a list. + image_embeds = self.multi_modal_projector( + self.vision_encoder( + imgs=[pixel_values], attention_mask=attention_mask + ) + ) + image_embeds = ops.cast(image_embeds, inputs_embeds.dtype) + special_image_mask = ops.broadcast_to( + ops.unsqueeze((input_ids == self.image_token_index), -1), + inputs_embeds.shape, + ) + inputs_embeds = ops.masked_scatter( + inputs_embeds, special_image_mask, image_embeds + ) + + logits = self.language_model(inputs_embeds, kv_cache_inputs, **kwargs) + + return logits + + +@dataclass +class LlavaVisionEncoder(Layer): + """The LLAVA model which consists of a vision encoder and a language model. + + image_token_index: a specific token index used to denote images + """ + + vision_encoder: VisionEncoder + multi_modal_projector: LlavaMultiModalConnector + + # TODO: change pixel_values type to List[TensorValue] to support multiple images. + def __call__( + self, + pixel_values: TensorValueLike, + attention_mask: TensorValueLike, + **kwargs, + ) -> TensorValue: + """ + Args: + pixel_values (list`TensorValue` of length batch_size + The tensors corresponding to the input image are of shape `(image_height, image_width, num_channels)): + Pixel values can be obtained using ImageProcessor. + """ + # Replace image place-holders in inputs_embeds with image embeddings. + # Obtain image embeddings from the vision encoder and project it to text embeddings space. + # Output shape = (num_images, num_patches_in_image, language_model_hidden_dim) + # TODO(AIPIPE-320): If input pixel_values is a list of images, don't wrap it in a list. + return self.multi_modal_projector( + self.vision_encoder( + imgs=[pixel_values], attention_mask=attention_mask + ) + ) + + +@dataclass +class LlavaConditionalGenerationTextOnly(Layer): + """The LLAVA model which consists of a vision encoder and a language model. + + Because flow control is not added to the graph API yet. We have to create 2 llava models. + + image_token_index: a specific token index used to denote images + """ + + language_model: Transformer + vocab_size: int + image_token_index: int = 10 + + def __call__( + self, + input_ids: TensorValueLike, + image_embeds: TensorValue, + kv_cache_inputs: tuple[ + TensorValue, TensorValue, TensorValue, TensorValue + ], + **kwargs, + ) -> tuple[TensorValue, ...]: + """ + Args: + input_ids (ragged `TensorValue` of shape `(batch_size * sequence_length for each batch)`): + Indices of input sequence tokens in the vocabulary. Can be obtained from language model tokenizer. + input_ids[i] is a sequence of token ids (indices) in sequence i. Expanding inputs for + image tokens in LLaVa should be done in processing. Each image is represented in the + input_ids sequence by a sequence of patches that have index(id) = self.image_token_index. + The maximum number of image tokens in one sequence (prompt) = + (input_ids == self.image_token_index).sum(1).max()) + Padding will be ignored by default should you provide it. + inputs_embeds: + Embeddings of pixel_values generated by the vision encoder and projected to the + embedding space of the language model. + """ + # inputs_embeds shape (total_sequence_length=text_and_image_tokens_length for all seqs, + # language_model_hidden_dim) + inputs_embeds = self.language_model.embedding(input_ids) + + image_embeds = ops.cast(image_embeds, inputs_embeds.dtype) + special_image_mask = ops.broadcast_to( + ops.unsqueeze((input_ids == self.image_token_index), -1), + inputs_embeds.shape, + ) + inputs_embeds = ops.masked_scatter( + inputs_embeds, special_image_mask, image_embeds + ) + logits = self.language_model(inputs_embeds, kv_cache_inputs, **kwargs) + + return logits diff --git a/src/max/pipelines/architectures/pixtral/llava/llava_decoder.py b/src/max/pipelines/architectures/pixtral/llava/llava_decoder.py new file mode 100644 index 0000000000..3e4c1c4c8e --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/llava/llava_decoder.py @@ -0,0 +1,128 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from dataclasses import dataclass +from typing import Union + +from max.dtype import DType +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, +) +from max.pipelines.nn import ( + Embedding, + LayerNorm, + Linear, + RMSNorm, + TransformerBlock, +) +from max.pipelines.nn.layer import Layer + + +@dataclass +class Transformer(Layer): + """Transformer model consisting for TransformerBlock layers. + + The differences between this transformer and the transformer in nn: + + - It takes as input the token embeddings rather than the token ids. + - It skips the embedding generation (first step in nn.Transformer). + + TODO(AIPIPE-273): Once we have mo.if, we can update nn.Transformer + to only generate embeddings if token ids are passed. That would + eliminate the need for this class. + """ + + dim: int + n_heads: int + layers: list[TransformerBlock] + norm: Union[RMSNorm, LayerNorm] + output: Linear + embedding: Embedding + kv_params: KVCacheParams + kv_collection_constructor: Union[ + FetchContinuousBatchingKVCacheCollection, FetchPagedKVCacheCollection + ] + all_logits: bool = False + + def __call__( + self, + embeds: TensorValue, + kv_cache_inputs: tuple[ + TensorValue, TensorValue, TensorValue, TensorValue + ], + **kwargs, + ) -> tuple[TensorValue, ...]: + """Transformer model consisting of TransformerBlock layers. + + Args: + embeds: embeddings of the sequence of text tokens and possibly images. + shape = [batch_size, n_patches, hidden_dim] + kv_cache_inputs: A tuple of 4 tensor values. In the case of paged attention, + (blocks, cache_lengths, lookup_table, is_cache_empty). In the case of + continuous attention, (blocks, cache_lengths, lookup_table, max_lengths). + """ + h = embeds + + # Construct a kv cache for use downstream. + kv_collection = self.kv_collection_constructor(*kv_cache_inputs) + + for _, layer in enumerate(self.layers): + h = layer(h, kv_collection, **kwargs) + + if self.all_logits: + # When echo is enabled, the logits of the input tokens are + # returned. + logits = ops.cast(self.output(self.norm(h)), DType.float32) + if "input_row_offsets" in kwargs: + # For ragged tensors gather the last tokens from packed dim 0. + input_row_offsets: TensorValueLike = kwargs["input_row_offsets"] + last_token_indices = input_row_offsets[1:] - 1 # type: ignore + last_token_logits = ops.gather( + logits, last_token_indices, axis=0 + ) + else: + # For padded tensors, use `gather_nd`. + # Unsqueeze since `gather_nd` expects a static last dim. + valid_lengths: TensorValueLike = kwargs["valid_lengths"] + last_token_logits = ops.gather_nd( + logits, + indices=ops.unsqueeze(valid_lengths - 1, -1), # type: ignore + batch_dims=1, + ) + return (last_token_logits, logits) + else: + # Otherwise, only return the logits for the last non-pad token + # (right-padded). + if "input_row_offsets" in kwargs: + # For ragged tensors gather the last tokens from packed dim 0. + input_row_offsets = kwargs["input_row_offsets"] + last_token_indices = input_row_offsets[1:] - 1 # type: ignore + # Should be: last_token = h[last_token_indices] + last_token = ops.gather(h, last_token_indices, axis=0) + else: + # For padded tensors, use `gather_nd`. + # Unsqueeze since `gather_nd` expects a static last dim. + valid_lengths = kwargs["valid_lengths"] + last_token = ops.gather_nd( + h, + indices=ops.unsqueeze(valid_lengths - 1, -1), # type: ignore + batch_dims=1, + ) + + # Always return float32 logits, no matter the activation type + return ( + ops.cast(self.output(self.norm(last_token)), DType.float32), + ) diff --git a/src/max/pipelines/architectures/pixtral/llava/llava_projector.py b/src/max/pipelines/architectures/pixtral/llava/llava_projector.py new file mode 100644 index 0000000000..c75c0adabd --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/llava/llava_projector.py @@ -0,0 +1,34 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +from dataclasses import dataclass + +from max.graph import TensorValue, ops +from max.pipelines.nn.layer import Layer +from max.pipelines.nn.linear import Linear + + +@dataclass +class LlavaMultiModalConnector(Layer): + """ + Simple multi-layer cross-modal connector to connect image features into the + text token embedding space. + Uses Gelu activation function. + """ + + linear_1: Linear + linear_2: Linear + + def __call__(self, x: TensorValue) -> TensorValue: + return self.linear_2(ops.gelu(self.linear_1(x))) diff --git a/src/max/pipelines/architectures/pixtral/model/graph.py b/src/max/pipelines/architectures/pixtral/model/graph.py new file mode 100644 index 0000000000..cebc6bab2a --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/model/graph.py @@ -0,0 +1,311 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.dtype import DType +from max.graph import Graph, TensorType +from max.graph.weights import SafetensorWeights +from max.pipelines import PipelineConfig +from max.pipelines.kv_cache import KVCacheManager, KVCacheParams +from max.pipelines.nn import Linear + +from ..llava.llava import ( + LlavaConditionalGeneration, + LlavaConditionalGenerationTextOnly, + LlavaVisionEncoder, +) +from ..llava.llava_projector import LlavaMultiModalConnector +from ..vision_encoder.graph import _vision_encoder +from .mistral_graph import _transformer + + +def _linear( + dtype: DType, + in_features: int, + out_features: int, + weights: SafetensorWeights, +) -> Linear: + """Unlike the vision encoder's version, this linear layer has a bias. + This linear layer is used by the LlavaMultiModalConnector + """ + return Linear( + weights.weight.allocate(dtype, [in_features, out_features], None), + bias=weights.bias.allocate(dtype, [in_features], None), + ) + + +def _multi_modal_projector( + dtype: DType, + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> LlavaMultiModalConnector: + """Connects the vision encoder to the text decoder. + This MLP projects the patch embeddings to the text-encoder's embeddings space. + Input shape: + Output shape: + """ + return LlavaMultiModalConnector( + _linear( + dtype, + pipeline_config.huggingface_config.text_config.hidden_size, + pipeline_config.huggingface_config.vision_config.hidden_size, + weights.linear_1, + ), + _linear( + dtype, + pipeline_config.huggingface_config.text_config.hidden_size, + pipeline_config.huggingface_config.text_config.hidden_size, + weights.linear_2, + ), + ) + + +def _llava_vision_encoder_and_projector( + graph: Graph, + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> LlavaVisionEncoder: + # TODO(AIPIPE-273): Once we have mo.if, use this version of Llava rather than creating 2 graphs + vision_encoder = _vision_encoder(graph, pipeline_config, weights) + multi_modal_projector = _multi_modal_projector( + pipeline_config.dtype, pipeline_config, weights.multi_modal_projector + ) + return LlavaVisionEncoder( + vision_encoder=vision_encoder, + multi_modal_projector=multi_modal_projector, + ) + + +def _llava_decoder( + graph: Graph, + pipeline_config: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, +) -> LlavaConditionalGenerationTextOnly: + # Weights of pixtral decoder have the same names and shapes as weights of mistral. + language_model = _transformer( + graph=graph, + params=pipeline_config, + weights=weights, + max_seq_len=max_seq_len, + kv_params=kv_params, + ) + + return LlavaConditionalGenerationTextOnly( + language_model=language_model, + vocab_size=pipeline_config.huggingface_config.text_config.vocab_size, + image_token_index=pipeline_config.huggingface_config.image_token_index, + ) + + +def _llava( + graph: Graph, + pipeline_config: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, +) -> LlavaConditionalGeneration: + # TODO: Once we have mo.if, use this version of Llava rather than creating 2 graphs + vision_encoder = _vision_encoder(graph, pipeline_config, weights) + multi_modal_projector = _multi_modal_projector( + dtype=pipeline_config.dtype, + pipeline_config=pipeline_config, + weights=weights.multi_modal_projector, + ) + # Weights of pixtral have the same names and shapes as weights of mistral. + language_model = _transformer( + graph=graph, + params=pipeline_config, + weights=weights, + max_seq_len=max_seq_len, + kv_params=kv_params, + ) + + return LlavaConditionalGeneration( + vision_encoder=vision_encoder, + multi_modal_projector=multi_modal_projector, + language_model=language_model, + vocab_size=pipeline_config.huggingface_config.text_config.vocab_size, + image_token_index=pipeline_config.huggingface_config.image_token_index, + vision_feature_layer=pipeline_config.huggingface_config.vision_feature_layer, + vision_feature_select_strategy=pipeline_config.huggingface_config.vision_feature_select_strategy, + image_seq_length=pipeline_config.huggingface_config.image_seq_length, + ) + + +def _build_graph( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, + kv_manager: KVCacheManager, +) -> Graph: + # TODO: Make this work for multiple devices. Now getting the types for device [0] + kv_cache_types = kv_manager.input_symbols()[0] + + input_ids_type = TensorType( + DType.int64, + shape=["total_seq_len"], + ) + # TODO: should be changed to add "batch_size", "n_images" dims when working with multiple images + pixel_values_type = TensorType( + DType.float32, + shape=["image_height", "image_width", "num_channels"], + ) + + attention_mask_type = TensorType( + DType.float32, + shape=["batch_size", 1, "num_patches", "num_patches"], + ) + + # Type of start and end position of each batch in the combined total_seq_len dimension. + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"] + ) + + # Initialize Graph. + with Graph( + "pixtral", + input_types=[ + input_ids_type, + pixel_values_type, + attention_mask_type, + input_row_offsets_type, + *kv_cache_types, + ], + ) as graph: + model = _llava( + graph=graph, + pipeline_config=pipeline_config, + weights=weights, + max_seq_len=max_seq_len, + kv_params=kv_params, + ) + ( + input_ids, + pixel_values, + attention_mask, + input_row_offsets, + *kv_cache_inputs, + ) = graph.inputs + outputs = model( + input_ids=input_ids.tensor, + pixel_values=pixel_values.tensor, + attention_mask=attention_mask.tensor, + kv_cache_inputs=kv_cache_inputs, # type: ignore + input_row_offsets=input_row_offsets, + ) + graph.output(*outputs) + return graph + + +def _build_vision_graph( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> Graph: + # Graph input types. + pixel_values_type = TensorType( + DType.float32, + shape=["image_height", "image_width", "num_channels"], + ) + + attention_mask_type = TensorType( + DType.float32, + shape=["batch_size", 1, "num_patches", "num_patches"], + ) + + # Initialize Graph. + with Graph( + "pixtral_vision_encoder", + input_types=[ + pixel_values_type, + attention_mask_type, + ], + ) as graph: + model = _llava_vision_encoder_and_projector( + graph, pipeline_config, weights + ) + ( + pixel_values, + attention_mask, + ) = graph.inputs + outputs = model( + pixel_values=pixel_values.tensor, + attention_mask=attention_mask.tensor, + ) + graph.output(outputs) + return graph + + +def _build_text_graph( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, + kv_manager: KVCacheManager, +) -> Graph: + # TODO: Make this work for multiple devices. Now getting the types for device [0] + kv_cache_types = kv_manager.input_symbols()[0] + + input_ids_type = TensorType( + DType.int64, + shape=["total_seq_len"], + ) + + # Type of start and end position of each batch in the combined total_seq_len dimension. + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"] + ) + + # num_images, num_patches_in_image, language_model_hidden_dim + image_embeddings_type = TensorType( + pipeline_config.dtype, + shape=[ + # TODO(bduke): fix algebraic dim creation outside of graph contexts. + "num_images", + "num_patches_in_image", + pipeline_config.huggingface_config.text_config.hidden_size, + ], + ) + + # Initialize Graph. + with Graph( + "pixtral", + input_types=[ + input_ids_type, + image_embeddings_type, + input_row_offsets_type, + *kv_cache_types, + ], + ) as graph: + model = _llava_decoder( + graph=graph, + pipeline_config=pipeline_config, + weights=weights, + max_seq_len=max_seq_len, + kv_params=kv_params, + ) + ( + input_ids, + image_embeds, + input_row_offsets, + *kv_cache_inputs, + ) = graph.inputs + outputs = model( + input_ids=input_ids.tensor, + image_embeds=image_embeds.tensor, + kv_cache_inputs=kv_cache_inputs, # type: ignore + input_row_offsets=input_row_offsets, + ) + graph.output(*outputs) + return graph diff --git a/src/max/pipelines/architectures/pixtral/model/mistral_graph.py b/src/max/pipelines/architectures/pixtral/model/mistral_graph.py new file mode 100644 index 0000000000..855e94614e --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/model/mistral_graph.py @@ -0,0 +1,236 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Build a Mistral model via Graph API from Safetensor weights.""" + +import math +from typing import Union + +from max.dtype import DType +from max.graph import Graph, ops +from max.graph.weights import SafetensorWeights +from max.pipelines import PipelineConfig +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, + KVCacheStrategy, +) +from max.pipelines.nn import ( + MLP, + AttentionWithRope, + Embedding, + Linear, + OptimizedRotaryEmbedding, + RMSNorm, + TransformerBlock, +) + +from ..llava.llava_decoder import Transformer + + +def feed_forward( + dtype: DType, + hidden_dim: int, + feed_forward_length: int, + weights: SafetensorWeights, +): + return MLP( + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.mlp.gate_proj, + ), + linear( + dtype, + hidden_dim, + feed_forward_length, + weights.mlp.down_proj, + ), + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.mlp.up_proj, + ), + ) + + +def linear( + dtype: DType, + in_features: int, + out_features: int, + weights: SafetensorWeights, +) -> Linear: + return Linear( + weights.weight.allocate(dtype, [in_features, out_features], None) + ) + + +def rms_norm(dims: int, eps: float, weights: SafetensorWeights) -> RMSNorm: + return RMSNorm(weights.weight.allocate(DType.bfloat16, [dims]), eps) + + +def embedding( + params: PipelineConfig, + vocab_size: int, + hidden_dim: int, + weights: SafetensorWeights, +): + return Embedding( + weights.weight.allocate( + params.dtype, + [vocab_size, hidden_dim], + ) + ) + + +def _attention_opaque( + kv_params: KVCacheParams, + params: PipelineConfig, + rope: OptimizedRotaryEmbedding, + weights: SafetensorWeights, + layer_idx: int, +): + kv_weight_dim = ( + params.huggingface_config.text_config.head_dim + * params.huggingface_config.text_config.num_key_value_heads + ) + + wq = weights.self_attn.q_proj.weight.allocate( + params.dtype, + [ + params.huggingface_config.text_config.num_attention_heads + * params.huggingface_config.text_config.head_dim, + params.huggingface_config.text_config.hidden_size, + ], + ) + wk = weights.self_attn.k_proj.weight.allocate( + params.dtype, + [kv_weight_dim, params.huggingface_config.text_config.hidden_size], + ) + wv = weights.self_attn.v_proj.weight.allocate( + params.dtype, + [kv_weight_dim, params.huggingface_config.text_config.hidden_size], + ) + wqkv = ops.concat((wq, wk, wv)) + + return AttentionWithRope( + n_heads=params.huggingface_config.text_config.num_attention_heads, + kv_params=kv_params, + wqkv=wqkv, + wo=linear( + params.dtype, + params.huggingface_config.text_config.hidden_size, + params.huggingface_config.text_config.num_attention_heads + * params.huggingface_config.text_config.head_dim, + weights.self_attn.o_proj, + ), + rope=rope, + layer_idx=ops.constant(layer_idx, DType.uint32), + scale=math.sqrt(1 / kv_params.head_dim), + ) + + +def _transformer( + graph: Graph, + params: PipelineConfig, + weights: SafetensorWeights, + max_seq_len: int, + kv_params: KVCacheParams, +): + with graph: + rope = OptimizedRotaryEmbedding( + dim=params.huggingface_config.text_config.num_attention_heads + * params.huggingface_config.text_config.head_dim, + n_heads=params.huggingface_config.text_config.num_attention_heads, + theta=params.huggingface_config.text_config.rope_theta, + max_seq_len=max_seq_len, + rope_scaling=None, + interleaved=False, + ) + + layers = [ + TransformerBlock( + attention=_attention_opaque( + kv_params, + params, + rope, + weights.language_model.model.layers[i], + layer_idx=i, + ), + mlp=feed_forward( + params.dtype, + params.huggingface_config.text_config.hidden_size, + params.huggingface_config.text_config.intermediate_size, + weights.language_model.model.layers[i], + ), + attention_norm=rms_norm( + params.huggingface_config.text_config.hidden_size, + params.huggingface_config.text_config.rms_norm_eps, + weights.language_model.model.layers[i].input_layernorm, + ), + mlp_norm=rms_norm( + params.huggingface_config.text_config.hidden_size, + params.huggingface_config.text_config.rms_norm_eps, + weights.language_model.model.layers[ + i + ].post_attention_layernorm, + ), + ) + for i in range( + params.huggingface_config.text_config.num_hidden_layers + ) + ] + + embedding_layer = embedding( + params, + params.huggingface_config.text_config.vocab_size, + params.huggingface_config.text_config.hidden_size, + weights.language_model.model.embed_tokens, + ) + + output = linear( + params.dtype, + params.huggingface_config.text_config.vocab_size, + params.huggingface_config.text_config.hidden_size, + weights.language_model.lm_head, + ) + + kv_collection_cls: Union[ + type[FetchContinuousBatchingKVCacheCollection], + type[FetchPagedKVCacheCollection], + ] + if kv_params.cache_strategy == KVCacheStrategy.CONTINUOUS: + kv_collection_cls = FetchContinuousBatchingKVCacheCollection + elif kv_params.cache_strategy == KVCacheStrategy.PAGED: + kv_collection_cls = FetchPagedKVCacheCollection + else: + raise ValueError( + f"Unsupported caching strategy {kv_params.cache_strategy}" + ) + + return Transformer( + dim=params.huggingface_config.text_config.hidden_size, + n_heads=params.huggingface_config.text_config.num_attention_heads, + layers=layers, + norm=rms_norm( + params.huggingface_config.text_config.hidden_size, + params.huggingface_config.text_config.rms_norm_eps, + weights.language_model.model.norm, + ), + output=output, + embedding=embedding_layer, + kv_params=kv_params, + kv_collection_constructor=kv_collection_cls(kv_params), + ) diff --git a/src/max/pipelines/architectures/pixtral/pixtral.py b/src/max/pipelines/architectures/pixtral/pixtral.py new file mode 100644 index 0000000000..31f4e13682 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/pixtral.py @@ -0,0 +1,362 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import time +from collections.abc import Sequence +from concurrent.futures import ThreadPoolExecutor +from typing import cast + +import numpy as np +from max.driver import Device, Tensor +from max.engine import InferenceSession, Model +from max.graph.weights import SafetensorWeights +from max.pipelines import ( + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + TextAndVisionContext, + upper_bounded_default, +) +from max.pipelines.kv_cache import ( + KVCacheInputs, + KVCacheManager, + KVCacheParams, + estimate_kv_cache_size, + load_kv_manager, +) + +from .model.graph import _build_text_graph, _build_vision_graph +from .vision_encoder.attention_utils import causal_attention_mask_2d_from_imgs + +logger = logging.getLogger("max.pipelines") + + +class PixtralInputs(ModelInputs): + """Holds inputs for the Pixtral model.""" + + input_ids: Tensor + input_row_offsets: Tensor + + # Image inputs + _pixel_values: Tensor | None = None + _attention_mask: Tensor | None = None + + def __init__( + self, + input_ids: Tensor, + input_row_offsets: Tensor, + pixel_values: Tensor | None = None, + attention_mask: Tensor | None = None, + ): + self.input_ids = input_ids + self.input_row_offsets = input_row_offsets + self._pixel_values = pixel_values + self._attention_mask = attention_mask + + @property + def has_vision_inputs(self) -> bool: + """Returns true iff this includes vision model inputs.""" + return self._pixel_values is not None + + @property + def pixel_values(self) -> Tensor: + assert self._pixel_values is not None + return self._pixel_values + + @property + def attention_mask(self) -> Tensor: + assert self._attention_mask is not None + return self._attention_mask + + +class PixtralModel(PipelineModel[TextAndVisionContext]): + """The overall interface to the Pixtral model.""" + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) + self.vision_model, self.language_model = self.load_model(session) + # Note that in a multimodal model, the language model is the last model in the + # pipeline. Unfortunately, self.model is still being used (and exposed) + # in the token generation code, so we still need to set it here. + self.model = self.language_model + + def execute( + self, + model_inputs: ModelInputs, + # TODO(zheng): This should be folded as KVCacheInputs into ModelInputs. + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + model_inputs = cast(PixtralInputs, model_inputs) + if model_inputs.has_vision_inputs: + image_embeds = self.vision_model.execute( + model_inputs.pixel_values, + model_inputs.attention_mask, + copy_inputs_to_device=False, + )[0] + else: + # batch_size * num_concurrent_media * num_patches are set to 0 here to imitate a dummy tensor (used in text-only mode). + image_embeds = Tensor.zeros( + shape=[ + 0, + 0, + self.pipeline_config.huggingface_config.text_config.hidden_size, + ], + dtype=self.pipeline_config.dtype, + ).to(self.pipeline_config.devices[0]) + assert kv_cache_inputs is not None, ( + "Pixtral has KV cache inputs, but none were provided" + ) + model_outputs = self.language_model.execute( + model_inputs.input_ids, + image_embeds, + model_inputs.input_row_offsets, + *kv_cache_inputs, + copy_inputs_to_device=False, + ) + assert not self.pipeline_config.enable_echo + assert isinstance(model_outputs[0], Tensor) + return ModelOutputs(next_token_logits=model_outputs[0]) + + def prepare_initial_token_inputs( + self, + context_batch: Sequence[TextAndVisionContext], + ) -> PixtralInputs: + # Input row offset type: ["input_row_offsets_len"], UInt32 + input_row_offsets = Tensor.from_numpy( + np.cumsum( + [0] + [ctx.active_length for ctx in context_batch], + dtype=np.uint32, + ) + ).to(self.pipeline_config.devices[0]) + + # Input Ids: ["total_seq_len"], Int64 + # Create a ragged token vector of length: sum(len(t) for t in tokens). + tokens = np.ascontiguousarray( + np.concatenate([ctx.next_tokens for ctx in context_batch]) + ) + input_ids = Tensor.from_numpy(tokens).to( + self.pipeline_config.devices[0] + ) + + # TODO: change this to work with all contexts in the batch. + if context_batch[ + 0 + ].pixel_values: # check if the request has pixel_values + # Get first image in first batch and permute the order to (HWC). + # Pixtral processor returns CHW images. + image = np.ascontiguousarray( + np.transpose(context_batch[0].pixel_values[0], (1, 2, 0)) + ) + pixel_values = Tensor.from_numpy(image).to( + self.pipeline_config.devices[0] + ) + # TODO(KERN-782): This should be -inf but softmax saturates with NaNs. + fill_val = -10000.0 + attention_mask = causal_attention_mask_2d_from_imgs( + [image], + self.pipeline_config.huggingface_config.vision_config.patch_size, + 1, + fill_val, + ) + attention_mask = Tensor.from_numpy(attention_mask).to( + self.pipeline_config.devices[0] + ) + return PixtralInputs( + input_ids=input_ids, + input_row_offsets=input_row_offsets, + pixel_values=pixel_values, + attention_mask=attention_mask, + ) + + return PixtralInputs( + input_ids=input_ids, + input_row_offsets=input_row_offsets, + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> PixtralInputs: + prev_model_inputs = cast(PixtralInputs, prev_model_inputs) + # input_ids, old_row_offsets, Optional: [pixel_values, attention_mask] + old_row_offsets = prev_model_inputs.input_row_offsets + + row_offsets_size = old_row_offsets.shape[0] + next_row_offsets = self._input_row_offsets_prealloc[:row_offsets_size] + # In multi-step execution, don't re-pass the pixel_values and attention_mask. + return PixtralInputs( + input_ids=next_tokens, + input_row_offsets=next_row_offsets, + ) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return pipeline_config.huggingface_config.text_config.num_hidden_layers + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + page_size=pipeline_config.kv_cache_page_size, + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.text_config.num_key_value_heads, + head_dim=pipeline_config.huggingface_config.text_config.head_dim, + cache_strategy=pipeline_config.cache_strategy, + enable_prefix_caching=pipeline_config.enable_prefix_caching, + ) + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.text_config.max_position_embeddings, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for Pixtral, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_position_embeddings " + f"({pipeline_config.huggingface_config.text_config.max_position_embeddings})." + ) + raise ValueError(msg) from e + + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: int, + ) -> KVCacheManager: + return load_kv_manager( + params=self.get_kv_params(self.pipeline_config), + max_batch_size=self.pipeline_config.max_batch_size, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + num_layers=self.get_num_layers(self.pipeline_config), + devices=self.pipeline_config.devices, + available_cache_memory=available_cache_memory, + page_size=self.pipeline_config.kv_cache_page_size, + session=session, + ) + + @classmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: list[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + return estimate_kv_cache_size( + params=cls.get_kv_params(pipeline_config), + max_batch_size=pipeline_config.max_batch_size, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=cls.get_num_layers(pipeline_config), + available_cache_memory=available_cache_memory, + devices=devices, + ) + + def load_model(self, session: InferenceSession) -> tuple[Model, Model]: + if self.pipeline_config.enable_echo: + msg = "Pixtral model does not currently implement enable echo." + raise ValueError(msg) + + # Pre-allocate a buffer for input_row_offsets in multistep execution. + # We do this to avoid materializing and copying a buffer with each multistep step + assert self.pipeline_config.max_batch_size, ( + "Expected max_batch_size to be set" + ) + self._input_row_offsets_prealloc = Tensor.from_numpy( + np.arange(self.pipeline_config.max_batch_size + 1, dtype=np.uint32) + ).to(self.pipeline_config.devices[0]) + + weights = self.pipeline_config.load_weights() + + if not isinstance(weights, SafetensorWeights): + msg = ( + "only safetensors weights are currently supported in Pixtral" + " models." + ) + raise ValueError(msg) + + self._weights = weights + + if serialized_path := self.pipeline_config.serialized_model_path: + # Hydrate all weights to be referenced by the serialized path. + weights_registry = {} + for name, weight in self._weights.items(): + weights_registry[name] = weight.raw_tensor() + + def serialized_load(serialized_path): + logger.info("Loading serialized model from %s", serialized_path) + model = session.load( + f"{serialized_path}", weights_registry=weights_registry + ) + return model + + vision_model = serialized_load(f"{serialized_path}.vision") + text_model = serialized_load(f"{serialized_path}.text") + + else: + + def build_and_compile_model(build, label, export_path=None): + logger.info(f"Building and compiling {label} model...") + graph = build() + before = time.perf_counter() + model = session.load( + graph, + weights_registry=self._weights.allocated_weights, + ) + after = time.perf_counter() + logger.info( + f"Building and compiling {label} model took {after - before:.6f} seconds" + ) + if export_path: + mef_path = f"{export_path}.{label}" + logger.info( + f"Exporting serialized {label} model to {mef_path}" + ) + model._export_mef(mef_path) + return model + + export_path = self.pipeline_config.save_to_serialized_model_path + with ThreadPoolExecutor(max_workers=2) as executor: + build = lambda: _build_vision_graph( + pipeline_config=self.pipeline_config, + weights=self._weights, + ) + vision_model_future = executor.submit( + build_and_compile_model, build, "vision", export_path + ) + + build = lambda: _build_text_graph( + pipeline_config=self.pipeline_config, + weights=self._weights, + max_seq_len=self.calculate_max_seq_len( + self.pipeline_config + ), + kv_params=self.get_kv_params(self.pipeline_config), + kv_manager=self.kv_manager, + ) + text_model_future = executor.submit( + build_and_compile_model, build, "text", export_path + ) + + vision_model = vision_model_future.result() + text_model = text_model_future.result() + + return vision_model, text_model diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/__init__.py b/src/max/pipelines/architectures/pixtral/vision_encoder/__init__.py new file mode 100644 index 0000000000..1ce61c35f1 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/__init__.py @@ -0,0 +1,14 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Pixtral Code vision encoder layer modules.""" diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/attention.py b/src/max/pipelines/architectures/pixtral/vision_encoder/attention.py new file mode 100644 index 0000000000..530f58e26a --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/attention.py @@ -0,0 +1,139 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +import math +from dataclasses import dataclass + +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.nn.layer import Layer +from max.pipelines.nn.linear import Linear + +from .attention_utils import rotate_half + + +@dataclass +class Attention(Layer): + n_heads: int + dim: int + head_dim: int # hidden_size // self.n_heads + + dropout: float + + wq: Linear + wk: Linear + wv: Linear + wo: Linear + + def apply_rotary_embedding( + self, + xq: TensorValue, + xk: TensorValue, + cos: TensorValue, + sin: TensorValue, + unsqueeze_dim=0, + ) -> tuple[TensorValue, TensorValue]: + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + xq (`TensorValueLike`): The query tensor. + xk (`TensorValueLike`): The key tensor. + cos (`TensorValueLike`): The cosine part of the rotary embedding. + sin (`TensorValueLike`): The sine part of the rotary embedding. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos and + sin so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos and sin have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos and sin broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + Returns: + `tuple(TensorValueLike)` comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + cos = ops.unsqueeze(cos, unsqueeze_dim) + sin = ops.unsqueeze(sin, unsqueeze_dim) + xq = xq.transpose(1, 2) + xk = xk.transpose(1, 2) + + q_embed = (xq * cos) + (rotate_half(xq) * sin) + k_embed = (xk * cos) + (rotate_half(xk) * sin) + return q_embed, k_embed + + def attention( + self, + xq: TensorValue, + xk: TensorValue, + xv: TensorValue, + attn_mask: TensorValueLike, + ) -> TensorValue: + xv = xv.transpose(1, 2) + + scale = math.sqrt(1.0 / self.head_dim) + # xk shape = batch_size=1, n_heads=16, head_dim=64, image_seq_len=160 + scores = xq @ ops.transpose(xk, 2, 3) + # Note, the graph compiler currently requires the order of operands + # to be `scores * scale` in order to pattern match the fused attention + # operator. + # attn_mask and pixel_values are model inputs. scores is self-attention + # scores between all patches in pixel_values. + # attn_mask shape = ("n_images", 1, "num_patches_in_image", "num_patches_in_image") + # scores shape = ("n_images", "n_heads", "num_patches_in_image", "num_patches_in_image") + attn_mask = ops.rebind( + attn_mask, (scores.shape[0], 1, scores.shape[2], scores.shape[3]) + ) + scores = ops.softmax(scores * scale + attn_mask) + + return scores @ xv + + def __call__( + self, + x: TensorValue, + attention_mask: TensorValueLike, + position_embeddings: tuple[TensorValue, TensorValue], + ) -> TensorValue: + """Computes attention on x. + + Args: + x: Activations with shape (batch, seq_len, dim). + attention_mask: a mask to ensure different blocks of patches (images) + can only attend to patches within their respective block (image). + position_embeddings: + + Returns the result of multi-headed self attention on the input. + """ + + batch_size, n_patches = x.shape[0], x.shape[1] + # matmul weights + xq = self.wq(x) + xk = self.wk(x) + xv = self.wv(x) + + xq = ops.reshape( + xq, [batch_size, n_patches, self.n_heads, self.head_dim] + ) + xk = ops.reshape( + xk, [batch_size, n_patches, self.n_heads, self.head_dim] + ) + xv = ops.reshape( + xv, [batch_size, n_patches, self.n_heads, self.head_dim] + ) + + cos, sin = position_embeddings + xq, xk = self.apply_rotary_embedding(xq, xk, cos, sin, unsqueeze_dim=0) + + output = ( + self.attention(xq, xk, xv, attention_mask) + .transpose(1, 2) + .reshape([batch_size, n_patches, -1]) + ) + return self.wo(output) diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/attention_utils.py b/src/max/pipelines/architectures/pixtral/vision_encoder/attention_utils.py new file mode 100644 index 0000000000..735e37041b --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/attention_utils.py @@ -0,0 +1,125 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from typing import List + +import numpy as np +from max.graph import TensorValue, ops + + +def causal_attention_mask_2d_from_imgs( + imgs: List[np.ndarray], + patch_size: int, + batch_size: int, + fill_val: float = -10000.0, +): + """Generates a 2D mask to ensure different blocks of patches (images) can only attend + to patches within their respective block (image). + + Args: + + num_patches_list: A list of images (blocks). Each image is of shape + (height, width, num_channels). + + patch_size: size of one dim of each patch in the image. + + batch_size: num of images. + + + Returns an ndarray of shape (batch_size, 1, seq_len, seq_len) representing the + attention mask for the blocks of patches attended to by the transformer. + """ + # generate list of (num_patches_in_height * num_patches_in_width) for each image + num_patches_list = [ + img.shape[0] // patch_size * img.shape[1] // patch_size for img in imgs + ] + + # seq_length is number of patches in all images + seq_len = sum(num_patches_list) + mask_shape = (seq_len, seq_len) + + # TODO(KERN-782): This fill_val should be -inf but softmax saturates with NaNs. + fill_matrix = np.full(mask_shape, fill_val, dtype=np.float32) + + # block_end_idx and block_start_idx are calculated using cumulative sums of + # patch_embeds_list. These indicate the starting and ending indices of each + # block of embeddings. + block_end_idx = np.cumsum(num_patches_list) + block_start_idx = np.cumsum(np.concatenate(([0], num_patches_list[:-1]))) + + # TODO(KERN-782): This should be -inf but softmax saturates with NaNs. + for start, end in zip(block_start_idx, block_end_idx): + fill_matrix[int(start) : int(end), int(start) : int(end)] = 0 + + # Expand the mask dimensions to match the expected input shape + fill_matrix = np.expand_dims(fill_matrix, axis=(0, 1)) # Add two new axes + fill_matrix = np.broadcast_to( + fill_matrix, (batch_size, 1, seq_len, seq_len) + ) + return fill_matrix + + +def causal_attention_mask_2d( + num_patches_list: list[int], patch_embeds: TensorValue +): + """Generates a 2D mask to ensure different blocks of patches (images) can only attend + to patches within their respective block (image). + + Args: + + num_patches_list: A list of integers, where each entry represents the number of patches + in a block (e.g., (num_patches_in_height × num_patches_in_width) patches per image block). + It is list representing the sizes of different blocks in terms of patches. + + patch_embeds:A tensor of shape [batch_size, num_patches, hidden_size] representing the + embeddings of patches in a batch of images. + + Returns an ndarray of shape (batch_size, 1, seq_len, seq_len) representing the + attention mask for the blocks of patches attended to by the transformer. + """ + # The total number of patches for all image in the batch. + # TODO: change this to take a dim not an int. + seq_len = int(patch_embeds.shape[1]) + mask_shape = (seq_len, seq_len) + + # TODO(KERN-782): This should be -inf but softmax saturates with NaNs. + fill_val = -10000.0 + fill_matrix = np.full(mask_shape, fill_val, dtype=np.float32) + + # block_end_idx and block_start_idx are calculated using cumulative sums of + # patch_embeds_list. These indicate the starting and ending indices of each + # image (block of embeddings). + block_end_idx = np.cumsum(num_patches_list) + block_start_idx = np.cumsum(np.concatenate(([0], num_patches_list[:-1]))) + + # For each block, set the diagonal region corresponding to that block to 0. + # This allows patches within the same block to attend to each other. + for start, end in zip(block_start_idx, block_end_idx): + fill_matrix[int(start) : int(end), int(start) : int(end)] = 0 + + # Expand the mask dimensions to match the expected transformer input shape. + fill_matrix = np.expand_dims(fill_matrix, axis=(0, 1)) # Add two new axes + fill_matrix = np.broadcast_to( + fill_matrix, + (int(patch_embeds.shape[0]), 1, seq_len, seq_len), + ) + return fill_matrix + + +def rotate_half(x: TensorValue): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return ops.concat((-x2, x1), axis=-1) diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/graph.py b/src/max/pipelines/architectures/pixtral/vision_encoder/graph.py new file mode 100644 index 0000000000..b6ee70ec28 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/graph.py @@ -0,0 +1,218 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +from max.dtype import DType +from max.graph import Graph, ops +from max.graph.weights import SafetensorWeights +from max.pipelines import PipelineConfig +from max.pipelines.nn import Conv2D, Linear, RMSNorm + +from .attention import Attention +from .rotary_embedding_2d import RotaryEmbedding2D +from .transformer import MLP, Transformer, TransformerBlock +from .vision_encoder import VisionEncoder + + +def _patch_conv2d( + dtype: DType, + in_channels: int, + patch_size: int, + out_channels: int, + weights: SafetensorWeights, +) -> Conv2D: + """Creates a 2D convolution layer with the following assumptions: + - kernel size = (patch_size, patch_size) + - stride = (patch_size, patch_size) + - padding = (0, 0, 0, 0) + + This convolution splits the image into patches and then learns an embedding + of each patch. The embedding dim is out_channels. + """ + # Loaded torch weights shape = torch.Size([1024, 3, 16, 16]). + # Conv2D expects (height, width, in_channels, out_channels) = [16, 16, 3, 1024]. + weights = ops.permute( # type: ignore + weights.weight.allocate( + dtype, [out_channels, in_channels, patch_size, patch_size], None + ), + [2, 3, 1, 0], + ) + return Conv2D( + weights, # type: ignore + stride=(patch_size, patch_size), + ) + + +def _linear( + dtype: DType, + in_features: int, + out_features: int, + weights: SafetensorWeights, +) -> Linear: + return Linear( + weights.weight.allocate(dtype, [in_features, out_features], None) + ) + + +def _feed_forward( + dtype: DType, + hidden_dim: int, + feed_forward_length: int, + weights: SafetensorWeights, +): + return MLP( + _linear( # gate_proj + dtype, + feed_forward_length, + hidden_dim, + weights.feed_forward.gate_proj, + ), + _linear( # down_proj + dtype, + hidden_dim, + feed_forward_length, + weights.feed_forward.down_proj, + ), + _linear( # up_proj + dtype, + feed_forward_length, + hidden_dim, + weights.feed_forward.up_proj, + ), + ) + + +def _rms_norm(dims: int, eps: float, weights: SafetensorWeights) -> RMSNorm: + return RMSNorm(weights.weight.allocate(DType.bfloat16, [dims]), eps) + + +def _encoder_attention( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> Attention: + # TODO: Do we need to transpose weights? Not obvious from shapes. Both dims are the same. + hidden_dim = pipeline_config.huggingface_config.vision_config.hidden_size + wq = _linear( + pipeline_config.dtype, + hidden_dim, + hidden_dim, + weights.attention.q_proj, + ) + wk = _linear( + pipeline_config.dtype, + hidden_dim, + hidden_dim, + weights.attention.k_proj, + ) + wv = _linear( + pipeline_config.dtype, + hidden_dim, + hidden_dim, + weights.attention.v_proj, + ) + wo = _linear( + pipeline_config.dtype, + hidden_dim, + hidden_dim, + weights.attention.o_proj, + ) + + return Attention( + n_heads=pipeline_config.huggingface_config.vision_config.num_attention_heads, + dim=hidden_dim, + head_dim=pipeline_config.huggingface_config.vision_config.head_dim, + dropout=pipeline_config.huggingface_config.vision_config.attention_dropout, + wq=wq, + wk=wk, + wv=wv, + wo=wo, + ) + + +def _transformer( + graph: Graph, + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +): + with graph: + layers = [ + TransformerBlock( + attention=_encoder_attention( + pipeline_config, weights.layers[i] + ), + mlp=_feed_forward( + pipeline_config.dtype, + pipeline_config.huggingface_config.vision_config.hidden_size, + pipeline_config.huggingface_config.vision_config.intermediate_size, + weights.layers[i], + ), + attention_norm=_rms_norm( + pipeline_config.huggingface_config.vision_config.hidden_size, + 1e-5, + weights.layers[i].attention_norm, + ), + mlp_norm=_rms_norm( + pipeline_config.huggingface_config.vision_config.hidden_size, + 1e-5, + weights.layers[i].ffn_norm, + ), + ) + for i in range( + pipeline_config.huggingface_config.vision_config.num_hidden_layers + ) + ] + + return Transformer( + n_heads=pipeline_config.huggingface_config.vision_config.num_attention_heads, + layers=layers, + dtype=pipeline_config.dtype, + ) + + +def _vision_encoder( + graph: Graph, + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> VisionEncoder: + patch_conv = _patch_conv2d( + pipeline_config.dtype, + pipeline_config.huggingface_config.vision_config.num_channels, + pipeline_config.huggingface_config.vision_config.patch_size, + pipeline_config.huggingface_config.vision_config.hidden_size, + weights.vision_tower.patch_conv, + ) + ln_pre = _rms_norm( + pipeline_config.huggingface_config.vision_config.hidden_size, + 1e-5, + weights.vision_tower.ln_pre, + ) + patch_rope = RotaryEmbedding2D( + dim=pipeline_config.huggingface_config.vision_config.hidden_size, + n_heads=pipeline_config.huggingface_config.vision_config.num_attention_heads, + theta=pipeline_config.huggingface_config.vision_config.rope_theta, + max_patches_per_side=pipeline_config.huggingface_config.vision_config.image_size + // pipeline_config.huggingface_config.vision_config.patch_size, + ) + encoder_transformer = _transformer( + graph, pipeline_config, weights.vision_tower.transformer + ) + + return VisionEncoder( + patch_conv=patch_conv, + layer_norm=ln_pre, + patch_positional_embedding=patch_rope, + transformer=encoder_transformer, + dtype=pipeline_config.dtype, + patch_size=pipeline_config.huggingface_config.vision_config.patch_size, + max_image_size=pipeline_config.huggingface_config.vision_config.image_size, + ) diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/rotary_embedding_2d.py b/src/max/pipelines/architectures/pixtral/vision_encoder/rotary_embedding_2d.py new file mode 100644 index 0000000000..65b38bfb50 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/rotary_embedding_2d.py @@ -0,0 +1,200 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +from dataclasses import dataclass +from functools import cached_property +from typing import List, Optional + +import numpy as np +from max.dtype import DType +from max.graph import Dim, DimLike, TensorValue, TensorValueLike, ops +from max.pipelines.nn.layer import Layer + + +def meshgrid(height: DimLike, width: DimLike, indexing="ij") -> TensorValue: + """Returns row indices and col indices of each point on the grid.""" + height = Dim(height) + width = Dim(width) + row_indices = ops.range( + ops.constant(0, DType.int64), + TensorValue.from_dim(height), + ops.constant(1, DType.int64), + out_dim=height, + ) + col_indices = ops.range( + ops.constant(0, DType.int64), + TensorValue.from_dim(width), + ops.constant(1, DType.int64), + out_dim=width, + ) + + # repeat row indices for each row [[0, ..., 0], ..., [width=n_cols-1, ..., width-1]] + h_grid = ops.tile( + ops.unsqueeze(row_indices, 1), [1, width] + ) # Shape: (height, width) + # repeat col indices for each col [[0, 1, ..., height-1=n_rows-1], ...] + v_grid = ops.tile( + ops.unsqueeze(col_indices, 0), [height, 1] + ) # Shape: (height, width) + return h_grid, v_grid # type: ignore + + +def patch_position_ids( + patch_embeds: List[TensorValue], max_width: int +) -> TensorValue: + """ + Takes a list of patches, calculates the positional indices for each patch by + flattening the array, and returns these indices in the positions tensor. + max_width is the maximum numbers of patches you can have in an image on one + side ie.e max_image_width_or_height // patch_size. + """ + positions = [] + for patch in patch_embeds: + height, width = patch.shape[ + 1:3 + ] # img_height/patch_size, img_width/patch_size + # TODO(MSDK-1194): replace with ops.meshgrid() + mesh = meshgrid(height, width, indexing="ij") + # TODO(MSDK-1193): replace ? by ops.chunk() or ops.split_tensor() + # Combine row and col indices into 1 tensor of paired coordinates. Shape = (height, width, 2) + # Then split into 2 tensors: 1st and 2nd coordinate of points in the mesh. + mesh_coords = ops.stack(mesh, axis=-1).reshape((-1, 2)) # type: ignore + h_grid, v_grid = mesh_coords[:, 0], mesh_coords[:, 1] + # Calculates a unique ID for each coordinate pair. + # TODO: Understand if using max_width here leads to memory inefficiency + ids = h_grid * max_width + v_grid + positions.append(ids[:]) + return ops.concat(positions) + + +@dataclass +class RotaryEmbedding2D(Layer): + """ + RotaryEmbedding layer to calculate and apply the frequency tensor for complex exponentials. + """ + + dim: DimLike + n_heads: int + theta: float + """Hyperparameter used to control the frequency scaling of the sinusoidal components of the embeddings.""" + max_patches_per_side: int + """The maximum number of patches per side for model's input (images).""" + rope_scaling: Optional[np.ndarray] = None + """Scaling factor for the positional frequencies.""" + + def freqs_cis_base(self) -> TensorValue: + """ + Computes the frequency tensor for complex exponentials (cis) + for a given seq_len = num_patches in a block (image). + Tensor is scaled with theta parameter. + Required to apply Rotary Position Embedding (RoPE) to tensor. + See 'Roformer: Enhanced Transformer with Rotary Embedding' + (arxiv.org/pdf/2104.09864). + + Returns: + The frequency tensor for complex exponentials with shape + (max_seq_len, dim//(n_heads), 2) + ??(batch_size, height * width, dim) with dim the embed dim. + """ + head_dim = ( + self.dim // self.n_heads # type: ignore + ) # hidden_size // num_attention_heads + # Note: using float64 to avoid an overflow on the exponential, then converting back to float32. + # 1D tensor of length head_dim // 2 = 32 + iota = ops.range( + ops.constant(0, DType.float64), + ops.constant(head_dim, DType.float64), # type: ignore + ops.constant(2, DType.float64), + out_dim=head_dim // 2, + ) + if self.rope_scaling is not None: + iota = iota * self.rope_scaling + # 1D tensor of length head_dim // 2 = 32 + freqs = ops.cast(1.0 / (self.theta ** (iota / head_dim)), DType.float32) + + # Indices of patches in each side (height and width) of image. + # 1D tensor of length max_patches_per_side = 64 + h = ops.range( + ops.constant(0, DType.float32), + ops.constant(self.max_patches_per_side, DType.float32), + ops.constant(1, DType.float32), + out_dim=self.max_patches_per_side, + ) + # 1D tensor of length max_patches_per_side = 64 + w = ops.range( + ops.constant(0, DType.float32), + ops.constant(self.max_patches_per_side, DType.float32), + ops.constant(1, DType.float32), + out_dim=self.max_patches_per_side, + ) + # create matrices of freqs = outer product of height and width indices with their respective frequency. + # 2D tensors mapping patch positions to rotary embeddings. shape =(max_patches_per_side = 64, head_dim//4 =16) + freqs_h = ops.outer(h, freqs[::2]) + freqs_w = ops.outer(w, freqs[1::2]) + + # Combines the frequency matrices of horizontal and vertical patch indices into a single tensor of patches + # 2D tensor of shape (max_patches_per_side*max_patches_per_side = 4096, head_dim // 2 = 32) + _inv_freq = ops.concat( + [ + ops.tile( + ops.unsqueeze(freqs_h, 1), + (1, self.max_patches_per_side, 1), + ), + ops.tile( + ops.unsqueeze(freqs_w, 0), + (self.max_patches_per_side, 1, 1), + ), + ], + axis=-1, + ).reshape((-1, head_dim // 2)) + + # In Hugging Face Code, double copies to have rotary embeddings that match head_dim + # 2D tensor of shape (max_patches_per_side*max_patches_per_side =4096, head_dim=64) + _inv_freq = ops.concat((_inv_freq, _inv_freq), axis=-1) + + # 2D tensor of shape (max_patches_per_side*max_patches_per_side =4096, head_dim*2=128) + # self._freqs_cis = ops.stack( + # [ops.cos(_inv_freq), ops.sin(_inv_freq)], axis=-1 + # ) + return TensorValue(_inv_freq) + + @cached_property + def freqs_cis(self) -> TensorValue: + self._freqs_cis = self.freqs_cis_base() + return self._freqs_cis + + def __call__( + self, x: TensorValueLike, position_ids: TensorValue + ) -> tuple[TensorValue, TensorValue]: + """Applies rotary positional embeddings (RoPE) to `x`. + + Args: + x: Activation tensor with shape (batch, seq_len, n_kv_heads, head_dim). + position_ids: starting position of input tensor + + Returns: + Input activation tensor with rotary positional embeddings applied and + the same shape as `x`. + """ + v = TensorValue(x) + + # TODO: Figure out if this is the correct axis. + freqs_cis_sliced = ops.gather(self.freqs_cis, position_ids, 0) + # TODO(MSDK-1188): Ideally this cast would happen inside of the cached + # self.freqs_cis property instead of here, but complex.dtype is not + # known at that point. + cos = ops.cast(ops.cos(freqs_cis_sliced), v.dtype) + sin = ops.cast(ops.sin(freqs_cis_sliced), v.dtype) + + return cos, sin diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/transformer.py b/src/max/pipelines/architectures/pixtral/vision_encoder/transformer.py new file mode 100644 index 0000000000..e2089ead22 --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/transformer.py @@ -0,0 +1,113 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +from max.dtype import DType +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.nn.layer import Layer + +if TYPE_CHECKING: + from max.pipelines.nn.linear import Linear + from max.pipelines.nn.norm import RMSNorm + + from .attention import Attention + + +@dataclass +class MLP(Layer): + """ + Simple multi-layer perceptron composed of three linear layers. + Uses Gelu activation function. + """ + + gate_proj: Linear + down_proj: Linear + up_proj: Linear + + def __call__(self, x: TensorValueLike) -> TensorValue: + return self.down_proj((ops.silu(self.gate_proj(x)) * self.up_proj(x))) # type: ignore + + +@dataclass +class TransformerBlock(Layer): + """Stack of Attention, FeedForward, and RMSNorm layers.""" + + attention: Attention + mlp: MLP + attention_norm: RMSNorm + mlp_norm: RMSNorm + residual_multiplier: float = 1.0 + + def __call__( + self, + x: TensorValue, + attention_mask: TensorValueLike, + position_embeddings: tuple[TensorValue, TensorValue], + ) -> TensorValue: + residual_multiplier = ops.constant(self.residual_multiplier, x.dtype) + attn_out = self.attention( + self.attention_norm(x), + attention_mask, + position_embeddings, + ) + + if self.residual_multiplier != 1.0: + attn_out = attn_out * residual_multiplier + + h = x + attn_out + mlp = self.mlp(self.mlp_norm(h)) + if self.residual_multiplier != 1.0: + mlp = mlp * residual_multiplier + + return h + mlp + + +@dataclass +class Transformer(Layer): + """Transformer model consisting of TransformerBlock layers. + The input is embeddings created using convolution followed by normalization. + + The differences between this transformer and other decoder model transformers: + 1. Input to the transformer is patch embeddings created by convolutions not tokens. + 2. No linear(norm(output)) at the transformer output. + 3. It uses the 2d rotary embeddings defined for images which is different + from the rotary embeddings defined in other classes as rope: RotaryEmbedding + """ + + n_heads: int + layers: list[TransformerBlock] + dtype: DType + + def __call__( + self, + patch_embeds: TensorValue, + attention_mask: TensorValueLike, + position_embeddings: tuple[TensorValue, TensorValue], + **kwargs, + ): + h = patch_embeds + + for _, layer in enumerate(self.layers): + h = layer( + x=h, + attention_mask=attention_mask, + position_embeddings=position_embeddings, + **kwargs, + ) + + return ops.cast(h, self.dtype) diff --git a/src/max/pipelines/architectures/pixtral/vision_encoder/vision_encoder.py b/src/max/pipelines/architectures/pixtral/vision_encoder/vision_encoder.py new file mode 100644 index 0000000000..1c044dd18c --- /dev/null +++ b/src/max/pipelines/architectures/pixtral/vision_encoder/vision_encoder.py @@ -0,0 +1,93 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from dataclasses import dataclass +from typing import List + +from max.dtype import DType +from max.graph import TensorValueLike, ops +from max.pipelines.nn import Conv2D +from max.pipelines.nn.layer import Layer +from max.pipelines.nn.norm import RMSNorm + +from .rotary_embedding_2d import RotaryEmbedding2D, patch_position_ids +from .transformer import Transformer + + +@dataclass +class VisionEncoder(Layer): + """The bare Pixtral vision encoder outputting raw hidden-states without any + specific head on top. + + It tokenizes the list of images and returns a representation of these images + embeddings of patches. + """ + + patch_conv: Conv2D + layer_norm: RMSNorm + patch_positional_embedding: RotaryEmbedding2D + transformer: Transformer + dtype: DType + patch_size: int = 16 + max_image_size: int = 1024 + + def __call__( + self, imgs: List[TensorValueLike], attention_mask: TensorValueLike + ): + """ + imgs: list of images of shape = (height, width, num_channels) + """ + # Images go through a convolution independently to get patched. + # Returns a list of [batch_size, hidden_size, height/patch_size, width/patch_size] tensors + patch_embeds_list = [ + self.patch_conv(ops.unsqueeze(ops.cast(img, self.dtype), 0)) + for img in imgs + ] + + # Flatten all images to a single tensor of patches of size (n_patches=seq_length, hidden_size). + # 1. Flattens each image's patches to (batch_size, n_patches in image, hidden_size). + # 2. Concat patches vertically on dim 1 to get a sequence of all patches + # TODO(MSDK-1192): replace transpose(1, 2) by permute(0, 2, 1) + # TODO(MSDK-1195): replace p.reshape((p.shape[0], p.shape[1], -1)) by p.flatten(2) + patch_embeds = ops.concat( + [ # p.shape = batch_size, patches_per_height, patches_per_width, hidden_size + p.reshape((p.shape[0], -1, p.shape[3])) + for p in patch_embeds_list + ], + axis=1, + ) + + # Pre-attention layer normalization + patch_embeds = self.layer_norm(patch_embeds) + + # Get unique ids of tokens (patches) based on row and col idx in the image (position). + # These help the model understand the spatial layout of the image. + position_ids = patch_position_ids( + patch_embeds_list, max_width=self.max_image_size // self.patch_size + ) + + # Positional Encodings + # map each position id to its corresponding embedding representing that posiiton + position_embedding = self.patch_positional_embedding( + patch_embeds, position_ids + ) + + encoder_output = self.transformer( + patch_embeds=patch_embeds, + attention_mask=attention_mask, + position_embeddings=position_embedding, + ) + + return encoder_output diff --git a/src/max/pipelines/architectures/qwen2/README.md b/src/max/pipelines/architectures/qwen2/README.md new file mode 100644 index 0000000000..d42abdc47d --- /dev/null +++ b/src/max/pipelines/architectures/qwen2/README.md @@ -0,0 +1,120 @@ +# Qwen 2.5 + +**Language:** Python + +**API**: MAX Graph + +This pipeline provides optimized support for the `Qwen2ForCausalLM` family +of large language models, as exemplified by the Qwen 2.5 7B Instruct text +completion model. The model itself has been constructed in Python +using the [MAX Graph API](https://docs.modular.com/max/graph/). + +The MAX Graph API provides an accessible interface to the construction of +flexible accelerated compute graphs, which are then optimized by the MAX +Engine's advanced graph compiler. This pipeline showcases how a large language +model can be fully defined using Python and MAX Graphs and then compiled for +optimal inference performance via the MAX Engine. + +## Model + +[Qwen 2.5](https://qwenlm.github.io/blog/qwen2.5/) is an open source large +language model released by [Qwen AI](https://qwenlm.github.io/). The weight +checkpoints have been released under an Apache 2.0 license. + +The default settings for this pipeline use the 7B Instruct set of pretrained +weights in the `bfloat16` encoding. + +## Usage + +The easiest way to try out this pipeline is with our Magic command-line tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this pipeline's + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/ + ``` + +3. Now run the Qwen text completion demo with the following command: + + ```shell + magic run qwen --prompt "I believe the meaning of life is" + ``` + +4. Host a chat completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + You can configure the pipeline to be hosted by using the `--serve` argument. + For example: + + ```shell + magic run qwen --serve + ``` + + A request can be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "Qwen/Qwen2.5-7B-Instruct", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"} + ] + }' + ``` + + Additionally, finetuned weights hosted on Hugging Face for any compatible + `Qwen2ForCausalLM` model can be used with this optimized architecture + via the `serve` command: + + ```shell + magic run serve --model-path=Qwen/Qwen2.5-7B-Instruct + ``` + +## Options + +The following command-line options are available to customize operation of the +pipeline: + +- `--max-length`: Controls the maximum length of the text sequence + (includes the input tokens). +- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 + value is provided, the model will continue to generate tokens for the entire + context length. (Default value: -1) +- `--prompt`: The text prompt to use for further generation. +- `--save-to-serialized-model-path`: If specified, writes the serialized model + to this path. +- `--serialized-model-path`: If specified, tries to load a serialized model + from this path. +- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. +- `--weight-path`: Overrides the default URL, and allows for an + already-downloaded pretrained weight file to be used with the model. +- `--max-batch-size`: Specifies the maximum batch size to be used. + Default is 1. +- `--devices`: Specifies the device(s) to use for the model. This can optionally + be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". + Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/qwen2/__init__.py b/src/max/pipelines/architectures/qwen2/__init__.py new file mode 100644 index 0000000000..69d2f5bacf --- /dev/null +++ b/src/max/pipelines/architectures/qwen2/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import qwen2_arch + +__all__ = ["qwen2_arch"] diff --git a/src/max/pipelines/architectures/qwen2/arch.py b/src/max/pipelines/architectures/qwen2/arch.py new file mode 100644 index 0000000000..f181ebfd1b --- /dev/null +++ b/src/max/pipelines/architectures/qwen2/arch.py @@ -0,0 +1,47 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from .model import Qwen2Model + +qwen2_arch = SupportedArchitecture( + name="Qwen2ForCausalLM", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=[ + "Qwen/Qwen2.5-7B-Instruct", + ], + default_weights_format=WeightsFormat.safetensors, + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.float32: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + SupportedEncoding.bfloat16: [ + KVCacheStrategy.PAGED, + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.NAIVE, + ], + }, + pipeline_model=Qwen2Model, + tokenizer=TextTokenizer, +) diff --git a/src/max/pipelines/architectures/qwen2/graph.py b/src/max/pipelines/architectures/qwen2/graph.py new file mode 100644 index 0000000000..cb5c51bbdf --- /dev/null +++ b/src/max/pipelines/architectures/qwen2/graph.py @@ -0,0 +1,309 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Build a Qwen2 model via Graph API from GGUF weights.""" + +import math +from typing import List, Union, cast + +from max.dtype import DType +from max.graph import ( + DeviceRef, + Graph, + TensorValue, + TensorValueLike, + Weight, + ops, +) +from max.graph.weights import Weights +from max.pipelines import PipelineConfig, RopeType, WeightsFormat +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, + KVCacheStrategy, +) +from max.pipelines.nn import ( + MLP, + AttentionWithRope, + Embedding, + Linear, + OptimizedRotaryEmbedding, + RMSNorm, + Transformer, + TransformerBlock, +) + + +def distribute_value( + v: TensorValue, devices: List[DeviceRef] +) -> List[TensorValue]: + return [v.to(device) for device in devices] + + +def shard_col_value( + x: TensorValueLike, devices: List[DeviceRef] +) -> List[TensorValue]: + n_devices = len(devices) + v = TensorValue(x) + col_size = v.shape[1] // n_devices + return [ + v[:, i * col_size : (i + 1) * col_size].to(device) + for i, device in enumerate(devices) + ] + + +def shard_row_value( + x: TensorValueLike, devices: List[DeviceRef] +) -> List[TensorValue]: + n_devices = len(devices) + v = TensorValue(x) + row_size = v.shape[0] // n_devices + return [ + v[i * row_size : (i + 1) * row_size, :].to(device) + for i, device in enumerate(devices) + ] + + +def feed_forward( + dtype: DType, + hidden_dim: int, + feed_forward_length: int, + weights: Weights, +) -> MLP: + return MLP( + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.mlp.gate_proj, + ), + linear( + dtype, + hidden_dim, + feed_forward_length, + weights.mlp.down_proj, + ), + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.mlp.up_proj, + ), + ) + + +def linear( + dtype: DType, + in_features: int, + out_features: int, + weights: Weights, +) -> Linear: + return Linear( + weights.weight.allocate( + dtype, + [in_features, out_features], + ) + ) + + +def rms_norm(dims: int, eps: float, weights: Weights) -> RMSNorm: + return RMSNorm(weights.weight.allocate(DType.float32, [dims]), eps) + + +def embedding( + pipeline_config: PipelineConfig, + vocab_size: int, + hidden_dim: int, + weights: Weights, +) -> Embedding: + return Embedding( + weights.weight.allocate( + pipeline_config.dtype, + [vocab_size, hidden_dim], + ) + ) + + +def attention( + kv_params: KVCacheParams, + pipeline_config: PipelineConfig, + rope: OptimizedRotaryEmbedding, + weights: Weights, + layer_idx: TensorValue, +) -> AttentionWithRope: + kv_weight_dim = ( + pipeline_config.huggingface_config.hidden_size + // pipeline_config.huggingface_config.num_attention_heads + ) * pipeline_config.huggingface_config.num_key_value_heads + + wq = weights.self_attn.q_proj.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.hidden_size, + pipeline_config.huggingface_config.hidden_size, + ], + ) + wk = weights.self_attn.k_proj.weight.allocate( + pipeline_config.dtype, + [kv_weight_dim, pipeline_config.huggingface_config.hidden_size], + ) + wv = weights.self_attn.v_proj.weight.allocate( + pipeline_config.dtype, + [kv_weight_dim, pipeline_config.huggingface_config.hidden_size], + ) + + wqkv = ops.concat((wq, wk, wv)) + + bias_q = weights.self_attn.q_proj.bias.allocate( + pipeline_config.dtype, + [pipeline_config.huggingface_config.hidden_size], + ) + + bias_k = weights.self_attn.k_proj.bias.allocate( + pipeline_config.dtype, + [kv_weight_dim], + ) + + bias_v = weights.self_attn.v_proj.bias.allocate( + pipeline_config.dtype, + [kv_weight_dim], + ) + + bias_qkv = ops.concat((bias_q, bias_k, bias_v)) + + return AttentionWithRope( + n_heads=pipeline_config.huggingface_config.num_attention_heads, + kv_params=kv_params, + wqkv=wqkv, + wo=linear( + pipeline_config.dtype, + pipeline_config.huggingface_config.hidden_size, + pipeline_config.huggingface_config.hidden_size, + weights.self_attn.o_proj, + ), + rope=rope, + layer_idx=layer_idx, + bias=bias_qkv, + scale=math.sqrt(1.0 / kv_params.head_dim), + ) + + +def transformer( + graph: Graph, + pipeline_config: PipelineConfig, + weights: Weights, + kv_params: KVCacheParams, +) -> Transformer: + with graph: + if weights.rope_freqs.weight.exists(): + rope_scaling = weights.rope_freqs.weight.raw_tensor() + else: + rope_scaling = None + + interleaved_rope_weights = ( + pipeline_config.weights_format == WeightsFormat.gguf + and pipeline_config.rope_type == RopeType.normal + ) + rope = OptimizedRotaryEmbedding( + dim=pipeline_config.huggingface_config.hidden_size, + n_heads=pipeline_config.huggingface_config.num_attention_heads, + theta=pipeline_config.huggingface_config.rope_theta, + max_seq_len=pipeline_config.huggingface_config.max_position_embeddings, + rope_scaling=rope_scaling, + interleaved=interleaved_rope_weights, + ) + + rms_norm_eps = pipeline_config.huggingface_config.rms_norm_eps + layers = [ + TransformerBlock( + attention=attention( + kv_params, + pipeline_config, + rope, + weights.model.layers[i], + layer_idx=ops.constant(i, DType.uint32), + ), + mlp=feed_forward( + pipeline_config.dtype, + pipeline_config.huggingface_config.hidden_size, + pipeline_config.huggingface_config.intermediate_size, + weights.model.layers[i], + ), + attention_norm=rms_norm( + pipeline_config.huggingface_config.hidden_size, + rms_norm_eps, + weights.model.layers[i].input_layernorm, + ), + mlp_norm=rms_norm( + pipeline_config.huggingface_config.hidden_size, + rms_norm_eps, + weights.model.layers[i].post_attention_layernorm, + ), + ) + for i in range(pipeline_config.huggingface_config.num_hidden_layers) + ] + + embedding_layer = embedding( + pipeline_config, + pipeline_config.huggingface_config.vocab_size, + pipeline_config.huggingface_config.hidden_size, + weights.model.embed_tokens, + ) + + # Some model variants lack dedicated weights for a final linear + # layer, and share the embedding layer. + if weights.lm_head.weight.exists(): + output = Linear.create( + pipeline_config.dtype, + pipeline_config.graph_quantization_encoding, + pipeline_config.huggingface_config.vocab_size, + pipeline_config.huggingface_config.hidden_size, + weights.lm_head, + ) + else: + output = Linear.create( + pipeline_config.dtype, + pipeline_config.graph_quantization_encoding, + pipeline_config.huggingface_config.vocab_size, + pipeline_config.huggingface_config.hidden_size, + cast(Weight, embedding_layer.weights), + ) + + kv_collection: Union[ + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + ] + if kv_params.cache_strategy == KVCacheStrategy.CONTINUOUS: + kv_collection = FetchContinuousBatchingKVCacheCollection(kv_params) + elif kv_params.cache_strategy == KVCacheStrategy.PAGED: + kv_collection = FetchPagedKVCacheCollection(kv_params) + else: + raise ValueError( + "Unsupported caching strategy " + str(kv_params.cache_strategy) + ) + + return Transformer( + dim=pipeline_config.huggingface_config.hidden_size, + n_heads=pipeline_config.huggingface_config.num_attention_heads, + layers=layers, + norm=rms_norm( + pipeline_config.huggingface_config.hidden_size, + rms_norm_eps, + weights.model.norm, + ), + output=output, + embedding=embedding_layer, + kv_params=kv_params, + kv_collection_constructor=kv_collection, + all_logits=pipeline_config.enable_echo, + ) diff --git a/src/max/pipelines/architectures/qwen2/model.py b/src/max/pipelines/architectures/qwen2/model.py new file mode 100644 index 0000000000..526234d031 --- /dev/null +++ b/src/max/pipelines/architectures/qwen2/model.py @@ -0,0 +1,498 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import time +import warnings +from typing import List, Sequence, Union, cast + +import numpy as np +from max.driver import CPU, Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession, Model +from max.graph import DeviceRef, Graph, TensorType, TensorValue +from max.graph.weights import Weights +from max.pipelines import ( + LogProbabilities, + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + TextContext, + upper_bounded_default, +) +from max.pipelines.dataprocessing import batch_padded_tokens_and_mask +from max.pipelines.kv_cache import ( + KVCacheInputs, + KVCacheManager, + KVCacheParams, + estimate_kv_cache_size, + load_kv_manager, +) +from max.pipelines.nn.compute_log_probabilities import compute_log_probabilities + +from .graph import transformer + + +class Qwen2Inputs(ModelInputs): + """A class representing inputs for the Qwen2 model. + + This class encapsulates the input tensors required for the Qwen2 model execution: + - tokens: A tensor containing the input token IDs + - input_row_offsets_or_attn_mask: A tensor containing the offsets for each row in the ragged input sequence, + or the attention mask for the padded input sequence + """ + + tokens: Tensor + input_row_offsets_or_attn_mask: Tensor + + def __init__( + self, + tokens: Tensor, + input_row_offsets_or_attn_mask: Tensor, + ) -> None: + self.tokens = tokens + self.input_row_offsets_or_attn_mask = input_row_offsets_or_attn_mask + + @property + def input_row_offsets(self) -> Tensor: + """Gets the row offsets of the ragged input sequence.""" + # TODO(bduke): this should implement a ragged tensor interface. + return self.input_row_offsets_or_attn_mask + + +class Qwen2Model(PipelineModel[TextContext]): + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) + self.model = self.load_model(session) + + def execute( + self, + model_inputs: ModelInputs, + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + assert kv_cache_inputs is not None + + model_inputs = cast(Qwen2Inputs, model_inputs) + model_outputs = self.model.execute( + model_inputs.tokens, + model_inputs.input_row_offsets_or_attn_mask, + *kv_cache_inputs, + copy_inputs_to_device=( + not self.pipeline_config.cache_strategy.uses_opaque() + ), + ) + + assert isinstance(model_outputs[0], Tensor) + if len(model_outputs) > 1: + assert isinstance(model_outputs[1], Tensor) + logits = model_outputs[1] + else: + logits = None + + if self.pipeline_config.enable_echo: + return ModelOutputs( + next_token_logits=model_outputs[0], + logits=logits, + ) + else: + return ModelOutputs(next_token_logits=model_outputs[0]) + + def _prepare_ragged_initial_token_inputs( + self, context_batch: Sequence[TextContext] + ) -> Qwen2Inputs: + # Get input_row_offsets: start and end position of each batch in the + # combined total_seq_len dimension. + input_row_offsets = np.cumsum( + [0] + [ctx.active_length for ctx in context_batch], + dtype=np.uint32, + ) + + # Create a ragged token vector of length: sum(len(t) for t in tokens). + tokens = np.concatenate([ctx.next_tokens for ctx in context_batch]) + + return Qwen2Inputs( + tokens=Tensor.from_numpy(tokens).to( + self.pipeline_config.devices[0] + ), + input_row_offsets_or_attn_mask=Tensor.from_numpy( + input_row_offsets + ).to(self.pipeline_config.devices[0]), + ) + + def _prepare_padded_initial_token_inputs( + self, context_batch: Sequence[TextContext] + ) -> Qwen2Inputs: + # Get tokens and seq_ids + tokens = [ctx.next_tokens for ctx in context_batch] + + # Pad tokens and compute attention mask for the batch. + max_seq_len = self.kv_manager.max_sequence_length + start_pos = [max_seq_len] * len(context_batch) + next_tokens_batch, _, attn_mask = batch_padded_tokens_and_mask( + start_pos=start_pos, + tokens=tokens, + pad_to_multiple_of=self.pipeline_config.pad_to_multiple_of, + ) + + return Qwen2Inputs( + tokens=Tensor.from_numpy(next_tokens_batch).to( + self.pipeline_config.devices[0] + ), + input_row_offsets_or_attn_mask=Tensor.from_numpy(attn_mask).to( + self.pipeline_config.devices[0] + ), + ) + + # Ignored type due to challenge with Interface implementation and mypy rules. + def prepare_initial_token_inputs( + self, + context_batch: Sequence[TextContext], + ) -> Qwen2Inputs: + """Prepare the inputs for the first pass in multistep execution.""" + if self.pipeline_config.cache_strategy.uses_opaque(): + return self._prepare_ragged_initial_token_inputs(context_batch) + else: + return self._prepare_padded_initial_token_inputs(context_batch) + + def _prepare_ragged_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: Qwen2Inputs, + ) -> Qwen2Inputs: + row_offsets_size = ( + prev_model_inputs.input_row_offsets_or_attn_mask.shape[0] + ) + next_row_offsets = self._input_row_offsets_prealloc[:row_offsets_size] + + return Qwen2Inputs( + tokens=next_tokens, + input_row_offsets_or_attn_mask=next_row_offsets, + ) + + def _prepare_padded_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: Qwen2Inputs, + ) -> Qwen2Inputs: + batch_size = prev_model_inputs.tokens.shape[0] + start_pos = [ + prev_model_inputs.input_row_offsets_or_attn_mask.shape[-1] + ] * batch_size + + next_tokens_batch, _, attn_mask = batch_padded_tokens_and_mask( + start_pos=start_pos, + tokens=[next_tokens.to_numpy()], + pad_to_multiple_of=self.pipeline_config.pad_to_multiple_of, + ) + return Qwen2Inputs( + tokens=Tensor.from_numpy(next_tokens_batch).to( + self.pipeline_config.devices[0] + ), + input_row_offsets_or_attn_mask=Tensor.from_numpy(attn_mask).to( + self.pipeline_config.devices[0] + ), + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> Qwen2Inputs: + """Prepare the inputs for the next token in multistep execution. + This should avoid any device synchronization or copy operations. + """ + prev_model_inputs = cast(Qwen2Inputs, prev_model_inputs) + if self.pipeline_config.cache_strategy.uses_opaque(): + return self._prepare_ragged_next_token_inputs( + next_tokens, prev_model_inputs + ) + else: + return self._prepare_padded_next_token_inputs( + next_tokens, prev_model_inputs + ) + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.num_key_value_heads, + head_dim=pipeline_config.huggingface_config.hidden_size + // pipeline_config.huggingface_config.num_attention_heads, + page_size=pipeline_config.kv_cache_page_size, + cache_strategy=pipeline_config.cache_strategy, + n_devices=len(pipeline_config.devices), + enable_prefix_caching=pipeline_config.enable_prefix_caching, + ) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return pipeline_config.huggingface_config.num_hidden_layers + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.max_position_embeddings, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for Qwen2, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_position_embeddings " + f"({pipeline_config.huggingface_config.max_position_embeddings})." + ) + raise ValueError(msg) from e + + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: int, + ) -> KVCacheManager: + return load_kv_manager( + params=self.get_kv_params(self.pipeline_config), + max_batch_size=self.pipeline_config.max_batch_size, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + num_layers=self.pipeline_config.huggingface_config.num_hidden_layers, + devices=self.pipeline_config.devices, + available_cache_memory=available_cache_memory, + page_size=self.pipeline_config.kv_cache_page_size, + session=session, + ) + + @classmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: List[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + return estimate_kv_cache_size( + params=cls.get_kv_params(pipeline_config), + max_batch_size=pipeline_config.max_batch_size, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=pipeline_config.huggingface_config.num_hidden_layers, + available_cache_memory=available_cache_memory, + devices=devices, + ) + + def load_model( + self, + session: InferenceSession, + ) -> Model: + # Pre-allocate a buffer for input_row_offsets in multistep execution. + # We do this to avoid materializing and copying a buffer with each multistep step + + if self.pipeline_config.max_batch_size is None: + batch_size = 1 + else: + batch_size = self.pipeline_config.max_batch_size + 1 + + self._input_row_offsets_prealloc = Tensor.from_numpy( + np.arange(batch_size, dtype=np.uint32) + ).to(self.pipeline_config.devices[0]) + + # Read in weights. + self._weights = self.pipeline_config.load_weights() + + if serialized_path := self.pipeline_config.serialized_model_path: + # Hydrate all weights to be referenced by the serialized path. + weights_registry = {} + for name, weight in self._weights.items(): + weights_registry[name] = weight.raw_tensor() + + logging.info("Loading serialized model from %s", serialized_path) + + return session.load( + serialized_path, weights_registry=weights_registry + ) + + else: + logging.info("Building model...") + graph = self._build_graph(self._weights) + logging.info("Compiling...") + before = time.perf_counter() + model = session.load( + graph, weights_registry=self._weights.allocated_weights + ) + after = time.perf_counter() + logging.info(f"Compiling model took {after - before:.6f} seconds") + if ( + export_path + := self.pipeline_config.save_to_serialized_model_path + ): + logging.info("Exporting serialized model to %s", export_path) + model._export_mef(export_path) + return model + + def _unflatten_kv_inputs( + self, kv_inputs_flat: Sequence[Tensor] + ) -> List[tuple[Tensor, ...]]: + kv_params = self.get_kv_params(self.pipeline_config) + n_devices = kv_params.n_devices + fetch_types = self.kv_manager.input_symbols() + len_of_kv_tuple_per_dev = len(list(fetch_types[0])) + kv_caches_per_dev = [ + tuple( + kv_inputs_flat[ + i * len_of_kv_tuple_per_dev : (i + 1) + * len_of_kv_tuple_per_dev + ] + ) + for i in range(n_devices) + ] + return kv_caches_per_dev + + def _flatten_kv_inputs( + self, kv_caches_per_dev: List[tuple[Union[Tensor, TensorType], ...]] + ) -> Sequence[Union[Tensor, TensorType]]: + return [item for sublist in kv_caches_per_dev for item in sublist] + + def _build_opaque_graph(self, weights: Weights) -> Graph: + device0 = self.pipeline_config.devices[0] + device_ref = DeviceRef(device0.label, device0.id) + tokens_type = TensorType( + DType.int64, shape=["total_seq_len"], device=device_ref + ) + # NOTE: input_row_offsets_len should be batch_size + 1. + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"], device=device_ref + ) + + kv_cache_args = self.kv_manager.input_symbols()[0] + + with Graph( + "Qwen2", + input_types=[ + tokens_type, + input_row_offsets_type, + *kv_cache_args, + ], + ) as graph: + model = transformer( + graph, + self.pipeline_config, + weights, + self.get_kv_params(self.pipeline_config), + ) + tokens, input_row_offsets, *kv_cache = graph.inputs + + assert isinstance(tokens, TensorValue) + assert len(kv_cache) == 4 + assert isinstance(kv_cache[0], TensorValue) + assert isinstance(kv_cache[1], TensorValue) + assert isinstance(kv_cache[2], TensorValue) + assert isinstance(kv_cache[3], TensorValue) + + outputs = model( + tokens, + (kv_cache[0], kv_cache[1], kv_cache[2], kv_cache[3]), + input_row_offsets=input_row_offsets, + ) + graph.output(*outputs) + return graph + + def _build_graph(self, weights: Weights) -> Graph: + g = self._build_opaque_graph(weights) + return g + + def compute_log_probabilities( + self, + model_inputs: ModelInputs, + model_outputs: ModelOutputs, + next_tokens: Tensor, + batch_top_n: list[int], + batch_echo: list[bool], + ) -> list[LogProbabilities | None] | None: + if any(echo for echo in batch_echo): + if model_outputs.logits is None: + warnings.warn( + "Could not get logprobs with echo because the full logits" + f" were not returned by {self.pipeline_config.model_path}" + " model. Please ensure that this model is started with " + "`--enable-echo`." + ) + assert not self.pipeline_config.enable_echo, ( + "Echo was enabled but logits were not returned." + ) + return None + logits = model_outputs.logits.to(CPU()).to_numpy() + + assert model_outputs.next_token_logits is not None + next_token_logits = model_outputs.next_token_logits.to(CPU()).to_numpy() + + sampled_tokens = next_tokens.to(CPU()).to_numpy() + assert isinstance(model_inputs, Qwen2Inputs) + tokens = model_inputs.tokens.to(CPU()).to_numpy() + + if self.pipeline_config.cache_strategy.uses_opaque(): + # Handle the ragged inputs + input_row_offsets = model_inputs.input_row_offsets_or_attn_mask.to( + CPU() + ).to_numpy() + + def _get_logits_and_samples( + batch_index: int, echo: bool + ) -> tuple[np.ndarray, np.ndarray]: + if echo: + start_offset = input_row_offsets[batch_index] + end_offset = input_row_offsets[batch_index + 1] + batch_logits = logits[start_offset:end_offset] + samples = np.concatenate( + ( + tokens[start_offset + 1 : end_offset], + sampled_tokens[batch_index : batch_index + 1], + ) + ) + else: + batch_logits = next_token_logits[ + batch_index : batch_index + 1 + ] + samples = sampled_tokens[batch_index : batch_index + 1] + return batch_logits, samples + + else: + # Handle batched inputs. The model pads them to the right so the seq + # lengths can be computed by finding the first 0 token. + seq_lens = np.sum(tokens > 0, axis=1) + + def _get_logits_and_samples( + batch_index: int, echo: bool + ) -> tuple[np.ndarray, np.ndarray]: + if echo: + seq_len = seq_lens[batch_index] + padded_tokens = tokens[batch_index] + + batch_logits = logits[batch_index, :seq_len, :] + samples = np.concatenate( + ( + padded_tokens[1:seq_len], + sampled_tokens[batch_index : batch_index + 1], + ) + ) + else: + batch_logits = next_token_logits[ + batch_index : batch_index + 1, : + ] + samples = sampled_tokens[batch_index : batch_index + 1] + return batch_logits, samples + + return compute_log_probabilities( + _get_logits_and_samples, batch_top_n, batch_echo + ) diff --git a/src/max/pipelines/architectures/replit/README.md b/src/max/pipelines/architectures/replit/README.md new file mode 100644 index 0000000000..a77f156e3a --- /dev/null +++ b/src/max/pipelines/architectures/replit/README.md @@ -0,0 +1,119 @@ +# Replit Code V1.5 3B + +**Language:** Python + +**API**: MAX Graph + +This pipeline demonstrates code completion from an initial prompt using +Replit's Code V1.5 3B large language model. The model itself has been +constructed in Python using the +[MAX Graph API](https://docs.modular.com/max/graph/). + +The MAX Graph API provides an accessible interface to the construction of +flexible accelerated compute graphs, which are then optimized by the MAX +Engine's advanced graph compiler. This pipeline showcases how a large language +model can be fully defined using Python and MAX Graphs and then compiled for +optimal inference performance via the MAX Engine. + +## Model + +[Replit Code](https://blog.replit.com/replit-code-v1_5) is an open source code +generation model trained on permissively licensed code and released by +[Replit](https://replit.com). The V1.5, 3B variant is the basis for this +implementation, and weights are +[obtained via Hugging Face](https://huggingface.co/replit/replit-code-v1-3b). + +## Usage + +The easiest way to try out this pipeline is with our Magic command-line tool. + +1. Install Magic on macOS and Ubuntu with this command: + + ```shell + curl -ssL https://magic.modular.com | bash + ``` + + Then run the source command that's printed in your terminal. + + To see the available commands, you can run `magic --help`. + [Learn more about Magic here](https://docs.modular.com/magic). + +2. Clone the MAX examples repository: + + If you don't already have a local clone of this repository, create one via: + + ```shell + git clone https://github.com/modular/max.git + ``` + + The following instructions assume that you're present within this pipeline's + directory, and you can change to it after cloning: + + ```shell + cd max/src/max/ + ``` + +3. Now run the Replit code completion demo with the following command: + + ```shell + magic run replit --prompt "def fibonacci(n):" + ``` + +4. Host a code completion endpoint via MAX Serve. + + MAX Serve provides functionality to host performant OpenAI compatible + endpoints using the FastAPI framework. + + You can configure the pipeline to be hosted by using the `--serve` argument. + For example: + + ```shell + magic run replit --serve + ``` + + A request can be submitted via a cURL command. + + ```shell + curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "replit/replit-code-v1_5-3b", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "def fibonacci(n)"} + ] + }' + ``` + +## Options + +The following command-line options are available to customize operation of the +pipeline: + +- `--max-length`: Controls the maximum length of the text sequence + (includes the input tokens). + (Default value: 512) +- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 + value is provided, the model will continue to generate tokens for the entire + context length. (Default value: -1) +- `--prompt`: The text prompt to use for further generation. +- `--quantization-encoding`: The encoding to use for a datatype that can be + quantized to a low bits per weight format. The options for quantized formats + will download and cache default weights, but `float32` requires the use of + `--weight-path` to specify locally downloaded full-precision weights for use + in the model. + Valid values: `bfloat16`, `float32`. + (Default value: `float32`). +- `--save-to-serialized-model-path`: If specified, writes the serialized model + to this path. +- `--serialized-model-path`: If specified, tries to load a serialized model + from this path. +- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. +- `--weight-path`: Overrides the default URL, and allows for an + already-downloaded pretrained weight file to be used with the model. +- `--max-batch-size`: Specifies the maximum batch size to be used. + Default is 1. +- `--devices`: Specifies the device(s) to use for the model. This can optionally + be "cpu" or a comma-separated list of GPU ID(s). Defaults to the first + available GPU. diff --git a/src/max/pipelines/architectures/replit/__init__.py b/src/max/pipelines/architectures/replit/__init__.py new file mode 100644 index 0000000000..c49833f4ec --- /dev/null +++ b/src/max/pipelines/architectures/replit/__init__.py @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .arch import replit_arch + +__all__ = ["replit_arch"] diff --git a/src/max/pipelines/architectures/replit/arch.py b/src/max/pipelines/architectures/replit/arch.py new file mode 100644 index 0000000000..1bd1dae74b --- /dev/null +++ b/src/max/pipelines/architectures/replit/arch.py @@ -0,0 +1,39 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.pipelines import ( + PipelineTask, + SupportedArchitecture, + SupportedEncoding, + TextTokenizer, + WeightsFormat, +) +from max.pipelines.kv_cache import KVCacheStrategy + +from .model import ReplitModel + +replit_arch = SupportedArchitecture( + name="MPTForCausalLM", + task=PipelineTask.TEXT_GENERATION, + example_repo_ids=[ + "modularai/replit-code-1.5", + ], + default_encoding=SupportedEncoding.bfloat16, + supported_encodings={ + SupportedEncoding.float32: [KVCacheStrategy.CONTINUOUS], + SupportedEncoding.bfloat16: [KVCacheStrategy.CONTINUOUS], + }, + pipeline_model=ReplitModel, + tokenizer=TextTokenizer, + default_weights_format=WeightsFormat.gguf, +) diff --git a/src/max/pipelines/architectures/replit/graph.py b/src/max/pipelines/architectures/replit/graph.py new file mode 100644 index 0000000000..91b01a59c2 --- /dev/null +++ b/src/max/pipelines/architectures/replit/graph.py @@ -0,0 +1,204 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import math +from typing import Optional + +from max.dtype import DType +from max.graph import Graph, TensorType, TensorValue, ops +from max.graph.quantization import QuantizationEncoding +from max.graph.weights import GGUFWeights +from max.pipelines import PipelineConfig +from max.pipelines.kv_cache import ( + FetchContinuousBatchingKVCacheCollection, + KVCacheManager, + KVCacheParams, +) +from max.pipelines.nn import ( + AttentionImpl, + AttentionWithoutMask, + Embedding, + LayerNorm, + Linear, + MHAMaskVariant, + Sequential, + Transformer, + TransformerBlock, +) + + +def _feed_forward( + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + input_dim: int, + hidden_dim: int, + weights: GGUFWeights, +): + return Sequential( + layers=[ + Linear( + weights.ffn_up.weight.allocate( + dtype, [hidden_dim, input_dim], quantization_encoding + ) + ), + ops.gelu, + Linear( + weights.ffn_down.weight.allocate( + dtype, [input_dim, hidden_dim], quantization_encoding + ) + ), + ] + ) + + +def _layer_norm(dims: int, eps: float, weights: GGUFWeights) -> LayerNorm: + return LayerNorm( + weight=weights.weight.allocate(DType.float32, [dims]), + eps=eps, + ) + + +def _attention( + pipeline_config: PipelineConfig, + weights: GGUFWeights, + kv_params: KVCacheParams, + layer_index: int, +) -> AttentionImpl: + k_in_dim = kv_params.n_kv_heads * kv_params.head_dim + v_in_dim = kv_params.n_kv_heads * kv_params.head_dim + q_in_dim = pipeline_config.huggingface_config.d_model + wqkv = TensorValue( + weights.attn_qkv.weight.allocate( + pipeline_config.dtype, + [ + k_in_dim + v_in_dim + q_in_dim, + pipeline_config.huggingface_config.d_model, + ], + pipeline_config.quantization_encoding.quantization_encoding, # type: ignore + ) + ) + + return AttentionWithoutMask( + n_heads=pipeline_config.huggingface_config.n_heads, + kv_params=kv_params, + wqkv=wqkv, + wo=Linear( + weights.attn_output.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.d_model, + pipeline_config.huggingface_config.d_model, + ], + pipeline_config.quantization_encoding.quantization_encoding, # type: ignore + ) + ), + layer_idx=ops.constant(layer_index, dtype=DType.uint32), + mask_variant=MHAMaskVariant.CAUSAL_ALIBI_MASK, + scale=math.sqrt(1 / kv_params.head_dim), + ) + + +def _transformer( + graph: Graph, + pipeline_config: PipelineConfig, + weights: GGUFWeights, + kv_params: KVCacheParams, +): + with graph: + # Initialize Attention. + layers = [ + TransformerBlock( + attention=_attention( + pipeline_config, weights.blk[i], kv_params, i + ), + mlp=_feed_forward( + pipeline_config.dtype, + pipeline_config.quantization_encoding.quantization_encoding, # type: ignore + pipeline_config.huggingface_config.d_model, + 12288, + weights.blk[i], + ), + attention_norm=_layer_norm( + pipeline_config.huggingface_config.d_model, + 1e-5, + weights.blk[i].attn_norm, + ), + mlp_norm=_layer_norm( + pipeline_config.huggingface_config.d_model, + 1e-5, + weights.blk[i].ffn_norm, + ), + ) + for i in range(pipeline_config.huggingface_config.n_layers) + ] + + # Initialize Shared Embedding Weights. + shared_embedding_weight = weights.token_embd.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.vocab_size, + pipeline_config.huggingface_config.d_model, + ], + pipeline_config.quantization_encoding.quantization_encoding, # type: ignore + ) + + return Transformer( + dim=pipeline_config.huggingface_config.d_model, + n_heads=pipeline_config.huggingface_config.n_heads, + layers=layers, + norm=_layer_norm( + pipeline_config.huggingface_config.d_model, + 1e-5, + weights.output_norm, + ), + output=Linear(shared_embedding_weight), + embedding=Embedding(shared_embedding_weight), + kv_params=kv_params, + kv_collection_constructor=FetchContinuousBatchingKVCacheCollection( + kv_params + ), + all_logits=pipeline_config.enable_echo, + ) + + +def _build_graph( + pipeline_config: PipelineConfig, + weights: GGUFWeights, + kv_params: KVCacheParams, + kv_manager: KVCacheManager, +) -> Graph: + # Graph input types. + tokens_type = TensorType(DType.int64, shape=["total_seq_len"]) + input_row_offsets_type = TensorType( + DType.uint32, shape=["input_row_offsets_len"] + ) + kv_cache_types = kv_manager.input_symbols()[0] + + # Initialize Graph. + with Graph( + "replit", + input_types=[ + tokens_type, + input_row_offsets_type, + *kv_cache_types, + ], + ) as graph: + model = _transformer(graph, pipeline_config, weights, kv_params) + tokens, input_row_offsets, *kv_cache_inputs = graph.inputs + outputs = model( + tokens=tokens, + input_row_offsets=input_row_offsets, + kv_cache_inputs=kv_cache_inputs, + ) + graph.output(*outputs) + return graph diff --git a/src/max/pipelines/architectures/replit/model.py b/src/max/pipelines/architectures/replit/model.py new file mode 100644 index 0000000000..211d63a840 --- /dev/null +++ b/src/max/pipelines/architectures/replit/model.py @@ -0,0 +1,316 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import time +import warnings +from collections.abc import Sequence +from typing import cast + +import numpy as np +from max.driver import Device, DeviceSpec, Tensor +from max.engine import InferenceSession, Model +from max.graph.weights import GGUFWeights +from max.pipelines import ( + LogProbabilities, + ModelInputs, + ModelOutputs, + PipelineConfig, + PipelineModel, + TextContext, + upper_bounded_default, +) +from max.pipelines.kv_cache import ( + KVCacheInputs, + KVCacheManager, + KVCacheParams, + estimate_kv_cache_size, + load_kv_manager, +) +from max.pipelines.nn.compute_log_probabilities import compute_log_probabilities + +from .graph import _build_graph + +logger = logging.getLogger("max.pipelines") + + +class ReplitInputs(ModelInputs): + """A class representing inputs for the Replit model. + + This class encapsulates the input tensors required for the Replit model execution: + - tokens: A tensor containing the input token IDs + - input_row_offsets: A tensor containing the offsets for each row in the ragged input sequence + """ + + tokens: Tensor + input_row_offsets: Tensor + + def __init__( + self, + tokens: Tensor, + input_row_offsets: Tensor, + ) -> None: + self.tokens = tokens + self.input_row_offsets = input_row_offsets + + +class ReplitModel(PipelineModel[TextContext]): + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + if pipeline_config.device_specs[0] == DeviceSpec.cpu(): + msg = "Replit currently only supported on gpu." + raise ValueError(msg) + + super().__init__(pipeline_config, session) + self.model = self.load_model(session) + + def execute( + self, + model_inputs: ModelInputs, + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + model_inputs = cast(ReplitInputs, model_inputs) + assert kv_cache_inputs is not None, "Replit has KV cache inputs" + model_outputs = self.model.execute( + model_inputs.tokens, + model_inputs.input_row_offsets, + *kv_cache_inputs, + copy_inputs_to_device=False, + ) + if self.pipeline_config.enable_echo: + assert len(model_outputs) == 2 + assert isinstance(model_outputs[0], Tensor) + assert isinstance(model_outputs[1], Tensor) + return ModelOutputs( + next_token_logits=model_outputs[0], logits=model_outputs[1] + ) + else: + assert len(model_outputs) == 1 + assert isinstance(model_outputs[0], Tensor) + return ModelOutputs(next_token_logits=model_outputs[0]) + + def prepare_initial_token_inputs( + self, + context_batch: Sequence[TextContext], + ) -> ReplitInputs: + # Get input_row_offsets: start and end position of each batch in the + # combined total_seq_len dimension. + input_row_offsets = np.cumsum( + [0] + [ctx.active_length for ctx in context_batch], + dtype=np.uint32, + ) + + # Create a ragged token vector of length: sum(len(t) for t in tokens). + tokens = np.concatenate([ctx.next_tokens for ctx in context_batch]) + + return ReplitInputs( + tokens=Tensor.from_numpy(tokens).to( + self.pipeline_config.devices[0] + ), + input_row_offsets=Tensor.from_numpy(input_row_offsets).to( + self.pipeline_config.devices[0] + ), + ) + + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> ReplitInputs: + prev_model_inputs = cast(ReplitInputs, prev_model_inputs) + row_offsets_size = prev_model_inputs.input_row_offsets.shape[0] + next_row_offsets = self._input_row_offsets_prealloc[:row_offsets_size] + return ReplitInputs( + tokens=next_tokens, + input_row_offsets=next_row_offsets, + ) + + @classmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + return pipeline_config.huggingface_config.n_layers + + @classmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + return KVCacheParams( + dtype=pipeline_config.cache_dtype, + n_kv_heads=pipeline_config.huggingface_config.attn_config[ + "kv_n_heads" + ], + head_dim=pipeline_config.huggingface_config.d_model + // pipeline_config.huggingface_config.n_heads, + cache_strategy=pipeline_config.cache_strategy, + page_size=pipeline_config.kv_cache_page_size, + enable_prefix_caching=pipeline_config.enable_prefix_caching, + ) + + @classmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + try: + return upper_bounded_default( + upper_bound=pipeline_config.huggingface_config.max_seq_len, + default=pipeline_config.max_length, + ) + except ValueError as e: + msg = ( + "Unable to infer max_length for Replit, the provided " + f"max_length ({pipeline_config.max_length}) exceeds the " + f"model's max_seq_len " + f"({pipeline_config.huggingface_config.max_seq_len})." + ) + raise ValueError(msg) from e + + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: int, + ) -> KVCacheManager: + return load_kv_manager( + params=self.get_kv_params(self.pipeline_config), + max_batch_size=self.pipeline_config.max_batch_size, + max_seq_len=self.calculate_max_seq_len(self.pipeline_config), + num_layers=self.pipeline_config.huggingface_config.n_layers, + devices=self.pipeline_config.devices, + available_cache_memory=available_cache_memory, + page_size=self.pipeline_config.kv_cache_page_size, + session=session, + ) + + @classmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: list[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + return estimate_kv_cache_size( + params=cls.get_kv_params(pipeline_config), + max_batch_size=pipeline_config.max_batch_size, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=pipeline_config.huggingface_config.n_layers, + available_cache_memory=available_cache_memory, + devices=devices, + ) + + def load_model( + self, + session: InferenceSession, + ) -> Model: + # Pre-allocate a buffer for input_row_offsets in multistep execution. + # We do this to avoid materializing and copying a buffer with each multistep step + assert self.pipeline_config.max_batch_size, ( + "Expected max_batch_size to be set" + ) + self._input_row_offsets_prealloc = Tensor.from_numpy( + np.arange(self.pipeline_config.max_batch_size + 1, dtype=np.uint32) + ).to(self.pipeline_config.devices[0]) + + # Read in weights. + weights = self.pipeline_config.load_weights() + if not isinstance(weights, GGUFWeights): + msg = "only gguf weights supported in Replit." + raise ValueError(msg) + + self._weights = weights + + if serialized_path := self.pipeline_config.serialized_model_path: + # Hydrate all weights to be referenced by the serialized path. + weights_registry = {} + for name, weight in self._weights.items(): + weights_registry[name] = weight.raw_tensor() + + logger.info("Loading serialized model from ", serialized_path) + + return session.load( + serialized_path, weights_registry=weights_registry + ) + + else: + logger.info("Building and compiling model...") + before = time.perf_counter() + graph = _build_graph( + self.pipeline_config, + self._weights, + self.get_kv_params(self.pipeline_config), + kv_manager=self.kv_manager, + ) + model = session.load( + graph, weights_registry=self._weights.allocated_weights + ) + after = time.perf_counter() + logger.info( + f"Building and compiling model took {after - before:.6f} seconds" + ) + if ( + export_path + := self.pipeline_config.save_to_serialized_model_path + ): + logger.info("Exporting serialized model to %s", export_path) + model._export_mef(export_path) + return model + + def compute_log_probabilities( + self, + model_inputs: ModelInputs, + model_outputs: ModelOutputs, + next_tokens: Tensor, + batch_top_n: list[int], + batch_echo: list[bool], + ) -> list[LogProbabilities | None] | None: + if any(echo for echo in batch_echo): + if model_outputs.logits is None: + warnings.warn( + "Could not get logprobs with echo because the full logits" + f" were not returned by {self.pipeline_config.model_path}" + " model. Please ensure that this model is started with " + "`--enable-echo`." + ) + assert not self.pipeline_config.enable_echo, ( + "Echo was enabled but logits were not returned." + ) + return None + logits = model_outputs.logits.to_numpy() + assert model_outputs.next_token_logits + next_token_logits = model_outputs.next_token_logits.to_numpy() + + sampled_tokens = next_tokens.to_numpy() + + # Handle the ragged inputs + model_inputs = cast(ReplitInputs, model_inputs) + tokens = model_inputs.tokens.to_numpy() + input_row_offsets = model_inputs.input_row_offsets.to_numpy() + + def _get_logits_and_samples( + batch_index: int, echo: bool + ) -> tuple[np.ndarray, np.ndarray]: + if echo: + start_offset = input_row_offsets[batch_index] + end_offset = input_row_offsets[batch_index + 1] + batch_logits = logits[start_offset:end_offset] + samples = np.concatenate( + ( + tokens[start_offset + 1 : end_offset], + sampled_tokens[batch_index : batch_index + 1], + ) + ) + else: + batch_logits = next_token_logits[batch_index : batch_index + 1] + samples = sampled_tokens[batch_index : batch_index + 1] + return batch_logits, samples + + return compute_log_probabilities( + _get_logits_and_samples, batch_top_n, batch_echo + ) diff --git a/src/max/pipelines/architectures/whisper/encoder.py b/src/max/pipelines/architectures/whisper/encoder.py new file mode 100644 index 0000000000..ce403a6390 --- /dev/null +++ b/src/max/pipelines/architectures/whisper/encoder.py @@ -0,0 +1,187 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +from __future__ import annotations + +import math +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.nn import ( + Conv1D, + Embedding, + LayerNorm, + Linear, + Sequential, +) +from max.pipelines.nn.layer import Layer + + +@dataclass +class WhisperSdpaAttention(Layer): + n_heads: int + head_dim: int + + wq: Linear + wk: Linear + wv: Linear + wo: Linear + + def scaled_dot_product_attention( + self, + xq: TensorValueLike, + xk: TensorValueLike, + xv: TensorValueLike, + ) -> TensorValue: + xq = TensorValue(xq) + xk = TensorValue(xk) + xv = TensorValue(xv) + xq = xq.transpose(1, 2) + xk = xk.transpose(1, 2) + xv = xv.transpose(1, 2) + + scale = math.sqrt(1.0 / self.head_dim) + scores = xq @ ops.transpose(xk, 2, 3) + # Note, the graph compiler currently requires the order of operands + # to be `scores * scale` in order to pattern match the fused attention + # operator. + return ops.softmax(scores * scale) @ xv + + def __call__( + self, + x: TensorValue, + **kwargs, + ) -> TensorValue: + """Computes attention on x. + + Args: + x: Activations with shape (batch, seq_len, dim). + + Returns the result of WhisperSdpaAttention self attention on the input. + """ + x = TensorValue(x) + batch, seq_len = x.shape[0], x.shape[1] + # matmul weights + xq = self.wq(x) + xk = self.wk(x) + xv = self.wv(x) + + xq = ops.reshape(xq, [batch, seq_len, self.n_heads, self.head_dim]) + + xk = ops.reshape( + xk, + [ + batch, + seq_len, + self.n_heads, + self.head_dim, + ], + ) + xv = ops.reshape( + xv, + [ + batch, + seq_len, + self.n_heads, + self.head_dim, + ], + ) + + output = ( + self.scaled_dot_product_attention(xq, xk, xv) + .transpose(1, 2) + .reshape([batch, seq_len, -1]) + ) + return self.wo(output) + + +@dataclass +class WhisperEncoderLayer(Layer): + """Stack of Attention, FeedForward, and LayerNorm layers.""" + + attention: WhisperSdpaAttention + mlp: Sequential + attention_norm: LayerNorm + mlp_norm: LayerNorm + + def __call__( + self, + x: TensorValue, + **kwargs, + ) -> TensorValue: + attn_out = self.attention( + self.attention_norm(x), + **kwargs, + ) + + h = x + attn_out + h = h + self.mlp(self.mlp_norm(h)) + + return h + + +@dataclass +class WhisperEncoder(Layer): + """A Transformer consisting of a stem, positional embeddings, and self attention layers. + + The differences between this transformer and `nn.Transformer` are: + 1. Whisper passes the input through a stem of: + Two convolution layers with a filter width of 3 and the GELU activation + function where the second convolution layer has a stride of two. + + 2. After that, Sinusoidal position embeddings are then added to the output of the stem. + + After that, the usual Transformer blocks (with pre-activation residual blocks) are applied. + We use naive attention where the linear projections have a bias. + + 3. No final transformer linear layer "output". + """ + + conv1: Conv1D + conv2: Conv1D + embed_positions: Embedding + layers: list[WhisperEncoderLayer] + norm: LayerNorm # TODO: Is LayerNorm here not the same as nn.LayerNorm + + all_logits: bool = False + + def __call__( + self, + input_features: TensorValueLike, + **kwargs, + ) -> tuple[TensorValue, ...]: + """ + Args: + input_features: Tensor of shape (batch_size, feature_size, sequence_length) + expected_seq_length = config.max_source_positions * self.conv1.stride[0] * self.conv2.stride[0] + + """ + # Encoder stem: two convolution layers and the GELU activation function. + inputs_embeds = ops.gelu(self.conv1(input_features)) + inputs_embeds = ops.gelu(self.conv2(inputs_embeds)) + + # self.embed_positions.weights layers is of shape = (1500, 1280) + # TODO: Do we need the reshape to (batch_size, sequence_length, feature_size) or is it already in the right shape? + # inputs_embeds = ops.permute(inputs_embeds, [0, 2, 1]) + + # Add sinusoidal position embeddings to the output of the stem + h = inputs_embeds + self.embed_positions.weights + + for _, layer in enumerate(self.layers): + h = layer(h, **kwargs) + + # # A final layer normalization is applied to the encoder output + normalized = self.norm(h) + + # Always return float32 logits, no matter the activation type. + return (ops.cast(normalized, DType.float32),) diff --git a/src/max/pipelines/architectures/whisper/graph.py b/src/max/pipelines/architectures/whisper/graph.py new file mode 100644 index 0000000000..fc3ca1ab5a --- /dev/null +++ b/src/max/pipelines/architectures/whisper/graph.py @@ -0,0 +1,294 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import numpy as np +from max.dtype import DType +from max.graph import Graph, TensorType, ops +from max.graph.weights import SafetensorWeights +from max.pipelines import PipelineConfig +from max.pipelines.nn import ( + Conv1D, + Embedding, + LayerNorm, + Linear, + Sequential, +) + +from .encoder import WhisperEncoder, WhisperEncoderLayer, WhisperSdpaAttention + + +def conv1d( + dtype: DType, + in_channels: int, + kernel_size: int, + stride: int, + padding: int, + out_channels: int, + weights: SafetensorWeights, +) -> Conv1D: + """Creates a 1D convolution layer. + For conv1: ( hugging_face weights: model.encoder.conv1.weight) + in_channels = 128 + out_channels = 1280 + kernel_size = 3 + stride = 1 + padding = 1 + + For conv2: ( hugging_face weights: model.encoder.conv2.weight) + in_channels = 1280 + out_channels = 1280 + kernel_size = 3 + stride = 2 + padding = 1 + """ + # Loaded torch weights shape = (out_channels, in_channels, kernel_size) = [1280, 128, 3]. + # Graph-API Conv1D expects (kernel_size, in_channels, out_channels) = [3, 128, 1280]. + # TODO: Implement Conv1D with bias and use it here. + bias = weights.bias.allocate(dtype, [out_channels]) + return Conv1D( + filter=ops.permute( + weights.weight.allocate( + dtype, [out_channels, in_channels, 1, kernel_size], None + ), + [2, 1, 0], + ), + stride=stride, + padding=padding, + ) + + +def embedding( + dtype: DType, + max_source_positions: int, + hidden_dim: int, + weights: SafetensorWeights, +): + return Embedding( + weights.weight.allocate( + dtype, + [max_source_positions, hidden_dim], + ) + ) + + +def layer_norm(dims: int, eps: float, weights: SafetensorWeights) -> LayerNorm: + # TODO: check the shape of bias + return LayerNorm( + weight=weights.weight.allocate(DType.bfloat16, [dims]), + eps=eps, + bias=weights.bias.allocate(DType.bfloat16, [dims]), + ) + + +def linear( + dtype: DType, + in_features: int, + out_features: int, + weights: SafetensorWeights, +) -> Linear: + # TODO: Check we are passing the correct dim for bias + return Linear( + weights.weight.allocate(dtype, [in_features, out_features], None), + bias=weights.bias.allocate(dtype, [out_features], None), + ) + + +def feed_forward( + dtype: DType, + hidden_dim: int, + feed_forward_length: int, + weights: SafetensorWeights, +): + return Sequential( + layers=[ + linear( + dtype, + feed_forward_length, + hidden_dim, + weights.fc1, + ), + ops.gelu, + linear( + dtype, + hidden_dim, + feed_forward_length, + weights.fc2, + ), + ] + ) + + +def attention( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, + layer_index: int, +): + wq = weights.self_attn.q_proj.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.d_model, + pipeline_config.huggingface_config.d_model, + ], + ) + wk = weights.self_attn.k_proj.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.d_model, + pipeline_config.huggingface_config.d_model, + ], + ) + wv = weights.self_attn.v_proj.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.d_model, + pipeline_config.huggingface_config.d_model, + ], + ) + + bias_q = weights.self_attn.q_proj.bias.allocate( + pipeline_config.dtype, [pipeline_config.huggingface_config.d_model] + ) + bias_v = weights.self_attn.v_proj.bias.allocate( + pipeline_config.dtype, [pipeline_config.huggingface_config.d_model] + ) + bias_k = ops.constant( + np.zeros(pipeline_config.huggingface_config.d_model), + pipeline_config.dtype, + ) + + wo = weights.attn_output.weight.allocate( + pipeline_config.dtype, + [ + pipeline_config.huggingface_config.d_model, + pipeline_config.huggingface_config.d_model, + ], + ) + bias_o = weights.self_attn.out_proj.bias.allocate( + pipeline_config.dtype, [pipeline_config.huggingface_config.d_model] + ) + return WhisperSdpaAttention( + n_heads=pipeline_config.huggingface_config.n_heads, + head_dim=pipeline_config.huggingface_config.d_model + // pipeline_config.huggingface_config.encoder_attention_heads, + wq=Linear(wq, bias=bias_q), + wk=Linear(wk, bias=bias_k), + wv=Linear(wv, bias=bias_v), + wo=Linear( + wo, + bias=bias_o, + ), + ) + + +def encoder( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> WhisperEncoder: + conv1 = conv1d( + dtype=pipeline_config.dtype, + in_channels=pipeline_config.huggingface_config.num_mel_bins, + kernel_size=3, + stride=1, + padding=1, + out_channels=pipeline_config.huggingface_config.d_model, + weights=weights.model.encoder.conv1, + ) + + conv2 = conv1d( + dtype=pipeline_config.dtype, + in_channels=pipeline_config.huggingface_config.d_model, + kernel_size=3, + stride=2, + padding=1, + out_channels=pipeline_config.huggingface_config.d_model, + weights=weights.model.encoder.conv2, + ) + + # TODO: Not sure how to handle this. It learns embeddings to a max size. + embed_positions = embedding( + dtype=pipeline_config.dtype, + max_source_positions=pipeline_config.huggingface_config.max_source_positions, + hidden_dim=pipeline_config.huggingface_config.d_model, + weights=weights.model.encoder.embed_positions, + ) + + # EncoderBlocks + # TODO: Which cache strategy to use? Will both Continuous and paged will work? + layers = [ + WhisperEncoderLayer( + attention=attention( + pipeline_config, + weights.language_model.model.layers[i], + layer_idx=ops.constant(i, DType.uint32), # type: ignore + ), + mlp=feed_forward( + pipeline_config.dtype, + pipeline_config.huggingface_config.d_model, + pipeline_config.huggingface_config.encoder_ffn_dim, + weights.model.encoder.layers[i], + ), + attention_norm=layer_norm( + dims=pipeline_config.huggingface_config.d_model, + eps=1e-5, + weights=weights.model.encoder.layers[i].self_attn_layer_norm, + ), + mlp_norm=layer_norm( + dims=pipeline_config.huggingface_config.d_model, + eps=1e-5, + weights=weights.model.encoder.layers[i].final_layer_norm, + ), + ) + for i in range(pipeline_config.huggingface_config.encoder_layers) + ] + + # Hugging Face model uses default eps for nn.LayerNorm which is = 1e-5 + norm = layer_norm( + dims=pipeline_config.huggingface_config.d_model, + eps=1e-5, + weights=weights.model.encoder.layer_norm, + ) + + return WhisperEncoder( + conv1=conv1, + conv2=conv2, + embed_positions=embed_positions, + layers=layers, + norm=norm, + all_logits=False, + ) + + +def build_graph( + pipeline_config: PipelineConfig, + weights: SafetensorWeights, +) -> Graph: + # Audio input_features. + input_features_type = TensorType( + DType.float32, + shape=["batch_size", "num_mel_bins", "sequence_length"], + ) + + # Initialize Graph. + with Graph( + "whisper_audio_encoder", + input_types=[ + input_features_type, + ], + ) as graph: + model = encoder(pipeline_config, weights) + input_features = graph.inputs[0] + outputs = model( + input_features=input_features.tensor, + ) + graph.output(*outputs) + return graph diff --git a/src/max/pipelines/architectures/whisper/model.py b/src/max/pipelines/architectures/whisper/model.py new file mode 100644 index 0000000000..9e1e49eed4 --- /dev/null +++ b/src/max/pipelines/architectures/whisper/model.py @@ -0,0 +1,81 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import logging +import time + +from max.driver import Tensor +from max.engine import InferenceSession, Model +from max.pipelines import ( + ModelInputs, + PipelineConfig, + PipelineModel, +) + +from .graph import build_graph + +logger = logging.getLogger("max.pipelines") + + +class WhisperInputs(ModelInputs): + """A class representing inputs for the Whisper model. + + input_features: + Float values mel features extracted from the raw speech waveform. + Raw speech waveform can be obtained by loading a `.flac` or `.wav` audio file into an array of type `List[float]` or a `numpy.ndarray`, *e.g.* viathe soundfile library (`pip install soundfile`). + To prepare the array into `input_features`, the [`AutoFeatureExtractor`] from the transformers library should be used for extracting the mel features, padding and conversion into a tensor of type `torch.FloatTensor`. See [`~WhisperFeatureExtractor.__call__`] + Shape = (batch_size, feature_size, sequence_length) + + decoder_input_ids: + Indices of decoder input sequence tokens in the vocabulary. Indices can be obtained using [`WhisperTokenizer`]. + Whisper uses the `decoder_start_token_id` as the starting token for `decoder_input_ids` generation. + Shape = (batch_size, target_sequence_length) + """ + + input_features: Tensor + decoder_input_ids: Tensor + + +class Whisper(PipelineModel): + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + super().__init__(pipeline_config, session) + self.model = self.load_model(session) + + def load_model( + self, + session: InferenceSession, + ) -> Model: + """ + Load the Whisper speech recognition model. + """ + self.weights = self.pipeline_config.load_weights() + + logger.info("Building and compiling Whisper encoder-decoder model...") + before = time.perf_counter() + graph = build_graph( + self.pipeline_config, + self.weights, # type: ignore + ) + model = session.load( + graph, weights_registry=self.weights.allocated_weights + ) + after = time.perf_counter() + logger.info( + f"Compiling Whisper model took {after - before:.6f} seconds" + ) + + return model diff --git a/src/max/pipelines/config.py b/src/max/pipelines/config.py new file mode 100644 index 0000000000..d254ca7c0b --- /dev/null +++ b/src/max/pipelines/config.py @@ -0,0 +1,1093 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Standardized config for Pipeline Inference.""" + +from __future__ import annotations + +import datetime +import glob +import json +import logging +import os +import struct +import time +from dataclasses import dataclass, field +from enum import Enum +from functools import cached_property +from pathlib import Path +from typing import Any, Optional, Union, cast + +import torch +from huggingface_hub import ( + HfFileSystem, + file_exists, + get_hf_file_metadata, + hf_hub_download, + hf_hub_url, + model_info, + repo_exists, +) +from huggingface_hub import constants as hf_hub_constants +from huggingface_hub.hf_api import ModelInfo +from huggingface_hub.utils import ( + EntryNotFoundError, + GatedRepoError, + HfHubHTTPError, + RepositoryNotFoundError, + RevisionNotFoundError, +) +from huggingface_hub.utils import tqdm as hf_tqdm +from max.driver import CPU, Accelerator, Device, DeviceSpec, accelerator_count +from max.dtype import DType +from max.graph.quantization import QuantizationConfig, QuantizationEncoding +from max.graph.weights import ( + GGUFWeights, + SafetensorWeights, + Weights, + WeightsAdapter, +) +from max.pipelines.kv_cache import KVCacheStrategy +from tqdm.contrib.concurrent import thread_map +from transformers import AutoConfig + +logger = logging.getLogger("max.pipelines") + + +class PipelineEngine(str, Enum): + MAX = "max" + HUGGINGFACE = "huggingface" + + +class SupportedEncoding(str, Enum): + """All possible encodings which may be supported by a particular model.""" + + float32 = "float32" + bfloat16 = "bfloat16" + q4_k = "q4_k" + q4_0 = "q4_0" + q6_k = "q6_k" + gptq = "gptq" + + def __repr__(self) -> str: + return self.name + + def __str__(self) -> str: + return self.name + + @classmethod + def parse_from_file_name(cls, name: str): + # TODO(AITLIB-127): Robustify detection of quantization encoding + name = name.lower() + if "f32" in name or "float32" in name: + return SupportedEncoding.float32 + elif "bf16" in name or "bfloat16" in name: + return SupportedEncoding.bfloat16 + elif "q4_k_m" in name: + return SupportedEncoding.q4_k + elif "q4_0" in name: + return SupportedEncoding.q4_0 + elif "q6_k" in name: + return SupportedEncoding.q6_k + elif "gptq" in name: + return SupportedEncoding.gptq + else: + return None + + @property + def quantization_encoding(self) -> Optional[QuantizationEncoding]: + if self not in _SUPPORTED_ENCODING_TO_QUANTIZATION_ENCODING: + raise ValueError( + f"SupportedEncoding({self}) does not have corresponding QuantizationEncoding." + ) + return _SUPPORTED_ENCODING_TO_QUANTIZATION_ENCODING[self] + + @property + def dtype(self) -> DType: + """The underlying model dtype associated with a quantization_encoding.""" + if self not in _SUPPORTED_ENCODING_TO_DTYPE: + raise ValueError( + f"SupportedEncoding({self}) does not have corresponding dtype." + ) + return _SUPPORTED_ENCODING_TO_DTYPE[self] + + @property + def cache_dtype(self) -> DType: + """The dtype that must be used in the kvcache for correctness.""" + if self not in _SUPPORTED_ENCODING_TO_CACHE_DTYPE: + raise ValueError( + f"SupportedEncoding({self}) does not have corresponding cache dtype." + ) + return _SUPPORTED_ENCODING_TO_CACHE_DTYPE[self] + + def supported_on(self, device_spec: DeviceSpec) -> bool: + """Returns whether this quantization encoding is supported on a device.""" + return device_spec.device_type in _SUPPORTED_DEVICES[self] + + +_SUPPORTED_ENCODING_TO_DTYPE = { + SupportedEncoding.float32: DType.float32, + SupportedEncoding.bfloat16: DType.bfloat16, + SupportedEncoding.q4_k: DType.uint8, + SupportedEncoding.q4_0: DType.uint8, + SupportedEncoding.q6_k: DType.uint8, + SupportedEncoding.gptq: DType.uint8, +} + + +_SUPPORTED_ENCODING_TO_CACHE_DTYPE = { + SupportedEncoding.float32: DType.float32, + SupportedEncoding.bfloat16: DType.bfloat16, + SupportedEncoding.q4_k: DType.float32, + SupportedEncoding.q4_0: DType.float32, + SupportedEncoding.q6_k: DType.float32, + SupportedEncoding.gptq: DType.bfloat16, +} + +_SUPPORTED_ENCODING_TO_QUANTIZATION_ENCODING = { + SupportedEncoding.float32: None, + SupportedEncoding.bfloat16: None, + SupportedEncoding.q4_k: QuantizationEncoding.Q4_K, + SupportedEncoding.q4_0: QuantizationEncoding.Q4_0, + SupportedEncoding.q6_k: QuantizationEncoding.Q6_K, + SupportedEncoding.gptq: QuantizationEncoding.GPTQ, +} + + +# Basic validation for supported devices for each type of encoding. +_SUPPORTED_DEVICES: dict[SupportedEncoding, tuple[str, ...]] = { + SupportedEncoding.float32: ("cpu", "gpu"), + SupportedEncoding.bfloat16: ("gpu",), + SupportedEncoding.q4_k: ("cpu",), + SupportedEncoding.q4_0: ("cpu",), + SupportedEncoding.q6_k: ("cpu",), + SupportedEncoding.gptq: ("gpu",), +} + + +class WeightsFormat(str, Enum): + gguf = "gguf" + safetensors = "safetensors" + pytorch = "pytorch" + + +class RepoType(str, Enum): + online = "online" + local = "local" + + +# Reference: https://github.com/ggerganov/llama.cpp/blob/eb5c3dc64bd967f2e23c87d9dec195f45468de60/src/llama.cpp#L20778 +class RopeType(str, Enum): + none = "none" + normal = "normal" + neox = "neox" + + +def _repo_exists_with_retry(repo_id: str) -> bool: + """ + Wrapper around huggingface_hub.repo_exists with retry logic. + Retries after 5, 30 and 60 seconds if we get a transient HTTP error. + + See huggingface_hub.repo_exists for details + """ + max_attempts = 3 + retry_delays_in_seconds = [ + 5, + 30, + 60, + ] + + for attempt, delay_in_seconds in enumerate(retry_delays_in_seconds): + try: + return repo_exists(repo_id) + except ( + RepositoryNotFoundError, + GatedRepoError, + RevisionNotFoundError, + EntryNotFoundError, + ) as e: + # Forward these specific errors to the user + logger.error(f"Hugging Face repository error: {str(e)}") + raise + except HfHubHTTPError as e: + if attempt == max_attempts - 1: + logger.error( + f"Failed to connect to Hugging Face Hub after {max_attempts} attempts: {str(e)}" + ) + raise + + logger.warning( + f"Transient Hugging Face Hub connection error (attempt {attempt + 1}/{max_attempts}): {str(e)}" + ) + logger.warning( + f"Retrying Hugging Face connection in {delay_in_seconds} seconds..." + ) + time.sleep(delay_in_seconds) + + assert False, ( + "This should never be reached due to the raise in the last attempt" + ) + + +@dataclass +class HuggingFaceRepo: + repo_id: str + trust_remote_code: bool = False + repo_type: Optional[RepoType] = None + + def __post_init__(self) -> None: + # Get repo type. + if not self.repo_type: + if os.path.exists(self.repo_id): + self.repo_type = RepoType.local + else: + self.repo_type = RepoType.online + + if self.repo_type == RepoType.online and not _repo_exists_with_retry( + self.repo_id + ): + raise ValueError(f"model_path: {self.repo_id} does not exist") + + def __str__(self) -> str: + return self.repo_id + + def __repr__(self) -> str: + return self.repo_id + + @cached_property + def info(self) -> ModelInfo: + if self.repo_type == RepoType.local: + raise ValueError( + "using model info, on local repos is not supported." + ) + elif self.repo_type == RepoType.online: + return model_info(self.repo_id, files_metadata=False) + else: + raise ValueError(f"Unsupported repo type: {self.repo_type}") + + @cached_property + def weight_files(self) -> dict[WeightsFormat, list[str]]: + safetensor_search_pattern = "*.safetensors" + gguf_search_pattern = "*.gguf" + pytorch_search_pattern = "*.bin" + + weight_files = {} + if self.repo_type == RepoType.local: + safetensor_paths = glob.glob( + os.path.join(self.repo_id, safetensor_search_pattern) + ) + gguf_paths = glob.glob( + os.path.join(self.repo_id, gguf_search_pattern) + ) + pytorch_paths = glob.glob( + os.path.join(self.repo_id, pytorch_search_pattern) + ) + elif self.repo_type == RepoType.online: + fs = HfFileSystem() + safetensor_paths = cast( + list[str], + fs.glob(f"{self.repo_id}/{safetensor_search_pattern}"), + ) + gguf_paths = cast( + list[str], + fs.glob(f"{self.repo_id}/{gguf_search_pattern}"), + ) + pytorch_paths = cast( + list[str], + fs.glob(f"{self.repo_id}/{pytorch_search_pattern}"), + ) + else: + raise ValueError(f"Unsupported repo type: {self.repo_type}") + + if safetensor_paths: + if len(safetensor_paths) == 1: + # If there is only one weight allow any name. + weight_files[WeightsFormat.safetensors] = [ + safetensor_paths[0].replace(f"{self.repo_id}/", "") + ] + else: + # If there is more than one weight, ignore consolidated tensors. + weight_files[WeightsFormat.safetensors] = [ + f.replace(f"{self.repo_id}/", "") + for f in safetensor_paths + if "consolidated" not in f + ] + + if gguf_paths: + weight_files[WeightsFormat.gguf] = [ + f.replace(f"{self.repo_id}/", "") for f in gguf_paths + ] + + if pytorch_paths: + weight_files[WeightsFormat.pytorch] = [ + f.replace(f"{self.repo_id}/", "") for f in pytorch_paths + ] + + return weight_files + + def size_of(self, filename: str) -> Union[int, None]: + if self.repo_type == RepoType.online: + url = hf_hub_url(self.repo_id, filename) + metadata = get_hf_file_metadata(url) + return metadata.size + raise NotImplementedError("not implemented for non-online repos.") + + @cached_property + def supported_encodings(self) -> list[SupportedEncoding]: + # TODO(AITLIB-128): Detection of supported encodings in weights can be cleaned up + supported_encodings = set([]) + + # Parse gguf file names. + for gguf_path in self.weight_files.get(WeightsFormat.gguf, []): + encoding = SupportedEncoding.parse_from_file_name(gguf_path) + if encoding: + supported_encodings.add(encoding) + + # Get Safetensor Metadata. + if WeightsFormat.safetensors in self.weight_files: + if self.repo_type == RepoType.local: + # Safetensor repos are assumed to only have one encoding in them. + with open( + os.path.join( + self.repo_id, + self.weight_files[WeightsFormat.safetensors][0], + ), + "rb", + ) as file: + # Read the first 8 bytes of the file + length_bytes = file.read(8) + # Interpret the bytes as a little-endian unsigned 64-bit integer + length_of_header = struct.unpack(" dict[WeightsFormat, list[Path]]: + files = [] + for gguf_file in self.weight_files.get(WeightsFormat.gguf, []): + file_encoding = SupportedEncoding.parse_from_file_name(gguf_file) + if file_encoding == encoding: + files.append(Path(gguf_file)) + + if files: + return {WeightsFormat.gguf: files} + else: + return {} + + def _get_safetensor_files_for_encoding( + self, encoding: SupportedEncoding + ) -> dict[WeightsFormat, list[Path]]: + if ( + WeightsFormat.safetensors in self.weight_files + and encoding == self.supported_encodings[0] + ): + return { + WeightsFormat.safetensors: [ + Path(f) + for f in self.weight_files[WeightsFormat.safetensors] + ] + } + + return {} + + def _get_pytorch_files_for_encoding( + self, encoding: SupportedEncoding + ) -> dict[WeightsFormat, list[Path]]: + if ( + WeightsFormat.pytorch in self.weight_files + and encoding == self.supported_encodings[0] + ): + return { + WeightsFormat.pytorch: [ + Path(f) for f in self.weight_files[WeightsFormat.pytorch] + ] + } + + return {} + + def files_for_encoding( + self, + encoding: SupportedEncoding, + weights_format: Optional[WeightsFormat] = None, + alternate_encoding: Optional[SupportedEncoding] = None, + ) -> dict[WeightsFormat, list[Path]]: + if weights_format == WeightsFormat.pytorch: + logger.warning( + "cannot infer encoding from .bin files, returning all bin files" + ) + return self._get_pytorch_files_for_encoding(encoding) + + if weights_format is WeightsFormat.gguf: + return self._get_gguf_files_for_encoding(encoding) + elif weights_format == WeightsFormat.safetensors: + return self._get_safetensor_files_for_encoding(encoding) + + gguf_files = self._get_gguf_files_for_encoding(encoding) + + safetensor_files = self._get_safetensor_files_for_encoding(encoding) + gguf_files.update(safetensor_files) + + pytorch_files = self._get_pytorch_files_for_encoding(encoding) + gguf_files.update(pytorch_files) + + if not gguf_files and alternate_encoding: + logger.warning( + "Could not find checkpoint with %s encoding, searching for %s files instead.", + encoding, + alternate_encoding, + ) + return self.files_for_encoding(alternate_encoding, weights_format) + return gguf_files + + def file_exists(self, filename: str) -> bool: + return file_exists(self.repo_id, filename) + + def download(self, filename: str, force_download: bool = False) -> Path: + return Path( + hf_hub_download( + self.repo_id, filename, force_download=force_download + ) + ) + + @property + def formats_available(self) -> list[WeightsFormat]: + return list(self.weight_files.keys()) + + def encoding_for_file(self, file: Union[str, Path]) -> SupportedEncoding: + if str(file).endswith(".safetensors"): + # If this file is safetensors, return the first encoding, as Safetensor repos can only have one. + return self.supported_encodings[0] + elif str(file).endswith(".gguf"): + encoding = SupportedEncoding.parse_from_file_name(str(file)) + if encoding: + return encoding + + raise ValueError( + f"gguf file, but encoding not found in file name: {file}" + ) + elif str(file).endswith(".bin"): + # If this file is pytorch, return the first encoding, as Pytorch repos only likely have one. + return self.supported_encodings[0] + else: + raise ValueError( + f"weight path: {file} not gguf or safetensors, cannot infer encoding from file." + ) + + +@dataclass +class SamplingParams: + top_k: int + enable_structured_output: bool + in_dtype: DType + out_dtype: DType + + +def _scan_available_devices() -> list[DeviceSpec]: + accel_count = accelerator_count() + if accel_count == 0: + return [DeviceSpec.cpu()] + else: + return [DeviceSpec.accelerator(i) for i in range(accel_count)] + + +@dataclass(frozen=False) +class PipelineConfig: + # When adding a new config parameter here, please remember to add a + # description to the `help()` method below + + # NOTE: model_path is made a str of "" by default, to avoid having + # it be Optional to check for None and then littering the codebase with + # asserts just to keep mypy happy. + model_path: str = "" + """repo_id of a Hugging Face model repository to use.""" + + huggingface_repo_id: str = "" + """DEPRECATED: repo_id of a Hugging Face model repository to use. Use `model_path` instead.""" + + huggingface_revision: str = hf_hub_constants.DEFAULT_REVISION + """Branch or Git revision of Hugging Face model repository to use.""" + + engine: Optional[PipelineEngine] = None + """Engine backend to use for serving, 'max' for the max engine, or 'huggingface' as fallback option for improved model coverage.""" + + architecture: Optional[str] = None + """Model architecture to run.""" + + weight_path: list[Path] = field(default_factory=list) + """Optional path or url of the model weights to use.""" + + device_specs: list[DeviceSpec] = field( + default_factory=_scan_available_devices + ) + """Devices to run inference upon. This option is not documented in help() as it shouldn't be used directly via the CLI entrypoint.""" + + quantization_encoding: Optional[SupportedEncoding] = None + """Weight encoding type.""" + + serialized_model_path: Optional[str] = None + """If specified, tries to load a serialized model from this path.""" + + save_to_serialized_model_path: Optional[str] = None + """If specified, tries to save a serialized model to this path.""" + + max_length: Optional[int] = None + """Maximum sequence length of the model.""" + + max_new_tokens: int = -1 + """Maximum number of new tokens to generate during a single inference pass of the model.""" + + max_batch_size: Optional[int] = None + """Maximum batch size to execute with the model. + This is set to one, to minimize memory consumption for the base case, in which a person is + running a local server to test out MAX. For users launching in a server scenario, the expectation + is that this value should be set higher based on server capacity.""" + + max_ce_batch_size: int = 32 + """Maximum cache size to reserve for a single context encoding batch. + The actual limit is the lesser of this and `max_batch_size`.""" + + enable_chunked_prefill: bool = True + """Enable chunked prefill to split context encoding requests into multiple chunks + based on 'target_num_new_tokens'.""" + + enable_in_flight_batching: bool = False + """When enabled, prioritizes token generation by batching it with context + encoding requests. Requires chunked prefill.""" + + cache_strategy: KVCacheStrategy = KVCacheStrategy.MODEL_DEFAULT + """The cache strategy to use. This defaults to `model_default`, which will set the cache + strategy based on the default strategy for the architecture requested. + + You can also force the engine to use a specific caching strategy: `naive` | `continuous` | `paged`. + """ + + max_num_steps: int = -1 + """The number of steps to run for multi-step scheduling. -1 specifies a default value based on + configuration and platform. Ignored for models which are not auto-regressive (e.g. embedding + models).""" + + pad_to_multiple_of: int = 2 + """Pad input tensors to be a multiple of value provided.""" + + kv_cache_page_size: int = 128 + """The number of tokens in a single page in the paged KVCache.""" + + enable_prefix_caching: bool = False + """Whether to enable prefix caching for the paged attention KVCache.""" + + device_memory_utilization: float = 0.9 + """The fraction of available device memory that the process should consume. + + This is used to inform the size of the KVCache workspace: + kv_cache_workspace = (total_free_memory * device_memory_utilization) - model_weights_size + """ + + target_num_new_tokens: Optional[int] = None + """The target number of un-encoded tokens to include in each batch. + If not set, this will be set to a best-guess optimal value based on model, hardware, and available memory.""" + + top_k: int = 1 + """Limits the sampling to the K most probable tokens. This defaults to 1, which enables greedy sampling.""" + + enable_structured_output: bool = False + """Enable structured generation/guided decoding for the server. This allows the user to pass a json + schema in the response_format field, which the LLM will adhere to.""" + + trust_remote_code: bool = False + """Whether or not to allow for custom modelling files on Hugging Face.""" + + force_download: bool = False + """Whether to force download a given file if it's already present in the local cache.""" + + enable_echo: bool = False + """Whether the model should be built with echo capabilities.""" + + rope_type: Optional[RopeType] = None + """Force using a specific rope type: `none` | `normal` | `neox`. Only matters for GGUF weights.""" + + pool_embeddings: bool = True + """Whether to pool embedding outputs.""" + + _huggingface_config: Optional[AutoConfig] = None + """The Hugging Face config associated with the `model-path`.""" + + _devices: list[Device] = field(default_factory=list) + """The underlying initialized devices, created by the specific `device_specs`.""" + + _weight_adapters: dict[WeightsFormat, WeightsAdapter] = field( + default_factory=dict + ) + """Weight adapter for the provided `weight_path`.""" + + _weights_repo_id: Optional[str] = None + """Hugging Face repo id to load weights from only. This should only be set by internal code.""" + + _available_cache_memory: Optional[int] = None + """The amount of available cache memory in bytes. This should only be set by internal code.""" + + _quant_config: Optional[QuantizationConfig] = None + """Optional config for specifying quantization parameters. This should only be set by internal code.""" + + max_cache_batch_size: Optional[int] = None + """DEPRECATED: The maximum cache batch size to use for the model. Use max_batch_size instead.""" + + gpu_profiling: str = os.environ.get("MODULAR_ENABLE_PROFILING", "false") + """Whether to enable GPU profiling of the model.""" + + use_experimental_kernels: str = os.environ.get( + "USE_EXPERIMENTAL_KERNELS", "false" + ) + + def __post_init__(self) -> None: + # Validate if a provided max_length is non-negative. + if self.max_length is not None and self.max_length < 0: + raise ValueError("max_length must be non-negative.") + + if self.huggingface_repo_id != "": + logger.warning( + "--huggingface-repo-id is deprecated, use `--model-path` instead. This setting will stop working in a future release." + ) + self.model_path = self.huggingface_repo_id + + if self.max_cache_batch_size is not None: + logger.warning( + "--max-cache-batch-size is deprecated, use `--max-batch-size` instead. This setting will stop working in a future release." + ) + self.max_batch_size = self.max_cache_batch_size + + # Validate that if weight_paths are passed as strings, they are converted to Path. + if isinstance(self.weight_path, tuple): + self.weight_path = list(self.weight_path) + elif not isinstance(self.weight_path, list): + self.weight_path = [self.weight_path] + weight_paths = [] + # Validate that if weight_paths are passed as strings, they are converted to Path. + for path in self.weight_path: + if isinstance(path, str): + path = Path(path) + elif not isinstance(path, Path): + raise ValueError( + "weight_path provided must either be string or Path:" + f" '{path}'" + ) + elif path.is_file(): + # If we already exist on the OS. Dont parse the path, just continue. + weight_paths.append(path) + continue + + # If the path, looks like it may start with a Hugging Face repo id, + # check if the repo_id is the same as the one provided. + # If it is the same, set the weight_path to just be the file_name post repo_id + # If it is different, set the _weights_repo_id to be that repo_id + # and set the path to be the file_name without the repo_id. + if path_pieces := str(path).split("/"): + if len(path_pieces) >= 3: + repo_id = f"{path_pieces[0]}/{path_pieces[1]}" + file_name = "/".join(path_pieces[2:]) + if self.model_path != "" and repo_id == self.model_path: + path = Path(file_name) + elif file_exists(repo_id, file_name): + self._weights_repo_id = repo_id + path = Path(file_name) + elif self.model_path == "": + raise ValueError( + "Unable to derive model_path from weight_path, " + "please provide a valid Hugging Face repository id." + ) + + weight_paths.append(path) + + self.weight_path = weight_paths + + # If we cannot infer the weight path, we lean on the model_path + # to provide it. + if len(self.weight_path) == 0: + if self.model_path == "": + raise ValueError( + "model_path must be provided and must be a valid Hugging Face repository" + ) + elif (not os.path.exists(self.model_path)) and ( + not _repo_exists_with_retry(self.model_path) + ): + raise ValueError( + f"{self.model_path} is not a valid Hugging Face repository" + ) + elif self.model_path == "" and self._weights_repo_id is not None: + # weight_path is used and we should derive the repo_id from it. + # At this point, we should have a resolved weight path - be it local or remote HF. + # weight_path should not be used directly anymore. + self.model_path = self._weights_repo_id + + # Set sensible defaults. These are platform-specific. + if self.max_num_steps < 0: + if ( + self.enable_structured_output + or self.device_specs[0] == DeviceSpec.cpu() + ): + self.max_num_steps = 1 + else: + self.max_num_steps = 10 + + if self.max_num_steps > 1 and self.enable_structured_output: + raise ValueError( + "max_num_steps > 1 not supported when enable_structured_output = True" + ) + + if self.enable_structured_output: + if self.device_specs[0] == DeviceSpec.cpu(): + raise ValueError( + "enable_structured_output is not currently supported on CPU." + ) + + if self.gpu_profiling not in ( + "false", + "off", + "no", + "0", + "true", + "on", + "yes", + "1", + "detailed", + ): + raise ValueError("gpu_profiling must be a boolean or 'detailed'") + + def __getstate__(self) -> dict[str, Any]: + """Override `__getstate__` to exclude the Hugging Face config.""" + state = self.__dict__.copy() + state.pop("_huggingface_config") + state["_devices"] = [] + return state + + @property + def graph_quantization_encoding(self) -> Optional[QuantizationEncoding]: + """Converts the CLI encoding to a MAX graph quantization encoding. + + Returns: + The graph quantization encoding corresponding to the CLI encoding. + + Raises: + ValueError: If no CLI encoding was specified. + """ + if self.quantization_encoding is None: + raise ValueError( + "can't convert `None` CLI encoding to graph quantization encoding" + ) + + return self.quantization_encoding.quantization_encoding + + def finalize_encoding_config(self): + """Depending on the encoding picked, we get some more parameters from the hf config""" + if self.quantization_encoding == SupportedEncoding.gptq: + hf_config = self.huggingface_config + hf_quant_config = hf_config.quantization_config + self._quant_config = QuantizationConfig( + quant_method=hf_quant_config["quant_method"], + bits=hf_quant_config["bits"], + group_size=hf_quant_config["group_size"], + desc_act=hf_quant_config["desc_act"], + sym=hf_quant_config["sym"], + ) + + def update_architecture(self) -> None: + if self.architecture is None: + # Retrieve architecture from model_path. + # This is done without using the huggingface config, to reduce the + # memory stored in this object, before it reaches the model worker. + hf_config = AutoConfig.from_pretrained( + self.model_path, + trust_remote_code=self.trust_remote_code, + ) + + # If we cannot get an architecture from the model_path, + # we cannot map the model to an internal architecture, and cannot + # be run using the MAX engine. + + architectures = getattr(hf_config, "architectures", None) + if architectures: + if len(architectures) > 1: + logger.warning( + "more than one architecture listed in Hugging Face config," + " using the first one." + ) + self.architecture = architectures[0] + else: + logger.warning( + "architectures not listed in Hugging Face config, trying with general `huggingface` engine" + ) + + self.engine = PipelineEngine.HUGGINGFACE + + @property + def huggingface_config(self) -> AutoConfig: + """Given the model_path, return the Hugging Face Config.""" + if self._huggingface_config is None: + # Lazy initialize the Hugging Face config field. + self._huggingface_config = AutoConfig.from_pretrained( + self.model_path, + trust_remote_code=self.trust_remote_code, + ) + assert self._huggingface_config is not None, ( + "Failed to load Hugging Face config" + ) + + return self._huggingface_config + + @property + def dtype(self) -> DType: + if self.quantization_encoding is None: + raise ValueError( + "quantization_encoding must be provided to infer dtype." + ) + + return self.quantization_encoding.dtype + + @property + def cache_dtype(self) -> DType: + if self.quantization_encoding is None: + raise ValueError( + "quantization_encoding must be provided to infer cache dtype." + ) + + return self.quantization_encoding.cache_dtype + + @property + def devices(self) -> list[Device]: + """Initialize and return a list of devices, given a list of device specs.""" + if self._devices: + return self._devices + num_devices_available = accelerator_count() + for device_spec in self.device_specs: + if device_spec.id >= num_devices_available: + msg = f"Device {device_spec.id} was requested but " + if num_devices_available == 0: + msg += "no devices were found." + else: + msg += f"only found {num_devices_available} devices." + raise ValueError(msg) + self._devices.append( + CPU(device_spec.id) + if device_spec.device_type == "cpu" + else Accelerator(device_spec.id) + ) + return self._devices + + @property + def weights_format(self) -> WeightsFormat: + """Identify which format our weights are expected in.""" + + if not self.weight_path: + raise ValueError( + "no weight_path provided cannot infer weights format." + ) + + # Get all weight paths. + if all( + [weight_path.suffix == ".gguf" for weight_path in self.weight_path] + ): + return WeightsFormat.gguf + elif all( + [ + weight_path.suffix == ".safetensors" + for weight_path in self.weight_path + ] + ): + return WeightsFormat.safetensors + elif all( + [weight_path.suffix == ".bin" for weight_path in self.weight_path] + ): + return WeightsFormat.pytorch + else: + raise ValueError( + f"weights type cannot be inferred from {self.weight_path}" + ) + + def weights_size(self) -> int: + size = 0 + hf_repo = HuggingFaceRepo( + ( + self._weights_repo_id + if self._weights_repo_id + else self.model_path + ), + trust_remote_code=self.trust_remote_code, + ) + for file_path in self.weight_path: + if os.path.exists(file_path): + size += os.path.getsize(file_path) + continue + + next_size = hf_repo.size_of(str(file_path)) + + if next_size is None: + raise ValueError( + f"Failed to get size of weight file {file_path}" + ) + size += next_size + + return size + + def download_weights(self) -> None: + # Try to load locally. + if all([os.path.exists(file_path) for file_path in self.weight_path]): + logger.info("All files exist locally, skipping download.") + return + + start_time = datetime.datetime.now() + weights_repo_id = ( + self._weights_repo_id if self._weights_repo_id else self.model_path + ) + logger.info(f"Starting download of model: {weights_repo_id}") + # max_workers=8 setting copied from default for + # huggingface_hub.snapshot_download. + self.weight_path = list( + thread_map( + lambda filename: Path( + hf_hub_download( + weights_repo_id, + str(filename), + revision=self.huggingface_revision, + force_download=self.force_download, + ) + ), + self.weight_path, + max_workers=8, + tqdm_class=hf_tqdm, + ) + ) + + logger.info( + f"Finished download of model: {weights_repo_id} in {(datetime.datetime.now() - start_time).total_seconds()} seconds." + ) + + def load_weights(self) -> Weights: + self.download_weights() + + if self.weights_format == WeightsFormat.gguf: + if len(self.weight_path) > 1: + raise ValueError("loading multiple gguf files is not supported") + return GGUFWeights(self.weight_path[0]) + + elif self.weights_format == WeightsFormat.safetensors: + return SafetensorWeights(self.weight_path) + + else: + raise ValueError( + f"loading weights format '{self.weights_format}' not supported" + ) + + @staticmethod + def help() -> dict[str, str]: + return { + "model_path": "Specify the repository ID of a Hugging Face model repository to use. This is used to load both Tokenizers, architectures and model weights.", + "huggingface_repo_id": "DEPRECATED: Use `model_path` instead.", + "huggingface_revision": "Branch or Git revision of Hugging Face model repository to use.", + "engine": "Specify the engine backend to use for serving the model. Options include `max` for the MAX engine, or `huggingface` as a fallback option that provides improved model coverage.", + "architecture": "Deprecated - Please set `model-path` instead. Define the model architecture to run. This should match one of the supported architectures for your selected engine.", + "weight_path": "Provide an optional local path or path relative to the root of a Hugging Face repo to the model weights you want to use. This allows you to specify custom weights instead of using defaults. You may pass multiple, ie. `--weight-path=model-00001-of-00002.safetensors --weight-path=model-00002-of-00002.safetensors`", + "quantization_encoding": "Define the weight encoding type for quantization. This can help optimize performance and memory usage during inference. ie. q4_k, bfloat16 etc.", + "serialized_model_path": "If specified, this flag attempts to load a serialized MEF model from the given path. This is useful for reusing previously saved models.", + "save_to_serialized_model_path": "If specified, this flag attempts to save the current model state to a serialized format at the given path for later use.", + "max_length": "Set the maximum sequence length for input data processed by the model. This must be less than the value specified in the Hugging Face configuration file. The default is derived from the Hugging Face configuration value. Larger values may consume more memory.", + "max_new_tokens": "Specify the maximum number of new tokens to generate during a single inference pass of the model. Default is -1, which means the model will generate until the maximum sequence length is hit, or and eos token is generated.", + "max_batch_size": "Define the maximum cache size reserved for a single batch. This value defaults to 1. Increase this value based on server capacity when deploying in production.", + "max_ce_batch_size": "Set the maximum cache size reserved for a single context encoding batch. The effective limit will be the lesser of this value and `max-cache-batch-size`. Default is 32.", + "enable_chunked_prefill": "Enable chunked prefill to split context encoding requests into multiple chunks based on `target-num-new-tokens`", + "enable_in_flight_batching": "When enabled, prioritizes token generation by batching it with context encoding requests. Requires chunked prefill.", + "max_cache_batch_size": "DEPRECATED: Use `max_batch_size` instead.", + "cache_strategy": "Force a specific cache strategy: 'naive' or 'continuous'. If not provided, the optimal caching strategy for the model requested will be selected.", + "rope_type": "Force using a specific rope type, `none` | `normal' | `nexo`. Only matters for GGUF weights.", + "max_num_steps": "Specify the number of steps to run for multi-step scheduling during inference. Default is set to 1.", + "pad_to_multiple_of": "Pad input tensors to be a multiple of value provided. Default is set to 2.", + "kv_cache_page_size": "The number of tokens in a single page in the paged KVCache. Default is set to 512.", + "enable_prefix_caching": "Whether to enable prefix caching for the paged attention KVCache. This defaults to false.", + "enable_structured_output": "Whether to enable constrained decoding in the text generation pipeline. This defaults to false.", + "device_memory_utilization": "The fraction of available device memory that the process should consume. This is used to inform the size of the KVCache workspace: kv_cache_workspace = (total_free_memory * device_memory_utilization) - model_weights_size. Default is set to 0.9.", + "top_k": "Limit sampling to the top K most probable tokens during generation. This can help control randomness and improve output quality. This defaults to 1, which defaults to greedy sampling.", + "trust_remote_code": "Indicate whether to allow custom modelling files from Hugging Face repositories. Set this to true with caution, as it may introduce security risks.", + "force_download": "Specify whether to forcefully download a file even if it already exists in local cache. Set this to true if you want to ensure you have the latest version.", + "enable_echo": "Whether the model should be built with echo capabilities. This defaults to false.", + "gpu_profiling": "Whether to enable GPU profiling of the model. This defaults to false.", + } + + def huggingface_weights_repo(self) -> HuggingFaceRepo: + return HuggingFaceRepo( + ( + self._weights_repo_id + if self._weights_repo_id + else self.model_path + ), + trust_remote_code=self.trust_remote_code, + ) + + @cached_property + def sampling_params(self) -> SamplingParams: + return SamplingParams( + top_k=self.top_k, + enable_structured_output=self.enable_structured_output, + in_dtype=DType.float32, + out_dtype=DType.float32, + ) diff --git a/src/max/pipelines/context.py b/src/max/pipelines/context.py new file mode 100644 index 0000000000..6390eb4403 --- /dev/null +++ b/src/max/pipelines/context.py @@ -0,0 +1,294 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Standardized context object for Pipeline Inference.""" + +from __future__ import annotations + +from typing import Any, Optional, Protocol, Sequence, Union, runtime_checkable + +import numpy as np + +CHUNK_SIZE = 128 + + +@runtime_checkable +class InputContext(Protocol): + """A base class for model contexts, represent model inputs for TokenGenerators.""" + + @property + def cache_seq_id(self) -> int: ... + + @property + def active_idx(self) -> int: ... + + @property + def start_idx(self) -> int: ... + + @property + def end_idx(self) -> int: ... + + @property + def current_length(self) -> int: + """The current length of the sequence, including completed and active tokens.""" + ... + + @property + def max_length(self) -> int | None: + """The maximum length of this sequence.""" + ... + + @property + def log_probabilities(self) -> int: + """When > 0, returns the log probabilities for the top N tokens for each + element token in the sequence.""" + ... + + @property + def log_probabilities_echo(self) -> bool: + """When True, the input tokens are added to the returned logprobs.""" + ... + + @property + def active_length(self) -> int: + """Current sequence length: num tokens input this iteration. + + This will be the prompt size for context encoding, and simply 1 for + token generation. + """ + ... + + @property + def next_tokens(self) -> np.ndarray: + """The next prompt tokens to be input during this iteration. + + This should be a 1D array of tokens of length active_length. + """ + ... + + def update( + self, + new_token: int, + ) -> None: + """Updates the next_tokens and extends existing tokens to include all generated tokens.""" + ... + + def bump_token_indices( + self, + start_idx: Optional[int] = None, + active_idx: Optional[int] = None, + end_idx: Optional[int] = None, + ) -> None: + """Update the start_idx, active_idx and end_idx without manipulating the token array.""" + ... + + @property + def matcher(self) -> Optional["xgr.GrammarMatcher"]: # type: ignore + """An optional xgr Grammar Matcher provided when using structured output.""" + ... + + @property + def json_schema(self) -> str | None: + """A json schema to use during constrained decoding.""" + ... + + def set_matcher(self, matcher: "xgr.GrammarMatcher") -> None: # type: ignore + """Set a grammar matcher for use during constrained decoding.""" + ... + + def reset(self) -> None: + """Resets the context's state by combining all tokens into a new prompt. + This method is used when a request is evicted, meaning that the context + needed to be re-encoded in the following CE iteration.""" + ... + + +class TextContext: + """A base class for model context, specifically for Text model variants.""" + + def __init__( + self, + cache_seq_id: int, + prompt: Union[str, Sequence[int]], + max_length: int | None, + tokens: np.ndarray, + log_probabilities: int = 0, + log_probabilities_echo: bool = False, + json_schema: str | None = None, + ) -> None: + self.cache_seq_id = cache_seq_id + self.prompt = prompt + self.max_length = max_length + + if tokens.ndim != 1: + msg = f"tokens must be one dimensional array: got shape '{tokens.shape}'" + raise ValueError(msg) + + self.size = int(np.ceil(len(tokens) / CHUNK_SIZE) * CHUNK_SIZE) + + # Create a fresh array since the input tokens may be a view or share memory with + # another array in the caller, which prevents us from resizing it directly. + # The extra space is initialized to zero and will be filled with generated tokens. + assert len(tokens) <= self.size + self.tokens = np.zeros(self.size, dtype=tokens.dtype) + self.tokens[: len(tokens)] = tokens + + self._active_idx = len(tokens) + self._start_idx = 0 + self._end_idx = self._active_idx + + self.log_probabilities = log_probabilities + self.log_probabilities_echo = log_probabilities_echo + + self.matcher = None + self.json_schema = json_schema + self.is_initial_prompt = True + + @property + def start_idx(self) -> int: + return self._start_idx + + @property + def active_idx(self) -> int: + return self._active_idx + + @property + def end_idx(self) -> int: + return self._end_idx + + def set_matcher(self, matcher: "xgr.GrammarMatcher") -> None: # type: ignore + self.matcher = matcher + + @property + def current_length(self) -> int: + """The current length of the sequence, including completed and active tokens.""" + return self._end_idx + + @property + def active_length(self) -> int: + """Current sequence length: num tokens input this iteration. + + This will be the prompt size for context encoding, and simply 1 (or more) for + token generation. + """ + return self._active_idx - self._start_idx + + def bump_token_indices( + self, + start_idx: Optional[int] = None, + active_idx: Optional[int] = None, + end_idx: Optional[int] = None, + ) -> None: + """Update the start_idx, active_idx and end_idx without manipulating the token array.""" + new_start_idx = (start_idx if start_idx else 0) + self._start_idx + new_active_idx = (active_idx if active_idx else 0) + self._active_idx + new_end_idx = (end_idx if end_idx else 0) + self._end_idx + + if new_start_idx >= new_active_idx: + msg = f""" + active_idx must always be greater than start_idx, unable to bump token indices + as new start_idx ({new_start_idx}) is greater than new active_idx ({new_active_idx}). + """ + raise ValueError(msg) + + if new_active_idx > new_end_idx: + msg = f""" + end_idx must always be greater than active_idx, unable to bump token indices + as new active_idx ({new_active_idx}) is greater than new end_idx ({new_end_idx}). + """ + raise ValueError(msg) + + self._start_idx = new_start_idx + self._active_idx = new_active_idx + self._end_idx = new_end_idx + + @property + def next_tokens(self) -> np.ndarray: + return self.tokens[self._start_idx : self._active_idx] + + def update( + self, + new_token: int, + ) -> None: + """Updates the next_tokens and extends existing tokens to include all generated tokens.""" + # This is required for chunked prefill. + # The scheduler will update the active_idx via bump_token_indices and pass through the model + # To accomodate for this, if we identify that the active_idx is not at the end of the completed + # token array, we only update the start_idx and active_idx, leaving the token array alone. + if self._active_idx < self._end_idx: + self._start_idx = self._active_idx + self._active_idx = self._end_idx + return + + if self._end_idx >= self.size: + self.size += CHUNK_SIZE + if self.tokens.flags.owndata: + self.tokens.resize(self.size) + else: + self.tokens = np.resize(self.tokens, self.size) + + self.tokens[self._active_idx] = new_token + self._start_idx = self._active_idx + self._active_idx += 1 + self._end_idx += 1 + + # Accept the token, and move the FSM for constrained decoding forward. + if self.matcher: + assert self.matcher.accept_token(new_token) + + self.is_initial_prompt = False + + def reset(self) -> None: + """Resets the context's state by combining all tokens into a new prompt.""" + self._start_idx = 0 + + self.is_initial_prompt = True + + +class TextAndVisionContext(TextContext): + """A base class for model context, specifically for Vision model variants.""" + + def __init__( + self, + cache_seq_id: int, + prompt: Union[str, Sequence[int]], + max_length: int | None, + tokens: np.ndarray, + pixel_values: Union[np.ndarray, list[np.ndarray]], + extra_model_args: dict[str, Any], + log_probabilities: int = 0, + log_probabilities_echo: bool = False, + json_schema: str | None = None, + ) -> None: + super().__init__( + cache_seq_id=cache_seq_id, + prompt=prompt, + max_length=max_length, + tokens=tokens, + log_probabilities=log_probabilities, + log_probabilities_echo=log_probabilities_echo, + json_schema=json_schema, + ) + self.pixel_values = pixel_values + self.extra_model_args = extra_model_args + + def update( + self, + new_token: int, + ) -> None: + """Updates the next_tokens and extends existing tokens to include all generated tokens.""" + super().update(new_token=new_token) + + # Update context not to re-encode the same image in next steps. There are no image tokens + # expected after context encoding. + self.pixel_values = [] diff --git a/src/max/pipelines/dataprocessing/__init__.py b/src/max/pipelines/dataprocessing/__init__.py new file mode 100644 index 0000000000..52a3d7df46 --- /dev/null +++ b/src/max/pipelines/dataprocessing/__init__.py @@ -0,0 +1,30 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .causal_attention_mask import causal_attention_mask +from .causal_attention_mask_with_alibi import causal_attention_mask_with_alibi +from .collate_batch import ( + PaddingDirection, + batch_padded_tokens_and_mask, + collate_batch, +) +from .max_tokens_to_generate import max_tokens_to_generate + +__all__ = [ + "causal_attention_mask", + "causal_attention_mask_with_alibi", + "collate_batch", + "batch_padded_tokens_and_mask", + "PaddingDirection", + "max_tokens_to_generate", +] diff --git a/src/max/pipelines/dataprocessing/causal_attention_mask.py b/src/max/pipelines/dataprocessing/causal_attention_mask.py new file mode 100644 index 0000000000..a882007aaa --- /dev/null +++ b/src/max/pipelines/dataprocessing/causal_attention_mask.py @@ -0,0 +1,67 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import math + +import numpy as np + + +def causal_attention_mask( + original_start_pos: list[int], + original_seq_len: list[int], + pad_to_multiple_of: int = 1, +) -> np.ndarray: + # Each example in the batch has a "start position", which is the length + # of the previously encoded tokens ("context"), and a "sequence length", + # which is the number of additional tokens to be encoded in this pass. + # + # "Causal attention" means that each token can "see" tokens before it, + # as well as itself. + # The attention layer adds the mask to the attention scores and then + # performs a softmax, so for tokens that a given token can "see" the mask + # wants to produce a 0, meaning to pass the attention through as normal, + # and for tokens that can't be "seen" the mask should produce -inf, which + # will result in them being functionally ignored after the softmax operation. + # + # We call the total length "post_seq_len", referring to the total context + # length after this pass concludes. + start_pos: np.ndarray = np.array(original_start_pos, dtype=np.int64) + seq_len: np.ndarray = np.array(original_seq_len, dtype=np.int64) + + # Provided `pad_to_multiple_of` ensure the padded_length is cleanly divisible + # by this multiple. + # If max_len is 1, we are presumably in a token generation phase batch. + # W scenario, padding from 1 -> 2, does not result in a performance gain. + if seq_len.max() == 1: + padded_length = 1 + else: + padded_length = ( + math.ceil(seq_len.max() / pad_to_multiple_of) * pad_to_multiple_of + ) + + # Mask shape: for each token being generated, attend to tokens _before_ it + # in the entire sequence including context. Pad all values to the longest + # sequence length and total length. + post_seq_len = (start_pos + padded_length).max() + mask_shape = (padded_length, post_seq_len) + + # TODO(KERN-782): This should be -inf but softmax saturates with NaNs. + fill_val = -10000.0 + fill_matrix = np.full(mask_shape, fill_val, dtype=np.float32) + + return np.stack( + # Set diagonal to k + 1 so that tokens attend to themselves. + [np.triu(fill_matrix, k=k + 1) for k in start_pos] + ) diff --git a/src/max/pipelines/dataprocessing/causal_attention_mask_with_alibi.py b/src/max/pipelines/dataprocessing/causal_attention_mask_with_alibi.py new file mode 100644 index 0000000000..d3ebbb63bd --- /dev/null +++ b/src/max/pipelines/dataprocessing/causal_attention_mask_with_alibi.py @@ -0,0 +1,68 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import numpy as np + +from .causal_attention_mask import causal_attention_mask + + +def _alibi_bias( + max_seq_len: int, alibi_bias_max: int, n_heads: int +) -> np.ndarray: + # This bias has to be calculated in fp32, as numpy does not have support for bf16. + bias = np.arange(1 - max_seq_len, 1, 1).reshape((1, 1, 1, max_seq_len)) + rounded_n_heads = int( + np.power(np.asfarray(2), np.ceil(np.log2(np.asfarray(n_heads)))) + ) + m = np.arange(1.0, 1.0 + rounded_n_heads) * ( + np.asfarray(alibi_bias_max) / np.asfarray(rounded_n_heads) + ) + + slopes = np.asfarray(1.0) / np.power(2.0, m) + + if rounded_n_heads != n_heads: + slopes = np.concatenate( + [slopes[1:rounded_n_heads:2], slopes[0:rounded_n_heads:2]] + ) + slopes = slopes[0:n_heads] + + slopes = slopes.reshape(1, n_heads, 1, 1) + + alibi_bias = bias * slopes + + return alibi_bias[:, :, :, :max_seq_len] + + +def causal_attention_mask_with_alibi( + original_start_pos: list[int], + original_seq_len: list[int], + alibi_bias_max: int, + n_heads: int, + pad_to_multiple_of: int = 1, +) -> np.ndarray: + # Get original causal mask + causal_mask = causal_attention_mask( + original_start_pos, original_seq_len, pad_to_multiple_of + ) + + max_seq_len = causal_mask.shape[2] + + # Broadcast causal_mask out for n_heads + causal_mask = np.expand_dims(causal_mask, axis=1) + + # Get alibi bias + alibi_bias = _alibi_bias(max_seq_len, alibi_bias_max, n_heads) + + return causal_mask + np.float32(alibi_bias) diff --git a/src/max/pipelines/dataprocessing/collate_batch.py b/src/max/pipelines/dataprocessing/collate_batch.py new file mode 100644 index 0000000000..22d0787785 --- /dev/null +++ b/src/max/pipelines/dataprocessing/collate_batch.py @@ -0,0 +1,120 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Batch padding.""" + +from __future__ import annotations + +import enum +import math + +import numpy as np + +from .causal_attention_mask import causal_attention_mask + + +class PaddingDirection(enum.Enum): + """Padding (from) direction for batch collation.""" + + LEFT = "left" + RIGHT = "right" + + +def collate_batch( + batch: list[np.ndarray], + direction: PaddingDirection = PaddingDirection.RIGHT, + pad_value: int = 0, + batch_size: int | None = None, + pad_to_multiple_of: int = 1, +) -> tuple[np.ndarray, np.ndarray]: + """Generates a single batch tensor from a batch of inputs. + + These input tensors may have different lengths. The `pad_value` will be used + to pad out the inputs to the same length. + + If `batch_size` is present, add additional values to the batch up to that + size. + + Returns: + A tuple of: + A matrix with all rows padded to the max sequence length. + A list with last token indices prior to any padding. + + Raises: + ValueError: if the batch is empty. + NotImplementedError: if the batch contains anything other than vectors. + """ + if not batch: + msg = "Must provide at least one batch item." + raise ValueError(msg) + + if not all(a.ndim == 1 for a in batch): + msg = "Collate only supports rank 1 tensors for now." + raise NotImplementedError(msg) + + max_len = max((len(a) for a in batch), default=0) + + # If max_len is 1, we are presumably in a token generation phase batch. + # W scenario, padding from 1 -> 2, does not result in a performance gain. + if max_len == 1: + pad_to = 1 + else: + pad_to = math.ceil(max_len / pad_to_multiple_of) * pad_to_multiple_of + + def pad(a: np.ndarray) -> np.ndarray: + npad = pad_to - len(a) + if npad == 0: + return a + padding = (npad, 0) if direction == PaddingDirection.LEFT else (0, npad) + return np.pad(a, padding, mode="constant", constant_values=pad_value) + + if batch_size is not None: + pad_batch_item = np.array([pad_value] * pad_to) + batch.extend([pad_batch_item] * (batch_size - len(batch))) + + # Generate unpadded last token index. + unpadded_last_token_index = ( + np.full(len(batch), -1) + if direction == PaddingDirection.LEFT + else np.array([len(a) - 1 for a in batch]) + ) + + return np.stack([pad(a) for a in batch], axis=0), unpadded_last_token_index + + +def batch_padded_tokens_and_mask( + start_pos: list[int], + tokens: list[np.ndarray], + pad_to_multiple_of: int = 1, +) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + """Batches input tokens and computes a batched attention mask. + + Args: + start_pos: index into the end of the KV cache for each batch item. + tokens: unpadded input tokens for this batch. + + Returns: + A (batched tokens, unpadded last token indices, batch attention mask) pair. + """ + # Grab attention mask. + attn_mask = causal_attention_mask( + original_start_pos=start_pos, + original_seq_len=[len(t) for t in tokens], + pad_to_multiple_of=pad_to_multiple_of, + ) + + # Create batched input token tensor by padding all input token tensors + # to the maximum sequence length in the batch. + next_tokens_batch, unpadded_last_token_index = collate_batch( + tokens, batch_size=len(tokens), pad_to_multiple_of=pad_to_multiple_of + ) + return next_tokens_batch, unpadded_last_token_index, attn_mask diff --git a/src/max/pipelines/dataprocessing/max_tokens_to_generate.py b/src/max/pipelines/dataprocessing/max_tokens_to_generate.py new file mode 100644 index 0000000000..5163c06753 --- /dev/null +++ b/src/max/pipelines/dataprocessing/max_tokens_to_generate.py @@ -0,0 +1,24 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +def max_tokens_to_generate( + prompt_size: int, + max_length: int, + max_new_tokens: int = -1, +) -> int: + """Returns the max number of new tokens to generate.""" + _difference_between_max_and_prompt = max(max_length - prompt_size, 0) + if max_new_tokens < 0: + return _difference_between_max_and_prompt + return min(max_new_tokens, _difference_between_max_and_prompt) diff --git a/src/max/pipelines/embeddings_pipeline.py b/src/max/pipelines/embeddings_pipeline.py new file mode 100644 index 0000000000..85ed8932ec --- /dev/null +++ b/src/max/pipelines/embeddings_pipeline.py @@ -0,0 +1,86 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Pipeline for running text embeddings.""" + +from __future__ import annotations + +from typing import Any, Type, TypeVar + +from max.engine import InferenceSession +from max.profiler import Tracer, traced + +from .config import PipelineConfig +from .context import InputContext +from .interfaces import EmbeddingsGenerator +from .pipeline import PipelineModel +from .response import EmbeddingsResponse + +T = TypeVar("T", bound=InputContext) + + +class EmbeddingsPipeline(EmbeddingsGenerator[T]): + """Generalized token generator pipeline.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + pipeline_model: Type[PipelineModel], + **unused_kwargs, + ) -> None: + self._pipeline_config = pipeline_config + # Initialize Session. + session = InferenceSession(devices=self._pipeline_config.devices) + + # Load model. + self._pipeline_model = pipeline_model( + pipeline_config=self._pipeline_config, session=session + ) + + @traced + def encode(self, batch: dict[str, T]) -> dict[str, EmbeddingsResponse]: + """Provided a batch, process batch inputs, execute the graph for num_steps in a multi-step scenario, + then decode the tokens holistically and return the list of decoded tokens. + """ + + tracer: Tracer = Tracer() + # Flatten our batch for consistent indexing. + context_batch = list(batch.values()) + + tracer.next("prepare_initial_token_inputs") + # Prepare inputs for the first token in multistep execution. + model_inputs = self._pipeline_model.prepare_initial_token_inputs( + context_batch + ) + + tracer.next("execute") + model_outputs = self._pipeline_model.execute( + model_inputs=model_inputs, kv_cache_inputs=None + ) + assert model_outputs.logits + # Do the copy to host for each token generated. + tracer.next("logits.to(CPU())") + batch_embeddings = model_outputs.logits.to_numpy() + + # Prepare the response. + res: dict[str, Any] = {} + tracer.push("prepare_response") + for batch_index, request_id in enumerate(batch.keys()): + request_embeddings = batch_embeddings[batch_index] + if not self._pipeline_config.pool_embeddings: + # Remove padded tokens from embeddings + request_embeddings = request_embeddings[ + : context_batch[batch_index].active_length, : + ] + res[request_id] = EmbeddingsResponse(request_embeddings) + return res diff --git a/src/max/pipelines/hf_pipeline.py b/src/max/pipelines/hf_pipeline.py new file mode 100644 index 0000000000..0d03506701 --- /dev/null +++ b/src/max/pipelines/hf_pipeline.py @@ -0,0 +1,384 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Generalized Token Generation Pipeline""" + +from __future__ import annotations + +import logging +import warnings +from typing import Any, Optional, cast + +import numpy as np +import torch +from max.driver import Tensor +from transformers import ( + AutoModel, + AutoModelForCausalLM, + AutoTokenizer, + BatchEncoding, +) + +from .config import PipelineConfig +from .context import TextContext +from .interfaces import EmbeddingsGenerator, TokenGenerator +from .kv_cache import ContinuousHFStaticCache +from .response import EmbeddingsResponse, TextResponse + +logger = logging.getLogger("max.pipelines") + +DEFAULT_MAX_SEQ_LEN = 512 + + +class HFTextGenerationPipeline(TokenGenerator[TextContext]): + """HuggingFace text token generator pipeline.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + torch_device_type: str, + ): + self._pipeline_config = pipeline_config + self._torch_device = torch.device(torch_device_type) + + self._model = AutoModelForCausalLM.from_pretrained( + pipeline_config.model_path, + trust_remote_code=pipeline_config.trust_remote_code, + ).to(self._torch_device) + self._dtype = self._model.dtype + + if self._model.config.model_type == "gemma2": + raise RuntimeError( + "Gemma2 architecture is currently not supported." + ) + + self._tokenizer = AutoTokenizer.from_pretrained( + pipeline_config.model_path + ) + + eos_token_id = self._tokenizer.eos_token_id + + # Expand eos tokens if more are provided in pipeline_config + if "eos_token_id" in pipeline_config.huggingface_config: + eos_tokens = pipeline_config.huggingface_config.eos_token_id + if isinstance(eos_tokens, int): + if eos_tokens != eos_token_id: + msg = f"eos_token_id provided in huggingface config ({eos_tokens}), does not match provided eos_token_id ({eos_token_id}), using provided eos_token_id" + logger.warning(msg) + + eos_token_id = set([eos_tokens]) + elif isinstance(eos_tokens, list): + if eos_token_id in eos_tokens: + eos_token_id = set(eos_tokens) + else: + eos_token_id = set([eos_token_id]) + else: + msg = f"eos_token_id in huggingface_config, is neither int or list: {eos_tokens}" + logger.warning(msg) + self._eos_token_id = set([eos_token_id]) + else: + eos_token_id = set([eos_token_id]) + + self._eos_token_id = eos_token_id + if self._tokenizer.pad_token is None: + self._tokenizer.pad_token = self._tokenizer.eos_token + + max_batch_size = pipeline_config.max_batch_size + assert max_batch_size is not None, ( + "max_batch_size must be set before constructing ContinuousHFStaticCache" + ) + self._cache = ContinuousHFStaticCache( + config=self._model.config, + max_batch_size=max_batch_size, + max_seq_len=DEFAULT_MAX_SEQ_LEN + if pipeline_config.max_length is None + else pipeline_config.max_length, + dtype=self._dtype, + device=self._torch_device, + ) + + # TODO(deep): Implement sampling and remove this warning + if self._pipeline_config.top_k > 1: + warnings.warn( + "Only argmax sampling is currently implemented, and the top_k config will be ignored", + ) + + def next_token( + self, batch: dict[str, TextContext], num_steps: int + ) -> list[dict[str, TextResponse]]: + """Provided a batch, process batch inputs, execute the graph for num_steps in a multi-step scenario, + then decode the tokens holistically and return the list of decoded tokens. + """ + + context_batch = list(batch.values()) + new_sequences = False + + # Claim cache slots for new sequences + for ctx in context_batch: + seq_id = ctx.cache_seq_id + if seq_id in self._cache.available_slots: + self._cache.external_claim([seq_id]) + self._cache.tokens[seq_id] = ctx.next_tokens + new_sequences = True + + cache_seq_ids = [ctx.cache_seq_id for ctx in context_batch] + self._cache.set_active_slots(cache_seq_ids) + + # Initial inputs preparation + input_ids, attention_mask, cache_position = ( + self._prepare_initial_token_inputs( + cache_seq_ids, context_batch, new_sequences + ) + ) + + # Pre-allocate tensor for generated tokens + generated_tokens = torch.zeros( + (len(context_batch), num_steps), + dtype=torch.long, + device=self._torch_device, + ) + + # Generate tokens + with torch.no_grad(): + for step in range(num_steps): + self._cache.set_cache_position(cache_position) + + outputs = self._model( + input_ids=input_ids, + attention_mask=attention_mask, + past_key_values=self._cache, + use_cache=True, + ) + + next_token = outputs.logits[:, -1, :].argmax(dim=-1) + generated_tokens[:, step] = next_token + + # if last step, no need to prepare next batch input + if step == num_steps - 1: + break + + # Next inputs preparation + input_ids, attention_mask, cache_position = ( + self._prepare_next_token_inputs( + cache_seq_ids, + next_tokens=next_token.unsqueeze(-1), + ) + ) + + # Move generated tokens to CPU for processing + generated_tokens = generated_tokens.cpu() + + # Prepare the response, pruning away completed requests as we go. + res: list[dict[str, Any]] = [{} for i in range(num_steps)] + for batch_idx, (request_id, context) in enumerate(batch.items()): + for step in range(num_steps): + next_token_id = generated_tokens[batch_idx, step].item() + + # Update context + context.update(next_token_id) + next_tokens = np.array([next_token_id]) + self._cache.tokens[context.cache_seq_id] = np.append( + self._cache.tokens[context.cache_seq_id], next_tokens + ) + + max_length = ( + DEFAULT_MAX_SEQ_LEN + if context.max_length is None + else context.max_length + ) + if ( + next_token_id in self._eos_token_id + or context.current_length > max_length + ): + break + + res[step][request_id] = TextResponse(next_token) + + return res + + def _prepare_initial_token_inputs( + self, + cache_seq_ids: list[int], + context_batch: list[TextContext], + new_sequences: bool, + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + if new_sequences: + # Process all tokens for new sequences + tokens = [ + torch.tensor(self._cache.tokens[ctx.cache_seq_id]) + for ctx in context_batch + ] + padded = self._tokenizer.pad( + BatchEncoding({"input_ids": tokens}), + padding=True, + return_tensors="pt", + ) + + input_ids = padded["input_ids"].to(self._torch_device) + attention_mask = padded["attention_mask"].to(self._torch_device) + + # Initialize attention patterns + for seq_id, mask in zip(cache_seq_ids, attention_mask): + self._cache.update_attention_pattern(seq_id, mask) + else: + # Process only next tokens for the iterative steps + tokens = [torch.tensor(ctx.next_tokens) for ctx in context_batch] + padded = self._tokenizer.pad( + BatchEncoding({"input_ids": tokens}), + padding=True, + return_tensors="pt", + ) + input_ids = padded["input_ids"].to(self._torch_device) + + # Extend attention patterns by 1 + ones = torch.ones(1, dtype=torch.long, device=self._torch_device) + for seq_id in cache_seq_ids: + pattern = self._cache.attention_patterns[seq_id] + self._cache.update_attention_pattern( + seq_id, + torch.cat([pattern, ones]), + ) + + # Get complete attention mask for all sequences + attention_mask = self._cache.get_attention_mask(cache_seq_ids) + + # Calculate cache position + seq_length = input_ids.size(1) + max_length = attention_mask.size(1) + cache_position = torch.arange( + max_length - seq_length, + max_length, + device=self._torch_device, + ) + + return input_ids, attention_mask, cache_position + + def _prepare_next_token_inputs( + self, + cache_seq_ids: list[int], + next_tokens: Optional[Tensor] = None, + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + # Process only next tokens for the iterative steps + encoded_input = BatchEncoding({"input_ids": next_tokens}) + padded = self._tokenizer.pad( + encoded_input, padding=True, return_tensors="pt" + ) + input_ids = padded["input_ids"].to(self._torch_device) + + # Extend attention patterns by 1 + ones = torch.ones(1, dtype=torch.long, device=self._torch_device) + for seq_id in cache_seq_ids: + pattern = self._cache.attention_patterns[seq_id] + self._cache.update_attention_pattern( + seq_id, + torch.cat([pattern, ones]), + ) + + attention_mask = self._cache.get_attention_mask(cache_seq_ids) + + # Calculate cache position + seq_length = input_ids.size(1) + max_length = attention_mask.size(1) + cache_position = torch.arange( + max_length - seq_length, + max_length, + device=self._torch_device, + ) + + return input_ids, attention_mask, cache_position + + def release(self, context: TextContext) -> None: + if context.cache_seq_id not in self._cache.available_slots: + self._cache.release(context.cache_seq_id) + + +class HFEmbeddingsPipeline(EmbeddingsGenerator[TextContext]): + """Generalized token generator pipeline.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + torch_device_type: str, + ) -> None: + self._pipeline_config = pipeline_config + self._torch_device = torch.device(torch_device_type) + self._model = AutoModel.from_pretrained( + pipeline_config.model_path, + trust_remote_code=pipeline_config.trust_remote_code, + ).to(self._torch_device) + self._tokenizer = AutoTokenizer.from_pretrained( + pipeline_config.model_path + ) + + def prepare_initial_token_inputs( + self, + context_batch: list[TextContext], + ) -> tuple[torch.Tensor, torch.Tensor]: + # Get tokens and seq_ids. + tokens = [ctx.next_tokens for ctx in context_batch] + + # Pad tokens for the batch. + padded = self._tokenizer.pad( + BatchEncoding({"input_ids": tokens}), + padding=True, + return_tensors="pt", + pad_to_multiple_of=2, + ) + input_ids = cast(torch.Tensor, padded["input_ids"]).to( + self._torch_device + ) + attention_mask = cast(torch.Tensor, padded["attention_mask"]).to( + self._torch_device + ) + return input_ids, attention_mask + + def encode( + self, batch: dict[str, TextContext] + ) -> dict[str, EmbeddingsResponse]: + """Encodes a batch of text inputs.""" + + # Flatten our batch for consistent indexing. + context_batch = list(batch.values()) + input_ids, attention_mask = self.prepare_initial_token_inputs( + context_batch + ) + + outputs = self._model( + input_ids=input_ids, attention_mask=attention_mask + ) + # Pool the embeddings of together, and copy to cpu. + batch_embeddings = ( + _mean_pooling(outputs, attention_mask).cpu().detach().numpy() + ) + + # Prepare the response. + res: dict[str, Any] = {} + for batch_index, request_id in enumerate(batch.keys()): + request_embeddings = batch_embeddings[batch_index] + res[request_id] = EmbeddingsResponse(request_embeddings) + return res + + +# Taken from the sentence piece transformer: +# https://huggingface.co/sentence-transformers/all-mpnet-base-v2 +# Mean Pooling - Take attention mask into account for correct averaging +def _mean_pooling(model_output, attention_mask): + token_embeddings = model_output[ + 0 + ] # First element of model_output contains all token embeddings + input_mask_expanded = ( + attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float() + ) + return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp( + input_mask_expanded.sum(1), min=1e-9 + ) diff --git a/src/max/pipelines/hf_utils.py b/src/max/pipelines/hf_utils.py new file mode 100644 index 0000000000..698f62f49a --- /dev/null +++ b/src/max/pipelines/hf_utils.py @@ -0,0 +1,56 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Utilities for interacting with HuggingFace Files/Repos.""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +from huggingface_hub import ( + file_exists, + get_hf_file_metadata, + hf_hub_download, + hf_hub_url, +) + + +@dataclass(frozen=True) +class HuggingFaceFile: + """A simple object for tracking huggingface model metadata. + The repo_id will frequently be used to load a tokenizer, + whereas the filename is used to download model weights.""" + + repo_id: str + filename: str + revision: str | None = None + + def download(self, force_download: bool = False) -> Path: + """Download the file and return the file path where the data is saved locally.""" + return Path( + hf_hub_download( + self.repo_id, + self.filename, + revision=self.revision, + force_download=force_download, + ) + ) + + def size(self) -> int | None: + url = hf_hub_url(self.repo_id, self.filename, revision=self.revision) + metadata = get_hf_file_metadata(url) + return metadata.size + + def exists(self) -> bool: + return file_exists(self.repo_id, self.filename, revision=self.revision) diff --git a/src/max/pipelines/interfaces/__init__.py b/src/max/pipelines/interfaces/__init__.py new file mode 100644 index 0000000000..9233e609e6 --- /dev/null +++ b/src/max/pipelines/interfaces/__init__.py @@ -0,0 +1,42 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Top level imports for pipeline interfaces.""" + +from .embeddings_generation import ( + EmbeddingsGenerator, +) +from .tasks import PipelineTask +from .text_generation import ( + PipelineTokenizer, + TokenGenerator, + TokenGeneratorContext, + TokenGeneratorRequest, + TokenGeneratorRequestFunction, + TokenGeneratorRequestMessage, + TokenGeneratorRequestTool, + TokenGeneratorResponseFormat, +) + +__all__ = [ + "PipelineTask", + "PipelineTokenizer", + "TokenGenerator", + "TokenGeneratorContext", + "TokenGeneratorRequest", + "TokenGeneratorRequestFunction", + "TokenGeneratorRequestMessage", + "TokenGeneratorRequestTool", + "TokenGeneratorResponseFormat", + "EmbeddingsGenerator", +] diff --git a/src/max/pipelines/interfaces/embeddings_generation.py b/src/max/pipelines/interfaces/embeddings_generation.py new file mode 100644 index 0000000000..99846df2ed --- /dev/null +++ b/src/max/pipelines/interfaces/embeddings_generation.py @@ -0,0 +1,39 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Interfaces for embeddings generation pipeline behaviors.""" + +from typing import Any, Generic, Protocol, TypeVar, runtime_checkable + +EmbeddingsGeneratorContext = TypeVar("EmbeddingsGeneratorContext") + + +@runtime_checkable +class EmbeddingsGenerator(Generic[EmbeddingsGeneratorContext], Protocol): + """Interface for LLM embeddings-generator models.""" + + def encode( + self, batch: dict[str, EmbeddingsGeneratorContext] + ) -> dict[str, Any]: + """Computes embeddings for a batch of inputs. + + Args: + batch (dict[str, EmbeddingsGeneratorContext]): Batch of contexts to generate + embeddings for. + + Returns: + dict[str, Any]: Dictionary mapping request IDs to their corresponding + embeddings. Each embedding is typically a numpy array or tensor of + floating point values. + """ + ... diff --git a/examples/run-examples.sh b/src/max/pipelines/interfaces/tasks.py old mode 100755 new mode 100644 similarity index 62% rename from examples/run-examples.sh rename to src/max/pipelines/interfaces/tasks.py index 30bc2be5fc..553a4705c1 --- a/examples/run-examples.sh +++ b/src/max/pipelines/interfaces/tasks.py @@ -1,6 +1,5 @@ -#!/usr/bin/env bash # ===----------------------------------------------------------------------=== # -# Copyright (c) 2024, Modular Inc. All rights reserved. +# Copyright (c) 2025, Modular Inc. All rights reserved. # # Licensed under the Apache License v2.0 with LLVM Exceptions: # https://llvm.org/LICENSE.txt @@ -12,14 +11,11 @@ # limitations under the License. # ===----------------------------------------------------------------------=== # -set -euo pipefail +"""Pipeline Tasks.""" -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -REPO_ROOT="${SCRIPT_DIR}"/../ -EXAMPLES_DIR="${REPO_ROOT}"/examples +from enum import Enum -BUILD_DIR="${REPO_ROOT}"/build -mkdir -p "${BUILD_DIR}" -# Run the examples using `lit`. -lit -sv "${EXAMPLES_DIR}" +class PipelineTask(str, Enum): + TEXT_GENERATION = "text_generation" + EMBEDDINGS_GENERATION = "embeddings_generation" diff --git a/src/max/pipelines/interfaces/text_generation.py b/src/max/pipelines/interfaces/text_generation.py new file mode 100644 index 0000000000..c2a250a208 --- /dev/null +++ b/src/max/pipelines/interfaces/text_generation.py @@ -0,0 +1,277 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Interfaces for text generation pipeline behaviors.""" + +from dataclasses import dataclass +from typing import ( + Any, + Generic, + List, + Literal, + Optional, + Protocol, + Sequence, + TypedDict, + TypeVar, + Union, + runtime_checkable, +) + + +class TokenGeneratorRequestFunction(TypedDict): + name: str + description: str + parameters: dict + + +class TokenGeneratorRequestTool(TypedDict): + type: str + function: TokenGeneratorRequestFunction + + +class TokenGeneratorResponseFormat(TypedDict): + type: str + json_schema: dict + + +class TokenGeneratorRequestMessage(TypedDict): + role: Literal["system", "user", "assistant"] + content: Union[str, list[dict[str, Any]]] + """Content can be simple string or a list of message parts of different + modalities. + + For example: + + .. code-block:: json + + { + "role": "user", + "content": "What'\''s the weather like in Boston today?" + } + + Or: + + .. code-block:: json + + { + "role": "user", + "content": [ + { + "type": "text", + "text": "What'\''s in this image?" + }, + { + "type": "image_url", + "image_url": { + "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" + } + } + ] + } + """ + + +@dataclass(frozen=True) +class TokenGeneratorRequest: + id: str + """ + A unique identifier for the request. This ID can be used to trace and log + the request throughout its lifecycle, facilitating debugging and tracking. + """ + index: int + """ + The sequence order of this request within a batch. This is useful for + maintaining the order of requests when processing multiple requests + simultaneously, ensuring that responses can be matched back to their + corresponding requests accurately. + """ + model_name: str + """ + The name of the model to be used for generating tokens. This should match + the available models on the server and determines the behavior and + capabilities of the response generation. + """ + prompt: Union[str, Sequence[int], None] = None + """ + The prompt to be processed by the model. This field supports legacy + completion APIs and can accept either a string or a sequence of integers + representing token IDs. If not provided, the model may generate output + based on the messages field. + """ + messages: Optional[list[TokenGeneratorRequestMessage]] = None + """ + A list of messages for chat-based interactions. This is used in chat + completion APIs, where each message represents a turn in the conversation. + If provided, the model will generate responses based on these messages. + """ + images: Optional[list[bytes]] = None + """ + A list of image byte arrays that can be included as part of the request. + This field is optional and may be used for multimodal inputs where images + are relevant to the prompt or task. + """ + tools: Optional[list[TokenGeneratorRequestTool]] = None + """ + A list of tools that can be invoked during the generation process. This + allows the model to utilize external functionalities or APIs to enhance its + responses. + """ + response_format: Optional[TokenGeneratorResponseFormat] = None + """ + Specifies the desired format for the model's output. When set, it enables + structured generation, which adheres to the json_schema provided. + """ + max_new_tokens: Optional[int] = None + """ + The maximum number of new tokens to generate in the response. If not set, + the model may generate tokens until it reaches its internal limits or based + on other stopping criteria. + """ + timestamp_ns: int = 0 + """ + The time (in nanoseconds) when the request was received by the server. This + can be useful for performance monitoring and logging purposes. + """ + request_path: str = "/" + """ + The endpoint path for the request. This is typically used for routing and + logging requests within the server infrastructure. + """ + logprobs: int = 0 + """ + The number of top log probabilities to return for each generated token. A value + of 0 means that log probabilities will not be returned. Useful for analyzing + model confidence in its predictions. + """ + echo: bool = False + """ + If set to True, the response will include the original prompt along with the + generated output. This can be useful for debugging or when you want to see how + the input relates to the output. + """ + stop: Optional[Union[str, List[str]]] = None + """ + Optional list of stop expressions (see: https://platform.openai.com/docs/api-reference/chat/create#chat-create-stop) + """ + + def __str__(self) -> str: + txt = f"Id: {self.id}" + if self.max_new_tokens: + txt += f", MaxNewTokens: {self.max_new_tokens}" + return txt + + +TokenGeneratorContext = TypeVar("TokenGeneratorContext") +TokenGeneratorBatchKey = TypeVar("TokenGeneratorBatchKey") + +TokenizerEncoded = TypeVar("TokenizerEncoded") + + +@runtime_checkable +class PipelineTokenizer( + Generic[TokenGeneratorContext, TokenizerEncoded], Protocol +): + """Interface for LLM tokenizers.""" + + @property + def eos(self) -> int: + """The end of sequence token for this tokenizer.""" + ... + + @property + def expects_content_wrapping(self) -> bool: + """If true, this tokenizer expects messages to have a 'content' property. + Text messages are formatted as + { "type" : "text", "content" : "text content"} + instead of, the OpenAI spec. + { "type" : "text", "text": "text content" }. + NOTE: Multimodal messages omit the content property. + Both "image_urls" and "image" content parts are converted to simply + { "type" : "image" } + Their content is provided as byte arrays and by the top level property on + the request object, i.e. "TokenGeneratorRequest.images". + """ + ... + + async def new_context( + self, request: TokenGeneratorRequest + ) -> TokenGeneratorContext: + """Creates a new context from a request object. This is sent to the + worker process once and then cached locally. + + Args: + request (TokenGeneratorRequest): Incoming request. + + Returns: + TokenGeneratorContext: Initialized context. + """ + ... + + async def encode(self, prompt: str) -> TokenizerEncoded: + """Encodes text prompts as tokens. + + Args: + prompt (str): Un-encoded prompt text. + + Raises: + ValueError: If the prompt exceeds the configured maximum length. + + Returns: + TokenizerEncoded: Encoded prompt tokens. + """ + ... + + async def decode( + self, + context: TokenGeneratorContext, + encoded: TokenizerEncoded, + **kwargs, + ) -> str: + """Decodes response tokens to text. + + Args: + context (TokenGeneratorContext): Current generation context. + encoded (TokenizerEncoded): Encoded response tokens. + + Returns: + str: Un-encoded response text. + """ + ... + + +@runtime_checkable +class TokenGenerator(Generic[TokenGeneratorContext], Protocol): + """Interface for LLM token-generator models.""" + + def next_token( + self, batch: dict[str, TokenGeneratorContext], num_steps: int + ) -> list[dict[str, Any]]: + """Computes the next token response for a single batch. + + Args: + batch (dict[str, TokenGeneratorContext]): Batch of contexts. + num_steps int: Number of tokens to generate. + + Returns: + list[dict[str, Any]]: List of encoded responses (indexed by req. ID) + """ + ... + + def release(self, context: TokenGeneratorContext) -> None: + """Releases resources associated with this context. + + Args: + context (TokenGeneratorContext): Finished context. + """ + ... diff --git a/src/max/pipelines/kv_cache/__init__.py b/src/max/pipelines/kv_cache/__init__.py new file mode 100644 index 0000000000..0008512c89 --- /dev/null +++ b/src/max/pipelines/kv_cache/__init__.py @@ -0,0 +1,183 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from typing import Any, Dict, List, Optional, Type + +from max.driver import Device +from max.dtype import DType +from max.engine import InferenceSession + +from .cache_params import KVCacheParams, KVCacheStrategy +from .continuous_batching_cache import ( + ContinuousBatchingKVCache, + ContinuousBatchingKVCacheCollection, + ContinuousBatchingKVCacheCollectionType, + ContinuousBatchingKVCacheManager, + ContinuousBatchingKVCacheType, + FetchContinuousBatchingKVCacheCollection, +) +from .hf import ContinuousHFStaticCache +from .manager import ( + KVCacheInputs, + KVCacheInputsSequence, + KVCacheInputSymbols, + KVCacheManager, + PaddedKVCacheInputs, + RaggedKVCacheInputs, +) +from .naive_cache import NaiveKVCacheManager +from .paged_cache import ( + FetchPagedKVCacheCollection, + PagedKVCacheCollection, + PagedKVCacheManager, + PagedKVCacheType, +) +from .radix_trie import RadixTrie + +CACHE_MANAGER_REGISTRY: dict[KVCacheStrategy, Type[KVCacheManager]] = { + KVCacheStrategy.CONTINUOUS: ContinuousBatchingKVCacheManager, + KVCacheStrategy.NAIVE: NaiveKVCacheManager, + KVCacheStrategy.PAGED: PagedKVCacheManager, +} + + +def load_kv_manager( + params: KVCacheParams, + max_batch_size: Optional[int], + max_seq_len: int, + num_layers: int, + devices: List[Device], + session: InferenceSession, + available_cache_memory: Optional[int] = None, + page_size: Optional[int] = 512, +) -> KVCacheManager: + assert max_batch_size is not None, "Expected max_batch_size to be set" + assert max_batch_size > 0, "max_batch_size must be greater than 0" + if params.cache_strategy == KVCacheStrategy.CONTINUOUS: + return ContinuousBatchingKVCacheManager( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + devices=devices, + session=session, + ) + elif params.cache_strategy == KVCacheStrategy.NAIVE: + return NaiveKVCacheManager( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + devices=devices, + session=session, + ) + elif params.cache_strategy == KVCacheStrategy.PAGED: + if page_size is None: + msg = ( + "Missing required argument page_size for KVCacheStrategy.PAGED" + ) + raise ValueError(msg) + + # TODO(KERN-1308) remove this validation as we generalize page_size + if page_size % 128 != 0 or page_size < 128: + msg = "Page size must be a multiple of 128 and at least 128." + raise ValueError(msg) + + if available_cache_memory is None: + msg = "Missing required argument available_cache_memory for KVCacheStrategy.PAGED" + raise ValueError(msg) + + return PagedKVCacheManager( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + devices=devices, + session=session, + cache_memory=available_cache_memory, + page_size=page_size, + ) + else: + msg = f"cache type: {params.cache_strategy} not supported." + raise ValueError(msg) + + +def estimate_kv_cache_size( + params: KVCacheParams, + max_batch_size: Optional[int], + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, +) -> int: + assert max_batch_size is not None, "Expected max_batch_size to be set" + assert max_batch_size > 0, "max_batch_size must be greater than 0" + if params.cache_strategy not in CACHE_MANAGER_REGISTRY: + msg = f"cache type: {params.cache_strategy} not supported." + raise ValueError(msg) + + return CACHE_MANAGER_REGISTRY[params.cache_strategy].estimated_memory_size( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + available_cache_memory=available_cache_memory, + devices=devices, + **kwargs, + ) + + +def infer_optimal_batch_size( + params: KVCacheParams, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, +) -> int: + return CACHE_MANAGER_REGISTRY[ + params.cache_strategy + ].infer_optimal_batch_size( + params=params, + max_seq_len=max_seq_len, + num_layers=num_layers, + available_cache_memory=available_cache_memory, + devices=devices, + **kwargs, + ) + + +__all__ = [ + "KVCacheParams", + "KVCacheStrategy", + "ContinuousBatchingKVCache", + "ContinuousBatchingKVCacheCollection", + "ContinuousBatchingKVCacheCollectionType", + "ContinuousBatchingKVCacheManager", + "ContinuousBatchingKVCacheType", + "FetchContinuousBatchingKVCacheCollection", + "FetchPagedKVCacheCollection", + "PagedKVCacheManager", + "PagedKVCacheCollection", + "PagedKVCacheType", + "KVCacheManager", + "KVCacheInputs", + "KVCacheInputsSequence", + "RaggedKVCacheInputs", + "PaddedKVCacheInputs", + "KVCacheInputSymbols", + "NaiveKVCacheManager", + "ContinuousHFStaticCache", + "RadixTrie", +] diff --git a/src/max/pipelines/kv_cache/_utils.py b/src/max/pipelines/kv_cache/_utils.py new file mode 100644 index 0000000000..6942ad7823 --- /dev/null +++ b/src/max/pipelines/kv_cache/_utils.py @@ -0,0 +1,33 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Utility functions for KV cache.""" + +import numpy as np +from max.driver import Tensor + + +def build_max_lengths_tensor( + num_steps: int, max_seq_length: int, max_cache_length: int +) -> Tensor: + # Build a tensor of maximum lengths. Each step slices the first row to + # advance to the values for the next row. + max_lengths_np = np.empty((num_steps, 2), np.uint32) + step_max_seq_length = max_seq_length + step_max_cache_length = max_cache_length + for step in range(num_steps): + max_lengths_np[step, 0] = step_max_seq_length + max_lengths_np[step, 1] = step_max_cache_length + step_max_cache_length += step_max_seq_length + step_max_seq_length = 1 + return Tensor.from_numpy(max_lengths_np) diff --git a/src/max/pipelines/kv_cache/cache_params.py b/src/max/pipelines/kv_cache/cache_params.py new file mode 100644 index 0000000000..6ca3a34491 --- /dev/null +++ b/src/max/pipelines/kv_cache/cache_params.py @@ -0,0 +1,84 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from enum import Enum +from typing import Optional + +from max.dtype import DType + + +class KVCacheStrategy(str, Enum): + MODEL_DEFAULT = "model_default" + NAIVE = "naive" + CONTINUOUS = "continuous" + PAGED = "paged" + + def __str__(self) -> str: + return self.value + + def __repr__(self) -> str: + return self.value + + def kernel_substring(self) -> str: + """Returns the common substring that we include in the kernel name for this caching strategy.""" + if self == KVCacheStrategy.CONTINUOUS: + return "continuous_batching" + return str(self.value) + + def uses_opaque(self) -> bool: + return self != KVCacheStrategy.NAIVE + + +class KVCacheParams: + def __init__( + self, + dtype: DType, + n_kv_heads: int, + head_dim: int, + enable_prefix_caching: bool = False, + cache_strategy: KVCacheStrategy = KVCacheStrategy.CONTINUOUS, + page_size: Optional[int] = None, + n_devices: int = 1, + ): + # Initialize static attributes. + self.dtype = dtype + self.n_kv_heads = n_kv_heads + self.head_dim = head_dim + self.cache_strategy = cache_strategy + self.n_devices = n_devices + self.n_kv_heads_per_device = n_kv_heads // n_devices + self.page_size = page_size + self.enable_prefix_caching = enable_prefix_caching + + # Validate inputs. + if enable_prefix_caching and cache_strategy != KVCacheStrategy.PAGED: + raise ValueError( + "Prefix caching is only supported for paged cache strategy" + ) + if page_size is None and cache_strategy == KVCacheStrategy.PAGED: + raise ValueError("Page size is required for paged cache strategy") + + @property + def dtype_shorthand(self) -> str: + """The textual representation in shorthand of the dtype.""" + return "bf16" if self.dtype == DType.bfloat16 else "f32" + + @property + def static_cache_shape(self) -> tuple[str, str, str, str, str]: + return ( + "num_layers", + "batch_size", + "seq_len", + "n_kv_heads", + "head_dim", + ) diff --git a/src/max/pipelines/kv_cache/continuous_batching_cache.py b/src/max/pipelines/kv_cache/continuous_batching_cache.py new file mode 100644 index 0000000000..b6f75e9c8a --- /dev/null +++ b/src/max/pipelines/kv_cache/continuous_batching_cache.py @@ -0,0 +1,405 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Continuous Batching enabled KV cache for the Transformer leveraging the mo.opaque pattern.""" + +from __future__ import annotations + +from dataclasses import dataclass +from functools import reduce +from operator import mul +from typing import Any, List, cast + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import ( + DeviceRef, + TensorType, + TensorValue, + _OpaqueType, + _OpaqueValue, + ops, +) + +from ._utils import build_max_lengths_tensor +from .cache_params import KVCacheParams +from .manager import ( + KVCacheInputs, + KVCacheInputSymbols, + KVCacheManager, + RaggedKVCacheInputs, +) + + +@dataclass +class ContinuousBatchingKVCacheInputSymbols(KVCacheInputSymbols): + kv_blocks: TensorType + cache_lengths: TensorType + lookup_table: TensorType + max_lengths: TensorType + + +class ContinuousBatchingKVCacheType(_OpaqueType): + """Continuous Mojo KV Cache graph type.""" + + def __init__(self) -> None: + """Creates an opaque type containing a continuous batching KV Cache.""" + super().__init__("ContinuousBatchingKVCache") + + +class ContinuousBatchingKVCacheCollectionType(_OpaqueType): + """The graph type for a "view" of the cache for the given sequences in the + batch. + + This object does not own the underlying buffers in k_cache and v_cache, + it's borrowing them from the BlockWrappers in our ContinuousKVCacheManager. + It does own the Pointer[NDBuffer[type, 3]] and valid_lengths buffer + """ + + def __init__(self) -> None: + """Creates an opaque type containing a continuous batching KV cache collection.""" + super().__init__("ContinuousBatchingKVCacheCollection") + + +class ContinuousBatchingKVCache(_OpaqueValue): + """Continuous Mojo KV cache graph value.""" + + +class ContinuousBatchingKVCacheCollection(_OpaqueValue): + """The graph value for a view of the KV cache.""" + + +class FetchContinuousBatchingKVCacheCollection: + def __init__(self, kv_params: KVCacheParams) -> None: + if kv_params.enable_prefix_caching: + raise ValueError( + "Prefix caching is not supported for continuous batching cache." + ) + self.kv_params = kv_params + + def __call__( + self, + blocks: TensorValue, # NDBuffer[type, 6, Self.blocks_shape] + cache_lengths: TensorValue, # NDBuffer[DType.uint32, 1], + lookup_table: TensorValue, # NDBuffer[DType.uint32, 1], + max_lengths: TensorValue, + ) -> ContinuousBatchingKVCacheCollection: + """Constructs a ContinuousBatchingKVCacheCollection for use downstream.""" + + # Explicit validation. + if blocks.dtype != self.kv_params.dtype: + msg = ( + f"expected blocks to be dtype: {self.kv_params.dtype}, got" + f" {blocks.dtype}" + ) + raise ValueError(msg) + + if blocks.rank != 6: + msg = f"expected blocks to be of rank 6, got {blocks.rank}" + raise ValueError(msg) + + # For all tensors other than the blocks tensor, the length should be equivalent + # to batch size, which is unknown within the graph at this stage. + if cache_lengths.dtype != DType.uint32: + msg = ( + "expected cache lengths to be dtype: uint32, got" + f" {cache_lengths.dtype}" + ) + raise ValueError(msg) + + if lookup_table.dtype != DType.uint32: + msg = ( + "expected lookup_table to be dtype: uint32, got" + f" {lookup_table.dtype}" + ) + raise ValueError(msg) + + return ContinuousBatchingKVCacheCollection( + ops.custom( + "mo.kv_collection_ctor.continuous_batching", + values=[ + blocks, + cache_lengths, + lookup_table, + max_lengths, + ], + out_types=[ContinuousBatchingKVCacheCollectionType()], + parameters={ + "num_heads": self.kv_params.n_kv_heads_per_device, + "head_dim": self.kv_params.head_dim, + }, + )[0].opaque + ) + + +class ContinuousBatchingKVCacheManager(KVCacheManager): + def __init__( + self, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + devices: List[Device], + session: InferenceSession, + ) -> None: + super().__init__( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + devices=devices, + session=session, + is_ragged=True, + ) + + # Allocate memory for the KV cache blocks. + self.blocks: List[Tensor] = [] + for i in range(len(self.devices)): + self.blocks.append( + Tensor.zeros( + self.block_shape(self.max_batch_size), + self.params.dtype, + device=self.devices[i], + ) + ) + + @classmethod + def estimated_memory_size( + cls, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, + ) -> int: + cache_size = ( + reduce( + mul, + cls._block_shape( + params, max_batch_size, max_seq_len, num_layers + ), + ) + * params.dtype.size_in_bytes + ) + lengths_size = max_batch_size * DType.uint32.size_in_bytes + lookup_table_size = max_batch_size * DType.uint32.size_in_bytes + size = cache_size + lengths_size + lookup_table_size + return size * len(devices) + + @classmethod + def infer_optimal_batch_size( + cls, + params: KVCacheParams, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, + ) -> int: + cache_size_per_sequence = ( + reduce( + mul, + cls._block_shape(params, 1, max_seq_len, num_layers), + ) + * params.dtype.size_in_bytes + ) + return int(available_cache_memory // cache_size_per_sequence) + + def _fetch( + self, + seq_ids_and_prompts: dict[int, np.ndarray], + num_steps: int = 1, + ) -> List[KVCacheInputs]: + """Fetches the KV cache state for the given sequence IDs. + + This method retrieves the current cache state for a batch of sequences, including their + cache lengths and lookup information. It's used during token generation to access + previously cached key/value pairs. + + Args: + seq_ids_and_prompts: Dictionary of sequence IDs to fetch cache state for and the + new prompt we plan to add to the cache. Each ID must be within + the max_batch_size and must exist in the current cache. + num_steps: Number of steps to run for multi-step scheduling. + + Returns: + List of tuples for each device containing: + - blocks: Tensor containing the KV cache blocks + - cache_lengths: Tensor of current cache lengths for each sequence + - lookup_table: Tensor mapping sequence IDs to cache positions + - max_lengths: Tensor containing [max_seq_length, max_cache_length] + + Raises: + ValueError: If any seq_id exceeds max_batch_size or doesn't exist in cache + """ + active_batch_size = len(seq_ids_and_prompts) + + # Lookup table and seq_ids are redundant identical tensors. + lookup_table_tensor = Tensor.from_numpy( + np.array(list(seq_ids_and_prompts.keys()), np.uint32) + ) + cache_lengths_np = np.zeros(active_batch_size, np.uint32) + + max_seq_length = 0 + max_cache_length = 0 + + for i, (seq_id, prompt) in enumerate(seq_ids_and_prompts.items()): + if seq_id > self.max_batch_size: + msg = ( + f"seq_id: {seq_id}, beyond max_batch_size, you may" + " want to increase `max_batch_size` in the pipeline" + " config." + ) + raise ValueError(msg) + elif seq_id not in self.cache_lengths: + raise ValueError(f"seq_id: {seq_id} not currently in cache.") + + cache_len = self.cache_lengths[seq_id] + + assert ( + cache_len + len(prompt) + num_steps - 1 <= self.max_seq_len + ), ( + f"seq_id: {seq_id} would overrun the max cache length of {self.max_seq_len} " + f"with {len(prompt)} new tokens and {num_steps} steps. Existing length: {cache_len}" + ) + + cache_lengths_np[i] = cache_len + + # Update the maximum lengths seen so far. + max_seq_length = max(max_seq_length, len(prompt)) + max_cache_length = max(max_cache_length, cache_len) + + cache_lengths = [ + Tensor.from_numpy(cache_lengths_np).to(d) for d in self.devices + ] + lookup_table_tensor_list = [ + lookup_table_tensor.to(self.devices[i]) + for i in range(len(self.devices)) + ] + + # Build a tensor of maximum lengths. Each step slices the first row to + # advance to the values for the next row. + max_lengths_host = build_max_lengths_tensor( + num_steps, max_seq_length, max_cache_length + ) + + result = [ + RaggedKVCacheInputs( + blocks=self.blocks[i], + cache_lengths=cache_lengths[i], + lookup_table=lookup_table_tensor_list[i], + max_lengths=max_lengths_host, + ) + for i in range(len(self.devices)) + ] + return cast(List[KVCacheInputs], result) + + def block_shape(self, n_sequences: int) -> list[int]: + """Returns the shape of the KV cache blocks for the given number of sequences. + + Defines the 6-dimensional shape of the cache blocks used to store key and value + tensors for transformer attention. The dimensions represent: + [n_sequences, 2, num_layers, max_seq_len, n_kv_heads_per_device, head_dim] + where 2 represents separate storage for keys and values. + + Args: + n_sequences: Number of sequences that will be cached + + Returns: + List describing the shape of the cache blocks with dimensions for: + sequences, key/value split, layers, sequence length, attention heads, and head dimension + """ + return self._block_shape( + self.params, + n_sequences, + self.max_seq_len, + self.num_layers, + ) + + @staticmethod + def _block_shape( + params: KVCacheParams, + n_sequences: int, + max_seq_len: int, + num_layers: int, + ) -> list[int]: + return [ + n_sequences, + 2, + num_layers, + max_seq_len, + params.n_kv_heads_per_device, + params.head_dim, + ] + + def input_symbols( + self, + ) -> List[ContinuousBatchingKVCacheInputSymbols]: + """Returns the expected input tensor types for `fetch` on each device. + + Defines the tensor specifications needed by the cache implementation, + including shapes and data types. This is used for graph construction + and validation. + + Returns: + List of ContinuousBatchingKVCacheInputSymbols for each device + containing TensorTypes for: + - KV cache blocks: 6D tensor for storing keys and values + - Cache lengths: 1D tensor tracking sequence lengths + - Lookup table: 1D tensor mapping sequence IDs to cache positions + - Maximum lengths: 2D tensor tracking maximum sequence and cache lengths per step. + """ + return [ + ContinuousBatchingKVCacheInputSymbols( + kv_blocks=TensorType( + self.params.dtype, + shape=[ + "num_blocks", + 2, + "num_layers", + "max_seq_len", + "num_kv_heads", + "head_dim", + ], + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + cache_lengths=TensorType( + DType.uint32, + shape=["batch_size"], + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + lookup_table=TensorType( + DType.uint32, + shape=["batch_size"], + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + # max_lengths (on host) + max_lengths=TensorType( + DType.uint32, + shape=["steps_remaining", 2], + # TODO: This is a hack introduced to remediate a negative side effect + # of the graph compiler changes introduced in #52793. + # We are tricking the compiler into thinking that the max_lengths + # tensor is on the device, even though it is on the host. + # With #52793 graph compiler changes, the compiler would + # insert erroneous device transfers that lead to CUDA_ILLEGAL_ADDRESS + # errors if we don't do this forceful device specification. + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + ) + for i in range(len(self.devices)) + ] diff --git a/src/max/pipelines/kv_cache/hf.py b/src/max/pipelines/kv_cache/hf.py new file mode 100644 index 0000000000..7f0a32622c --- /dev/null +++ b/src/max/pipelines/kv_cache/hf.py @@ -0,0 +1,149 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from typing import Any, Optional, Union + +import numpy as np +import torch +from torch import device as torch_device +from transformers import PretrainedConfig, StaticCache + + +class ContinuousHFStaticCache(StaticCache): + def __init__( + self, + config: PretrainedConfig, + max_batch_size: int, + max_seq_len: int, + device: torch_device, + dtype: torch.dtype = torch.float32, + layer_device_map: Optional[ + dict[int, Union[str, torch_device, int]] + ] = None, + ) -> None: + super().__init__( + config, + max_batch_size, + max_seq_len, + device, + dtype, + None, + layer_device_map, + ) + self.max_batch_size = max_batch_size + self.device = device + self._init_slots() + + def _init_slots(self) -> None: + self.available_slots: set[int] = set(range(self.max_batch_size)) + self.active_slots: list[int] = [] + self.attention_patterns: dict[int, torch.Tensor] = {} + self.tokens: dict[int, np.ndarray] = {} + self.cache_position: torch.Tensor = torch.arange( + 0, + len(self.active_slots), + device=self.device, + ) + + def external_claim(self, seq_ids: list[int]) -> None: + if not self.available_slots: + raise RuntimeError("No slots are available for claiming.") + + unavailable_slots = set(seq_ids) - self.available_slots + if unavailable_slots: + raise ValueError( + f"The following seq_ids are already claimed: {unavailable_slots}" + ) + + for seq_id in seq_ids: + self.available_slots.remove(seq_id) + self.attention_patterns[seq_id] = torch.tensor( + [], dtype=torch.long, device=self.device + ) + self.tokens[seq_id] = np.array([]) + + def set_active_slots(self, seq_ids: list[int]) -> None: + self.active_slots = seq_ids + + def set_cache_position(self, cache_position: torch.Tensor): + self.cache_position = cache_position + + def update( + self, + key_states: torch.Tensor, + value_states: torch.Tensor, + layer_idx: int, + cache_kwargs: Optional[dict[str, Any]] = None, + ) -> tuple[torch.Tensor, torch.Tensor]: + cache_position = self.cache_position + + k_out = self.key_cache[layer_idx] + v_out = self.value_cache[layer_idx] + + # Prepare slot indices tensor once + slot_indices = torch.tensor(self.active_slots, device=self.device) + + # Update each sequence individually to handle different shapes correctly + for batch_idx, slot_idx in enumerate(self.active_slots): + k_out[slot_idx].index_copy_( + 1, cache_position, key_states[batch_idx] + ) + v_out[slot_idx].index_copy_( + 1, cache_position, value_states[batch_idx] + ) + + # Return reordered key value cache for the layer + return ( + k_out.index_select(0, slot_indices), + v_out.index_select(0, slot_indices), + ) + + def update_attention_pattern( + self, seq_id: int, attention_mask: torch.Tensor + ) -> None: + self.attention_patterns[seq_id] = attention_mask.to( + device=self.device, dtype=torch.long + ) + + def get_attention_mask(self, seq_ids: list[int]) -> torch.Tensor: + max_len = max( + self.attention_patterns[seq_id].size(0) for seq_id in seq_ids + ) + attention_mask = torch.zeros( + (len(seq_ids), max_len), dtype=torch.long, device=self.device + ) + + for i, seq_id in enumerate(seq_ids): + pattern = self.attention_patterns[seq_id] + attention_mask[i, : pattern.size(0)] = pattern + + return attention_mask + + def release(self, seq_id: int) -> None: + if seq_id in self.available_slots: + raise KeyError( + f"The seq_id {seq_id} is not currently claimed and cannot be released." + ) + + # Zero out cache tensors for the sequence + for layer_idx in range(len(self.key_cache)): + self.key_cache[layer_idx][seq_id].zero_() + self.value_cache[layer_idx][seq_id].zero_() + + self.available_slots.add(seq_id) + del self.attention_patterns[seq_id] + del self.tokens[seq_id] + + def reset(self) -> None: + super().reset() + self._init_slots() diff --git a/src/max/pipelines/kv_cache/manager.py b/src/max/pipelines/kv_cache/manager.py new file mode 100644 index 0000000000..7f124db394 --- /dev/null +++ b/src/max/pipelines/kv_cache/manager.py @@ -0,0 +1,542 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Abstract base class for KVCacheManager for KV Cache.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod +from collections import deque +from dataclasses import dataclass +from typing import Any, List, Sequence, cast, final + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import DeviceRef, Graph, TensorType, TensorValue + +from .cache_params import KVCacheParams + + +@dataclass +class _FetchMetadata: + """Metadata about sequences that are inflight. + + Inflight refers to sequences that have executed `fetch` but not `step`. + """ + + prompt: np.ndarray + num_steps: int + + +@dataclass +class KVCacheInputs: + """ + A base class that holds KV cache related (Tensor) inputs. + + It is meant to be subclassed by concrete KV cache input types. + + Example: + >>> @dataclass + ... class RaggedKVCacheInputs(KVCacheInputs): + ... blocks: Tensor + ... cache_lengths: Tensor + ... lookup_table: Tensor + ... max_lengths: Tensor + """ + + def __iter__(self): + """Iterates through each Type in order.""" + fields = deque( + getattr(self, field) for field in self.__dataclass_fields__ + ) + while fields: + value = fields.popleft() + if isinstance(value, Sequence) and all( + isinstance(x, KVCacheInputs) for x in value + ): + # Add sequence elements in original order + fields.extendleft([x for x in reversed(value)]) + continue + elif isinstance(value, KVCacheInputs): + fields.extendleft( + reversed( + [ + getattr(value, field) + for field in value.__dataclass_fields__ + ] + ) + ) + continue + else: + yield cast(Tensor, value) + + def __getitem__(self, index): + return list(self)[index] + + def __setitem__(self, index, value): + list(self)[index] = value + + def __len__(self): + count = 0 + # Iterate over all fields in the dataclass. If we run into a sequence of + # KVCacheInputs, we expand and recursively call `len` on the KVCacheInputs + # elements. + for field in self.__dataclass_fields__: + value = getattr(self, field) + if isinstance(value, Sequence) and all( + isinstance(x, KVCacheInputs) for x in value + ): + count += sum(len(x) for x in value) + else: + count += 1 + return count + + +@dataclass +class PaddedKVCacheInputs(KVCacheInputs): + """ + PaddedKVCacheInputs is a class that holds the inputs for + KV cache when used together with padded tensors. + """ + + k_cache: Tensor + v_cache: Tensor + start_pos: Tensor + null_op: Tensor + + +@dataclass +class RaggedKVCacheInputs(KVCacheInputs): + """ + RaggedKVCacheInputs is a class that holds the inputs for + KV cache when used together with ragged tensors. + """ + + blocks: Tensor + cache_lengths: Tensor + lookup_table: Tensor + max_lengths: Tensor + + +@dataclass +class KVCacheInputsSequence(KVCacheInputs): + """ + KVCacheInputsSequence is a sequence of KVCacheInputs. + It is primarily used in our multistep execution to represent batched + KVCacheInputs. + """ + + kv_cache_inputs: Sequence[KVCacheInputs] + + +@dataclass +class KVCacheInputSymbols: + """ + Base class for input symbols for KV cache managers. + + The derived class is responsible for defining the input symbols for the + specific KV cache manager. + + For example, here's a derived class for a text KV cache manager: + >>> @dataclass + ... class ContinuousBatchingKVCacheInputSymbols(KVCacheInputSymbols): + ... kv_blocks: TensorType + ... cache_lengths: TensorType + ... lookup_table: TensorType + ... max_lengths: TensorType + """ + + def __iter__(self): + """Iterates through each Type in order.""" + fields = deque( + getattr(self, field) for field in self.__dataclass_fields__ + ) + while fields: + value = fields.popleft() + if isinstance(value, KVCacheInputSymbols): + fields.extendleft( + reversed( + [ + getattr(value, field) + for field in value.__dataclass_fields__ + ] + ) + ) + continue + else: + yield value + + def __getitem__(self, index): + return list(self)[index] + + +class KVCacheManager(ABC): + def __init__( + self, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + devices: List[Device], + session: InferenceSession, + is_ragged: bool = False, + ) -> None: + self.params = params + self.max_batch_size = max_batch_size + self.max_seq_len = max_seq_len + self.num_layers = num_layers + self.devices = devices + self.session = session + + # Attributes for managing available slots. + self.available = set(range(self.max_batch_size)) + self.cache_lengths: dict[int, int] = {} + + self.is_ragged = is_ragged + increment_cache_lengths_graph = ( + self._create_increment_cache_lengths_graph() + ) + self.increment_cache_lengths_model = session.load( + increment_cache_lengths_graph + ) + self.fetch_metadata: dict[int, _FetchMetadata] = {} + + @classmethod + @abstractmethod + def estimated_memory_size( + cls, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, + ) -> int: + """Returns the estimated total memory usage of the kv cache.""" + ... + + @classmethod + @abstractmethod + def infer_optimal_batch_size( + cls, + params: KVCacheParams, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, + ) -> int: + """Returns the estimated optimal batch size for the kv cache.""" + ... + + @abstractmethod + def _fetch( + self, + seq_ids_and_prompts: dict[int, np.ndarray], + num_steps: int = 1, + ) -> List[KVCacheInputs]: + """Used by `fetch` and should be implemented by child classes.""" + ... + + @final + def fetch( + self, + seq_ids_and_prompts: dict[int, np.ndarray], + num_steps: int = 1, + ) -> List[KVCacheInputs]: + """Returns blocks and other inputs to kv cache kernel for given + sequence ids and prompts.""" + # Call into `_fetch` method implemented by child classes. + # This may trim the prompts in place so the fetch metadata is updated + # afterwards. + res = self._fetch(seq_ids_and_prompts, num_steps) + + # Update the fetch metadata for the given sequence ids and prompts. + for seq_id, prompt in seq_ids_and_prompts.items(): + assert seq_id not in self.fetch_metadata + self.fetch_metadata[seq_id] = _FetchMetadata( + prompt=prompt, + num_steps=num_steps, + ) + + return res + + @abstractmethod + def input_symbols( + self, + ) -> Sequence[KVCacheInputSymbols]: + """Returns the input symbols for the kv cache manager.""" + ... + + def claim(self, n: int) -> List[int]: + """Claims `n` blocks of memory in the cache for incoming requests. + + This returns a list of sequence ids, which identify a sequence's + location within the cache. This sequence id can then be passed + in the fetch function to return the ContinuousBatchingKVCacheCollection + for those sequences. + """ + # TODO we should remove this interface and just use external_claim. + seq_ids = [] + + for _ in range(n): + id = self.available.pop() + seq_ids.append(id) + self.cache_lengths[id] = 0 + + return seq_ids + + def external_claim(self, seq_ids: List[int]) -> None: + """Variant of the above where sequence ids are reserved externally.""" + for seq_id in seq_ids: + self.available.remove(seq_id) + self.cache_lengths[seq_id] = 0 + + def _step( + self, + seq_ids_and_new_tokens: dict[int, np.ndarray], + ) -> None: + """Used by `step` and can optionally be overridden by child classes.""" + ... + + def step(self, seq_ids_and_new_tokens: dict[int, np.ndarray]) -> None: + """Update the `cache_lengths` objects to note that a new + kv projection step has occurred, and that the underlying memory + has been written to. This `cache_lengths` value is then used + downstream in `fetch` to track what section of memory should + be used in the kernels. + """ + # Call into `_step` method possibly overridden by child classes. + self._step(seq_ids_and_new_tokens) + + # Update the cache lengths and delete the fetch metadata for the given + # sequence ids and prompts. + for seq_id, new_tokens in seq_ids_and_new_tokens.items(): + if seq_id not in self.cache_lengths: + raise ValueError(f"seq_id: {seq_id} not in cache.") + + assert seq_id in self.fetch_metadata + metadata = self.fetch_metadata[seq_id] + del self.fetch_metadata[seq_id] + + assert metadata.num_steps == len(new_tokens) + self.cache_lengths[seq_id] += ( + len(metadata.prompt) + metadata.num_steps - 1 + ) + + def release(self, seq_id: int) -> None: + """Release `seq_id` provided, marking this sequence as complete. + This returns the seq_id back to the available pool of cache memory, + allowing it to be reused when a new sequence is claimed. + """ + + if seq_id not in self.cache_lengths: + raise ValueError(f"seq_id: {id} not in cache.") + + self.available.add(seq_id) + del self.cache_lengths[seq_id] + + def contains(self, seq_id: int) -> bool: + return seq_id not in self.slots_remaining + + @property + def slots_remaining(self) -> set[int]: + """The outstanding cache slots available.""" + return self.available + + @property + def max_sequence_length(self) -> int: + """The maximum sequence length in current cache.""" + return max(self.cache_lengths.values()) + + def num_kv_inputs(self) -> int: + """Returns the default number of KV cache inputs for KV managers. + + Subclasses with a different number of KV cache inputs should override + this method and `increment_cache_lengths`. + """ + return 4 + + def increment_cache_lengths( + self, + kv_cache_inputs: List[RaggedKVCacheInputs] | List[PaddedKVCacheInputs], + prev_model_inputs: Any, + ) -> List[RaggedKVCacheInputs] | List[PaddedKVCacheInputs]: + """ + Prepare the inputs for a multistep execution, generally by incrementing + the cache lengths. This should not require a device synchronization, + as this would defeat the purpose of multistep execution. + + This should also not update the cache lengths in our manager, this batch is + still considered in-progress. + """ + if self.is_ragged: + return self._increment_cache_lengths_ragged( + kv_cache_inputs=cast( + list[RaggedKVCacheInputs], kv_cache_inputs + ), + prev_model_inputs=prev_model_inputs, + ) + + return self._increment_cache_lengths_padded( + kv_cache_inputs=cast(list[PaddedKVCacheInputs], kv_cache_inputs), + prev_model_inputs=prev_model_inputs, + ) + + def _increment_cache_lengths_ragged( + self, + kv_cache_inputs: List[RaggedKVCacheInputs], + prev_model_inputs: Any, + ) -> List[RaggedKVCacheInputs]: + """Prepares cache inputs for the next token in multistep execution. + + Updates the cache lengths for the next inference step without requiring device + synchronization or memory copies. This is crucial for maintaining performance + during multi-token generation. + + Args: + kv_cache_inputs: Current cache state tuples (blocks, lengths, lookup, max_lengths) + prev_model_inputs: Previous model inputs including row offsets + + Returns: + Updated cache input tuples with incremented lengths. + """ + blocks = [kv_cache_inputs[i].blocks for i in range(len(self.devices))] + cache_lengths = [ + kv_cache_inputs[i].cache_lengths for i in range(len(self.devices)) + ] + lookup_table = [ + kv_cache_inputs[i].lookup_table for i in range(len(self.devices)) + ] + + # max_lengths is host allocated and the same across all devices. + max_lengths = kv_cache_inputs[0].max_lengths + + # Update the cache_lengths of our batch by the previous sequence length. + updated_cache_lengths = self.increment_cache_lengths_model.execute( + prev_model_inputs.input_row_offsets, *cache_lengths + ) + + # Advance to the next step of the max_lengths tensor. + updated_max_lengths = max_lengths[1:, :] + + # Return our updated batch. + for i in range(len(self.devices)): + updated_cache_length = updated_cache_lengths[i] + assert isinstance(updated_cache_length, Tensor) + kv_cache_inputs[i] = RaggedKVCacheInputs( + blocks=blocks[i], + cache_lengths=updated_cache_length, + lookup_table=lookup_table[i], + max_lengths=updated_max_lengths, + ) + return kv_cache_inputs + + def _increment_cache_lengths_padded( + self, + kv_cache_inputs: List[PaddedKVCacheInputs], + prev_model_inputs: Any, + ) -> List[PaddedKVCacheInputs]: + """ + Prepare the inputs for a multistep execution, generally by incrementing + the cache lengths. This should not require a device synchronization, + as this would defeat the purpose of multistep execution. + + This should also not update the cache lengths in our manager, this batch is + still considered in-progress. + """ + assert len(kv_cache_inputs) == 1 + curr_kv_cache_inputs = kv_cache_inputs[0] + + new_start_pos = self.increment_cache_lengths_model( + curr_kv_cache_inputs.start_pos, prev_model_inputs.tokens + )[0] + assert isinstance(new_start_pos, Tensor) + return [ + PaddedKVCacheInputs( + k_cache=curr_kv_cache_inputs.k_cache, + v_cache=curr_kv_cache_inputs.v_cache, + start_pos=new_start_pos, + null_op=new_start_pos, + ) + ] + + def _create_increment_cache_lengths_graph(self) -> Graph: + """Constructs a graph to increment the cache_lengths argument during multi-step inference. + + It's imperative that this operation occurs entirely on GPU, + otherwise we'll synchronize across devices and incur a latency penalty. + """ + if self.is_ragged: + return self._create_ragged_increment_cache_lengths_graph() + + return self._create_padded_increment_cache_lengths_graph() + + def _create_padded_increment_cache_lengths_graph(self) -> Graph: + start_pos_type = TensorType(DType.int64, shape=[]) + tokens_type = TensorType(DType.int64, shape=["batch_size", "seq_len"]) + with Graph( + "update_start_pos", input_types=[start_pos_type, tokens_type] + ) as graph: + start_pos, tokens = graph.inputs + assert isinstance(start_pos, TensorValue) + assert isinstance(tokens, TensorValue) + graph.output(start_pos + tokens.shape[1]) + + return graph + + def _create_ragged_increment_cache_lengths_graph(self) -> Graph: + input_symbols = self.input_symbols() + cache_lengths_types = [ + input_symbols[i][1] for i in range(len(self.devices)) + ] + + input_row_offsets_type = TensorType( + DType.uint32, + shape=["input_row_offsets_len"], + device=DeviceRef(self.devices[0].label, self.devices[0].id), + ) + + with Graph( + "update_cache_lengths", + input_types=[input_row_offsets_type, *cache_lengths_types], + ) as graph: + inp_row_offset, *cache_lengths = graph.inputs + assert isinstance(inp_row_offset, TensorValue) + # broadcast the inp_row_offset to all devices (naive) + # get rid of this if statement after #51465 merges + if len(self.devices) > 1: + input_row_offsets = [ + inp_row_offset.to(DeviceRef(d.label, d.id)) + for d in self.devices + ] + else: + input_row_offsets = [inp_row_offset] + outputs = [] + for i in range(len(self.devices)): + cache_length = cache_lengths[i] + assert isinstance(cache_length, TensorValue) + right_slice = input_row_offsets[i][1:].rebind( + cache_length.shape + ) + left_slice = input_row_offsets[i][ + : input_row_offsets[i].shape[0] - 1 + ].rebind(cache_length.shape) + increment_amount = right_slice - left_slice + outputs.append(cache_length + increment_amount) + graph.output(*outputs) + + return graph diff --git a/src/max/pipelines/kv_cache/naive_cache.py b/src/max/pipelines/kv_cache/naive_cache.py new file mode 100644 index 0000000000..40ad2d9b5e --- /dev/null +++ b/src/max/pipelines/kv_cache/naive_cache.py @@ -0,0 +1,216 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Naive KV cache for the Transformer.""" + +from dataclasses import dataclass +from functools import reduce +from operator import mul +from typing import Any, List, cast + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import BufferType, TensorType + +from .cache_params import KVCacheParams +from .manager import ( + KVCacheInputs, + KVCacheInputSymbols, + KVCacheManager, + PaddedKVCacheInputs, +) + + +@dataclass +class NaiveKVCacheInputSymbols(KVCacheInputSymbols): + k_cache: BufferType + v_cache: BufferType + start_pos: TensorType + null_op: TensorType + + +class NaiveKVCacheManager(KVCacheManager): + def __init__( + self, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + devices: List[Device], + session: InferenceSession, + ) -> None: + assert len(devices) == 1, "Naive caching only supports a single device." + assert params.n_devices == 1, ( + "Naive caching only supports a single device." + ) + if params.enable_prefix_caching: + raise ValueError("Prefix caching is not supported for naive cache.") + super().__init__( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + devices=devices, + session=session, + is_ragged=False, + ) + + self.keys = Tensor.zeros( + shape=self.cache_shape, + dtype=self.params.dtype, + device=self.devices[0], + ) + + self.values = Tensor.zeros( + shape=self.cache_shape, + dtype=self.params.dtype, + device=self.devices[0], + ) + + @classmethod + def estimated_memory_size( + cls, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, + ) -> int: + return ( + reduce( + mul, + cls._cache_shape( + params, max_batch_size, max_seq_len, num_layers + ), + ) + * params.dtype.size_in_bytes + * 2 + ) + + @classmethod + def infer_optimal_batch_size( + cls, + params: KVCacheParams, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: List[Device], + **kwargs: Any, + ) -> int: + cache_size_per_sequence = ( + reduce( + mul, + cls._cache_shape(params, 1, max_seq_len, num_layers), + ) + * params.dtype.size_in_bytes + * 2 + ) + return int(available_cache_memory // cache_size_per_sequence) + + @property + def cache_shape(self) -> list[int]: + return self._cache_shape( + self.params, + self.max_batch_size, + self.max_seq_len, + self.num_layers, + ) + + @staticmethod + def _cache_shape( + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + ): + return [ + max_seq_len, + num_layers, + max_batch_size, + params.n_kv_heads, + params.head_dim, + ] + + def _fetch( + self, + seq_ids_and_prompts: dict[int, np.ndarray], + num_steps: int = 1, + ) -> List[KVCacheInputs]: + existing_keys = list(self.cache_lengths.keys()) + for i, (seq_id, prompt) in enumerate(seq_ids_and_prompts.items()): + if existing_keys[i] != seq_id: + msg = ( + "seq_ids passed, are different than current inflight" + " batch.Naive Caching currently does not support mutating" + " inflight batches." + ) + raise ValueError(msg) + + total_length = ( + self.cache_lengths[seq_id] + len(prompt) + num_steps - 1 + ) + assert total_length <= self.max_seq_len, ( + f"seq_id: {seq_id} would overrun the max cache length of {self.max_seq_len} " + f"with {len(prompt)} new tokens and {num_steps} steps. Existing length: {self.cache_lengths[seq_id]}" + ) + padded_kv_cache_inputs = [ + PaddedKVCacheInputs( + k_cache=self.keys, + v_cache=self.values, + start_pos=Tensor.scalar( + self.max_sequence_length, DType.int64, self.devices[0] + ), + # TODO: MSDK-1201 - This next variable is not used upstream. + # It is included here, as a placeholder, until we can dynamically + # return a number of tensors from both `fetch` and `input_symbols`. + null_op=Tensor.scalar( + self.max_sequence_length, DType.int64, self.devices[0] + ), + ) + ] + return cast(List[KVCacheInputs], padded_kv_cache_inputs) + + def input_symbols( + self, + ) -> List[NaiveKVCacheInputSymbols]: + return [ + NaiveKVCacheInputSymbols( + k_cache=BufferType( + self.params.dtype, + shape=[ + "max_seq_len", + self.num_layers, + "max_batch_size", + self.params.n_kv_heads, + self.params.head_dim, + ], + ), + v_cache=BufferType( + self.params.dtype, + shape=[ + "max_seq_len", + self.num_layers, + "max_batch_size", + self.params.n_kv_heads, + self.params.head_dim, + ], + ), + start_pos=TensorType(DType.int64, shape=[]), + # null_op - this isnt used for the naive cache + null_op=TensorType(DType.int64, shape=[]), + ) + ] diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py new file mode 100644 index 0000000000..7c814828be --- /dev/null +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -0,0 +1,746 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""PagedAttention-enabled KV cache for the Transformer leveraging the mo.opaque pattern.""" + +from __future__ import annotations + +import logging +import math +from dataclasses import dataclass +from functools import reduce +from operator import mul +from typing import Any, Dict, List, Optional, cast + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import ( + DeviceRef, + TensorType, + TensorValue, + _OpaqueType, + _OpaqueValue, + ops, +) + +from ._utils import build_max_lengths_tensor +from .cache_params import KVCacheParams +from .manager import ( + KVCacheInputs, + KVCacheInputSymbols, + KVCacheManager, + RaggedKVCacheInputs, +) +from .paged_cache_metadata import PagedCacheMetadata, ceildiv +from .prefix_cache import PrefixCache + +logger = logging.getLogger("max.pipelines") + +PERCENTAGE_BLOCKS_TO_EVICT = 0.05 + + +@dataclass +class PagedCacheInputSymbols(KVCacheInputSymbols): + kv_blocks: TensorType + cache_lengths: TensorType + lookup_table: TensorType + max_lengths: TensorType + + +class PagedKVCacheType(_OpaqueType): + """PagedAttention Mojo KV Cache graph type.""" + + def __init__(self) -> None: + """Creates an opaque type containing a paged KV Cache.""" + super().__init__("PagedKVCache") + + +class PagedKVCacheCollectionType(_OpaqueType): + """The graph type for a "view" of the cache for the given sequences in the + batch. + + This object does not own the underlying buffers in k_cache and v_cache, + it's borrowing them from the BlockWrappers in our ContinuousKVCacheManager. + It does own the Pointer[NDBuffer[type, 3]] and valid_lengths buffer + """ + + def __init__(self) -> None: + """Creates an opaque type containing a paged KV cache collection.""" + super().__init__("PagedKVCacheCollection") + + +class PagedKVCache(_OpaqueValue): + """PagedAttention Mojo KV cache graph value.""" + + +class PagedKVCacheCollection(_OpaqueValue): + """The graph value for a view of the KV cache.""" + + +class FetchPagedKVCacheCollection: + def __init__(self, kv_params: KVCacheParams) -> None: + self.kv_params = kv_params + + def __call__( + self, + blocks: TensorValue, # NDBuffer[type, 6, Self.blocks_shape] + cache_lengths: TensorValue, # NDBuffer[DType.uint32, 1], + lookup_table: TensorValue, # NDBuffer[DType.uint32, 2], + is_cache_empty: TensorValue, + ) -> PagedKVCacheCollection: + """Constructs a PagedKVCacheCollection for use downstream.""" + + # Explicit validation. + if blocks.dtype != self.kv_params.dtype: + msg = ( + f"expected blocks to be dtype: {self.kv_params.dtype}, got" + f" {blocks.dtype}" + ) + raise ValueError(msg) + + if blocks.rank != 6: + msg = f"expected blocks to be of rank 6, got {blocks.rank}" + raise ValueError(msg) + + # For all tensors other than the blocks tensor, the length should be equivalent + # to batch size, which is unknown within the graph at this stage. + if cache_lengths.dtype != DType.uint32: + msg = f"expected cache lengths to be dtype: uint32, got {cache_lengths.dtype}" + raise ValueError(msg) + + if cache_lengths.rank != 1: + msg = f"expected cache lengths to be of rank 1, got {cache_lengths.rank}" + raise ValueError(msg) + + if lookup_table.dtype != DType.uint32: + msg = f"expected lookup_table to be dtype: uint32, got {lookup_table.dtype}" + raise ValueError(msg) + + if lookup_table.rank != 2: + msg = f"expected lookup_table to be of rank 2, got {lookup_table.rank}" + raise ValueError(msg) + + return PagedKVCacheCollection( + ops.custom( + "mo.kv_collection_ctor.paged", + values=[blocks, cache_lengths, lookup_table, is_cache_empty], + out_types=[PagedKVCacheCollectionType()], + parameters={ + "num_heads": self.kv_params.n_kv_heads_per_device, + "head_dim": self.kv_params.head_dim, + "page_size": int(blocks.shape[3]), + }, + )[0].opaque + ) + + +class PagedKVCacheManager(KVCacheManager): + def __init__( + self, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + devices: list[Device], + session: InferenceSession, + cache_memory: int, + page_size: int = 128, + enable_runtime_checks: bool = False, + ): + """ + Args: + params: The KVCacheParams for the given pipeline. + max_batch_size: The maximum number of active + requests that the manager should support. + max_seq_len: The maximum sequence length we will generate. + num_layers: The number of layers in the model. + devices: The devices on which the manager will allocate memory. + session: The inference session to load ops from. + cache_memory: The total amount of memory available for caching. + This is aggregated across all devices. + page_size: The number of tokens that will be stored in a single page. + enable_runtime_checks: Whether to enable runtime correctness checks. + """ + # The number of tokens in a single page. + self.page_size = page_size + + # The number of bytes that a single page will occupy. + single_page_size_bytes = ( + 2 + * num_layers + * params.n_kv_heads_per_device + * params.head_dim + * page_size + * params.dtype.size_in_bytes + ) + + # Normalize cache_memory across all devices. + cache_memory_per_device = cache_memory // len(devices) + + # The total number of pages we'll have per-device. + self.total_num_pages = int( + cache_memory_per_device // single_page_size_bytes + ) + + if self.total_num_pages == 0: + raise RuntimeError( + f"Insufficient cache memory to allocate even a single page.\n" + f"One page requires {single_page_size_bytes} bytes but only {cache_memory_per_device} bytes are available." + ) + + if max_batch_size > self.total_num_pages: + logger.warning( + f"Insufficient cache memory to support a batch containing {max_batch_size} requests with one token per request. " + f"Need to allocate at least {max_batch_size} blocks, but only have enough memory for {self.total_num_pages} blocks. " + f"One page requires {single_page_size_bytes} bytes but only {cache_memory_per_device} bytes are available." + ) + + blocks_needed_for_max_seq_len = ceildiv(max_seq_len, page_size) + if blocks_needed_for_max_seq_len > self.total_num_pages: + logger.warning( + f"Insufficient cache memory to support a batch containing one request at the max sequence length of {max_seq_len} tokens. " + f"Need to allocate at least {blocks_needed_for_max_seq_len} blocks, but only have enough memory for {self.total_num_pages} blocks. " + f"One page requires {single_page_size_bytes} bytes but only {cache_memory_per_device} bytes are available." + ) + + # call our base class constructor + super().__init__( + params=params, + max_batch_size=max_batch_size, + max_seq_len=max_seq_len, + num_layers=num_layers, + devices=devices, + session=session, + is_ragged=True, + ) + + # Initialize the set of available blocks. + self.available_blocks = set(range(self.total_num_pages)) + + # Initialize the blocks for each device. + self.blocks: list[Tensor] = [] + for device in self.devices: + self.blocks.append( + Tensor.zeros( + self.block_shape(), # type: ignore + self.params.dtype, + device=device, + ) + ) + + self.active_requests: Dict[int, PagedCacheMetadata] = {} + + self.prefix_cache: Optional[PrefixCache] = None + if params.enable_prefix_caching: + self.prefix_cache = PrefixCache( + session=session, + page_size=self.page_size, + block_shape=self.block_shape(is_parameterized=True), + dtype=self.params.dtype, + devices=devices, + tensors=self.blocks, + ) + + # Whether to enable runtime correctness checks. These correctness checks + # are expensive and should only be used in tests. + self.enable_runtime_checks = enable_runtime_checks + + def _runtime_check(self) -> None: + if not self.enable_runtime_checks: + return + assert self._count_all_pages() == self.total_num_pages + if self.prefix_cache is None: + return + for seq_id, data in self.active_requests.items(): + self.prefix_cache.validate_req_state_valid( + seq_id, + data.committed_tokens, + data.committed_blocks, + ) + + @property + def cache_hit_rate(self) -> float: + if self.prefix_cache is None: + return 0.0 + return self.prefix_cache.cache_hit_rate + + def alloc_block(self) -> int: + if len(self.available_blocks) == 0 and self.prefix_cache is not None: + blocks_to_evict = self.total_num_pages * PERCENTAGE_BLOCKS_TO_EVICT + blocks_to_evict = int(max(1, blocks_to_evict)) + evicted = self.prefix_cache.evict_blocks(blocks_to_evict) + for block in evicted: + self.available_blocks.add(block) + + if len(self.available_blocks) == 0: + raise RuntimeError( + f"All {self.total_num_pages} KVCache pages have been exhausted! " + "You must restart your process and set a smaller batch size or max seq len." + ) + + block = self.available_blocks.pop() + return block + + def release_block(self, block: int) -> None: + """We can release a block if prefix caching is disabled or if it is not committed. + + If it is committed, it may be in the radix tree and in use by other sequences. + This means it can't be safely released without further checks. + """ + if self.prefix_cache is None: + self.available_blocks.add(block) + return + + # We can only add the block to the available set if it is not committed + # to the prefix cache. + if block not in self.prefix_cache: + self.available_blocks.add(block) + + @classmethod + def _block_size_per_token( + cls, params: KVCacheParams, num_layers: int + ) -> int: + return ( + reduce(mul, cls._block_shape(params, 1, 1, num_layers), 1) + * params.dtype.size_in_bytes + ) + + @classmethod + def estimated_memory_size( + cls, + params: KVCacheParams, + max_batch_size: int, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: list[Device], + **kwargs: Any, + ) -> int: + # Determine how much size is necessary to store the full cache based on max_batch_size and max_seq_len. + # If that's less than available_cache_memory, return that. + # Otherwise, return available_cache_memory. + # This is to prevent over-allocation on devices with a large amount of free memory (e.g. CPUs). + assert params.page_size is not None + block_size_per_token = cls._block_size_per_token( + params, num_layers + ) * len(devices) + + # round up our max_seq_len to the nearest page_size + max_seq_len_round_up = ( + math.ceil(max_seq_len / params.page_size) * params.page_size + ) + size_to_support_full_cache = ( + block_size_per_token * max_batch_size * max_seq_len_round_up + ) + + # return the minimum of the two + return min(available_cache_memory, size_to_support_full_cache) + + @classmethod + def infer_optimal_batch_size( + cls, + params: KVCacheParams, + max_seq_len: int, + num_layers: int, + available_cache_memory: int, + devices: list[Device], + **kwargs: Any, + ) -> int: + # We just hard-code a default of 512 for paged attention. + # The worst case scenario if this is too high is that we'll evict + # requests at an elevated rate. We print warnings in that case so users + # are aware of what needs to be tweaked/changed. + return 512 + + def block_shape( + self, + is_parameterized: bool = False, + ) -> list[int | str]: + return self._block_shape( + self.params, + self.total_num_pages, + self.page_size, + self.num_layers, + is_parameterized, + ) + + @classmethod + def _block_shape( + cls, + params: KVCacheParams, + total_num_pages: int, + page_size: int, + num_layers: int, + is_parameterized: bool = False, + ) -> list[int | str]: + # split k and v caches across a single dim + # 0 = key + # 1 = value + kv_dim = 2 + return [ + num_layers, + kv_dim, + "total_num_pages" if is_parameterized else total_num_pages, + page_size, + params.n_kv_heads_per_device, + params.head_dim, + ] + + def get_num_free_blocks(self) -> int: + if self.prefix_cache is None: + return len(self.available_blocks) + return len(self.available_blocks) + len(self.prefix_cache.stale_blocks) + + def get_num_used_blocks(self) -> int: + return self.total_num_pages - self.get_num_free_blocks() + + def can_fetch( + self, seq_ids_and_prompts: dict[int, np.ndarray], num_steps: int = 1 + ) -> bool: + """Checks if there are sufficient KV pages to run `fetch` on given batch. + + It is OK if some seq_id are not in the cache. We assume the cache lengths + are zero in those cases. + """ + + total_blocks_to_allocate = 0 + all_cache_hit_blocks: set[int] = set() + + for seq_id, prompt in seq_ids_and_prompts.items(): + data = self.active_requests.get( + seq_id, PagedCacheMetadata(self.page_size, self.max_seq_len) + ) + + # Extend the kv cache for given request with any cached prefixes. + cached_blocks: list[int] = [] + if self.prefix_cache is not None: + cached_blocks = self.prefix_cache.get_cached_blocks( + seq_id, prompt + ) + + # Compute the total sequence length and the number of pages required to store it. + total_sequence_length = ( + data.cached_idx + len(prompt) + num_steps - 1 + ) + num_pages_required = ceildiv(total_sequence_length, self.page_size) + + # Compute the number of *new* pages we need to allocate. + blocks_to_allocate = ( + num_pages_required - len(data.blocks) - len(cached_blocks) + ) + + total_blocks_to_allocate += blocks_to_allocate + all_cache_hit_blocks.update(cached_blocks) + + num_evictable_blocks = 0 + if self.prefix_cache is not None: + # the blocks in the prefix cache that will be used by sequences in + # this batch are no longer eligible for eviction / allocation. + num_evictable_blocks = len( + self.prefix_cache.stale_blocks - all_cache_hit_blocks + ) + + num_free_blocks = len(self.available_blocks) + num_evictable_blocks + + return total_blocks_to_allocate <= num_free_blocks + + def get_num_cached_tokens(self, prompt: np.ndarray) -> int: + """Returns the number of tokens in the CE prompt that are found in the + prefix cache. + """ + if self.prefix_cache is None: + return 0 + return self.prefix_cache.get_num_cached_tokens(prompt) + + def _fetch( + self, seq_ids_and_prompts: dict[int, np.ndarray], num_steps: int = 1 + ) -> List[KVCacheInputs]: + """This method identifies available blocks to service the given requests and marks them as inflight. + They're assigned to the request as "in-flight" until step is called. + + Generally the prompt length is n for prefill, and 1 for decode step. Additionally, there is not a + kv entry associated with each token in the prompt. + + When prefix caching is enabled, and KV entries can be retrieved for some tokens in the prompt, the + input `seq_ids_and_prompts` will be modified. Each prompt will be shortened to only include the tokens + for which we do not have a cached KV entry. Note that we will never return a empty prompt. + """ + self._runtime_check() + + max_seq_len_in_batch = -1 + # before we start making any changes, validate that we won't over-write the cache + for batch_idx, (seq_id, prompt) in enumerate( + seq_ids_and_prompts.items() + ): + # Validate there aren't other inflight requests for this sequence. + assert seq_id not in self.fetch_metadata + + # Add prompt and inflight tokens to the token array + data = self.active_requests[seq_id] + data.fetch(prompt, num_steps) + + # Compute the total sequence length + if data.seq_len > max_seq_len_in_batch: + max_seq_len_in_batch = data.seq_len + + assert data.seq_len <= self.max_seq_len, ( + f"seq_id: {seq_id} would overrun the max cache length of {self.max_seq_len} " + f"with {len(prompt)} new tokens. Existing length: {data.cached_idx}" + ) + + max_num_pages = ceildiv(max_seq_len_in_batch, self.page_size) + + # Allocate the buffers containing metadata about the batch. + # [0, total_num_pages) are the valid block ids and total_num_pages + # denotes an unassigned block. + batch_size = len(seq_ids_and_prompts) + lut_table_np = np.full( + (batch_size, max_num_pages), self.total_num_pages, dtype=np.uint32 + ) + cache_lengths_np = np.zeros((batch_size,), dtype=np.uint32) + + # Iterate over requests and query prefix cache + all_cache_hit_blocks: set[int] = set() + for batch_idx, (seq_id, prompt) in enumerate( + seq_ids_and_prompts.items() + ): + # Ensure we've called claim for this sequence id. + if seq_id not in self.active_requests: + raise ValueError(f"seq_id: {seq_id} not in active requests.") + + if self.prefix_cache is not None: + data = self.active_requests[seq_id] + # bump the committed_idx, and possibly the cached_idx + prefix_blocks = self.prefix_cache.fetch( + seq_id, + data, + free_block_fn=self.release_block, + alloc_block_fn=self.alloc_block, + ) + all_cache_hit_blocks.update(prefix_blocks) + # Possibly trim the input prompt. + seq_ids_and_prompts[seq_id] = data.prompt_tokens + + # Determine the number of pages required for each sequence. + max_seq_length = 0 + max_cache_length = 0 + total_sequence_length = 0 + total_blocks_to_allocate = 0 + blocks_to_allocate_by_seq = {} + for batch_idx, (seq_id, prompt) in enumerate( + seq_ids_and_prompts.items() + ): + data = self.active_requests[seq_id] + + # Get the existing cache length for this sequence. + cache_length = data.cached_idx + cache_lengths_np[batch_idx] = cache_length + + # Update the maximum lengths seen so far. + max_seq_length = max(max_seq_length, len(prompt)) + max_cache_length = max(max_cache_length, cache_length) + + # Compute the total sequence length and the number of pages required to store it. + total_sequence_length += data.seq_len + num_pages_required = ceildiv(data.seq_len, self.page_size) + + # Compute the number of *new* pages we need to allocate. + num_new_pages = num_pages_required - len(data.blocks) + assert num_new_pages >= 0 + blocks_to_allocate_by_seq[seq_id] = num_new_pages + total_blocks_to_allocate += num_new_pages + + # Check if we have enough free blocks to service all requests. + num_evictable_blocks = 0 + if self.prefix_cache is not None: + # the blocks in the prefix cache that will be used by sequences in + # this batch are no longer eligible for eviction / allocation. + num_evictable_blocks = len( + self.prefix_cache.stale_blocks - all_cache_hit_blocks + ) + num_free_blocks = len(self.available_blocks) + num_evictable_blocks + if total_blocks_to_allocate > num_free_blocks: + raise RuntimeError( + f"Not enough free blocks to service all {len(seq_ids_and_prompts)} requests.\n" + f"Need an additional {total_blocks_to_allocate} blocks to store KV projections for all {total_sequence_length} tokens.\n" + f"But only {num_free_blocks} out of {self.total_num_pages} cache blocks are available to be allocated.\n" + f"You must restart your process and set a smaller batch size or max sequence length.\n" + ) + + # Allocate additional pages for each request in the batch + for batch_idx, (seq_id, num_new_pages) in enumerate( + blocks_to_allocate_by_seq.items() + ): + data = self.active_requests[seq_id] + + # Assign some new pages to this request. + for _ in range(num_new_pages): + next_block = self.alloc_block() + data.blocks.append(next_block) + + # Populate the lookup table with the new pages. + for i, block_idx in enumerate(data.blocks): + lut_table_np[batch_idx, i] = block_idx + + # Build a tensor of maximum lengths. Each step slices the first row to + # advance to the values for the next row. + max_lengths_host = build_max_lengths_tensor( + num_steps, max_seq_length, max_cache_length + ) + + lut_table_host = Tensor.from_numpy(lut_table_np) + cache_lengths_host = Tensor.from_numpy(cache_lengths_np) + + ret_list = [] + for i, device in enumerate(self.devices): + ret_list.append( + RaggedKVCacheInputs( + blocks=self.blocks[i], + cache_lengths=cache_lengths_host.to(device=device), + lookup_table=lut_table_host.to(device=device), + max_lengths=max_lengths_host, + ) + ) + + self._runtime_check() + + return cast(List[KVCacheInputs], ret_list) + + def input_symbols( + self, + ) -> list[PagedCacheInputSymbols]: + return [ + PagedCacheInputSymbols( + kv_blocks=TensorType( + self.params.dtype, + shape=self.block_shape(is_parameterized=True), + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + cache_lengths=TensorType( + DType.uint32, + shape=["batch_size"], + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + lookup_table=TensorType( + DType.uint32, + shape=["batch_size", "max_num_pages"], + device=DeviceRef(self.devices[i].label, self.devices[i].id), + ), + max_lengths=TensorType( + DType.uint32, shape=["steps_remaining", 2] + ), + ) + for i in range(len(self.devices)) + ] + + def claim(self, n: int) -> list[int]: + """Claims `n` blocks of memory in the cache for incoming requests. + + This returns a list of sequence ids, which identify a sequence's + location within the cache. This sequence id can then be passed + in the fetch function to return the ContinuousBatchingKVCacheCollection + for those sequences. + """ + seq_ids = super().claim(n) + for seq_id in seq_ids: + self.active_requests[seq_id] = PagedCacheMetadata( + self.page_size, self.max_seq_len + ) + if self.prefix_cache is not None: + for seq_id in seq_ids: + self.prefix_cache.external_claim(seq_id) + return seq_ids + + def external_claim(self, seq_ids: list[int]) -> None: + """Variant of the above where sequence ids are reserved externally.""" + super().external_claim(seq_ids) + for seq_id in seq_ids: + self.active_requests[seq_id] = PagedCacheMetadata( + self.page_size, self.max_seq_len + ) + if self.prefix_cache is not None: + for seq_id in seq_ids: + self.prefix_cache.external_claim(seq_id) + + def _count_all_pages(self) -> int: + available_blocks = self.available_blocks + prefix_cache_blocks = set() + if self.prefix_cache is not None: + prefix_cache_blocks = self.prefix_cache.blocks + uncommitted_blocks = set() + for seq_id in self.active_requests: + uncommitted_blocks.update( + self.active_requests[seq_id].uncommitted_blocks + ) + return len(available_blocks | prefix_cache_blocks | uncommitted_blocks) + + def purge_prefix_cache(self) -> None: + if self.prefix_cache is None: + return + evicted = self.prefix_cache.evict_blocks() + for block in evicted: + self.available_blocks.add(block) + + def release(self, seq_id: int) -> None: + """Release `seq_id` provided, marking this sequence as complete. + This returns the seq_id back to the available pool of cache memory, + allowing it to be reused when a new sequence is claimed. + """ + super().release(seq_id) + data = self.active_requests[seq_id] + + if self.prefix_cache is not None: + self.prefix_cache.release(seq_id) + + for block in data.blocks: + self.release_block(block) + del self.active_requests[seq_id] + + def _step( + self, + seq_ids_and_new_tokens: dict[int, np.ndarray], + ) -> None: + """Update the `cache_lengths` objects to not that a new + kv projection step has occurred, and that the underlying memory + has been written to. This `cache_lengths` value is then used + downstream in `fetch` to track what section of memory should + be used in the kernels. + """ + self._runtime_check() + + for seq_id, new_tokens in seq_ids_and_new_tokens.items(): + if seq_id not in self.active_requests: + raise ValueError(f"seq_id: {seq_id} not in active requests.") + + # Write the new tokens into the token array and bump the cached_idx + data = self.active_requests[seq_id] + data.step(new_tokens) + + if self.prefix_cache is not None: + # Bump the committed_idx + self.prefix_cache.step( + seq_id, + data, + free_block_fn=self.release_block, + ) + + expected_num_pages = ceildiv(data.seq_len, self.page_size) + actual_num_pages = len(data.blocks) + if expected_num_pages != actual_num_pages: + raise ValueError( + f"Mismatch between expected and actual number of pages for seq_id: {seq_id}. Expected: {expected_num_pages}, Actual: {actual_num_pages}" + ) + + self._runtime_check() diff --git a/src/max/pipelines/kv_cache/paged_cache_metadata.py b/src/max/pipelines/kv_cache/paged_cache_metadata.py new file mode 100644 index 0000000000..abeb8f7a40 --- /dev/null +++ b/src/max/pipelines/kv_cache/paged_cache_metadata.py @@ -0,0 +1,171 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""PagedAttention-specific metadata for a single sequence.""" + +from __future__ import annotations + +import numpy as np + + +def ceildiv(n: int, d: int) -> int: + """Compute ceil(n/d) using strictly integer arithmetic.""" + q, r = divmod(n, d) + return q + bool(r) + + +class PagedCacheMetadata: + """Metadata for a single sequence in the paged KV cache. + + Token array layout: + + - Committed tokens have been inserted into the prefix cache. This must be a + multiple of the page size. + - Cached tokens are tokens that have a backing KV projection in the cache. + Uncached tokens will be written to the cache when the model is run. + - Committable tokens are tokens that are not yet committed but have a known + value (i.e. not inflight). We can query the prefix cache for such tokens. + - Inflight tokens are slots allocated for tokens that have not been generated + yet. Such tokens have a filler value of 0. After `fetch`, there should be + `num_steps - 1` inflight tokens. They will be replaced with actual tokens + in `step`. + + committed_idx V seq_len V + +----------------------------------------------------------------+ + | committed | uncommitted | + |----------------------------------------------------------------| + | | committable | | + |----------------------------------------------------------------| + | cached | uncached | + |----------------------------------------------------------------| + | | prompt | inflight | + +----------------------------------------------------------------+ + cached_idx ^ inflight_idx ^ + """ + + def __init__(self, page_size: int, max_seq_len: int) -> None: + self.page_size = page_size + self.committed_idx: int = 0 + self.cached_idx: int = 0 + self.inflight_idx: int = 0 + self.seq_len: int = 0 + self.blocks: list[int] = [] + self.tokens: np.ndarray = np.full((max_seq_len,), 0, dtype=np.int64) + + @property + def committed_blocks(self) -> list[int]: + return self.blocks[: self.committed_idx // self.page_size] + + @property + def uncommitted_blocks(self) -> list[int]: + return self.blocks[self.committed_idx // self.page_size : self.seq_len] + + @property + def committed_tokens(self) -> np.ndarray: + return self.tokens[: self.committed_idx] + + @property + def uncached_tokens(self) -> np.ndarray: + return self.tokens[self.cached_idx : self.seq_len] + + @property + def prompt_tokens(self) -> np.ndarray: + return self.tokens[self.cached_idx : self.inflight_idx] + + @property + def inflight_tokens(self) -> np.ndarray: + return self.tokens[self.inflight_idx : self.seq_len] + + @property + def committable_tokens_aligned(self) -> np.ndarray: + # Return all tokens that are committable and part of a block that only + # contains committable tokens. + inflight_idx = self.inflight_idx + partial_tokens = inflight_idx % self.page_size + if partial_tokens > 0: + inflight_idx -= partial_tokens + return self.tokens[self.committed_idx : inflight_idx] + + @property + def committable_blocks_aligned(self) -> list[int]: + # Returns all blocks that only contain committable tokens. + return self.blocks[ + self.committed_idx // self.page_size : self.inflight_idx + // self.page_size + ] + + @property + def committable_tokens(self) -> np.ndarray: + # Returns all tokens that are committable. + return self.tokens[self.committed_idx : self.inflight_idx] + + @property + def committable_blocks(self) -> list[int]: + # Returns any block that contains at least one committable token. + return self.blocks[ + self.committed_idx // self.page_size : ceildiv( + self.inflight_idx, self.page_size + ) + ] + + def _validate_indices(self): + assert ( + 0 + <= self.committed_idx + <= self.cached_idx + <= self.inflight_idx + <= self.seq_len + ), "The indices must be in the correct order" + assert self.seq_len <= len(self.tokens), ( + "Sequence has exceeded the max sequence length" + ) + assert self.committed_idx % self.page_size == 0, ( + "The committed_idx must be a multiple of the page size since we " + "can't commit a partial page into the prefix cache" + ) + + def fetch(self, prompt: np.ndarray, num_steps: int) -> None: + """Add prompt to token array and reserve space for inflight tokens.""" + self._validate_indices() + assert len(self.prompt_tokens) == 0, ( + "At the start of fetch, there should be no prompt tokens" + ) + assert len(self.inflight_tokens) == 0, ( + "At the start of fetch, there should be no inflight tokens" + ) + assert len(prompt) > 0, ( + "The prompt provided to fetch should be non-empty" + ) + num_inflight_tokens = num_steps - 1 + self.inflight_idx += len(prompt) + self.seq_len += len(prompt) + num_inflight_tokens + self.tokens[self.cached_idx : self.inflight_idx] = prompt + self._validate_indices() + + def step(self, new_tokens: np.ndarray) -> None: + """Write new tokens into inflight token slots. Also update the cached_idx.""" + self._validate_indices() + assert len(self.prompt_tokens) > 0, ( + "We could not have executed the model without at least one prompt token" + ) + num_inflight_tokens = len(new_tokens) - 1 + assert len(self.inflight_tokens) == num_inflight_tokens, ( + "The existing slots for inflight tokens should correspond to all but the last newly generated token" + ) + self.tokens[self.inflight_idx : self.seq_len] = new_tokens[:-1] + self.cached_idx = self.seq_len + self.inflight_idx = self.seq_len + assert len(self.uncached_tokens) == 0, ( + "After step, all tokens should have a backing KV projection in the cache" + ) + self._validate_indices() diff --git a/src/max/pipelines/kv_cache/prefix_cache.py b/src/max/pipelines/kv_cache/prefix_cache.py new file mode 100644 index 0000000000..191f53ffd2 --- /dev/null +++ b/src/max/pipelines/kv_cache/prefix_cache.py @@ -0,0 +1,369 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Prefix cache to enable reuse of KV projections during context encoding with PagedAttention.""" + +from __future__ import annotations + +from typing import Callable, Optional + +import numpy as np +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession +from max.graph import BufferType, DeviceRef, Graph, TensorType, ops + +from .paged_cache_metadata import PagedCacheMetadata +from .radix_trie import RadixTrie, TrieNode + + +def construct_cow_strided_memcpy_graph( + block_shape: list[int | str], dtype: DType, devices: list[Device] +) -> Graph: + """ + Returns a graph for performing COW operations on the KV cache. + """ + assert len(block_shape) == 6 + ds = [DeviceRef(device.label, device.id) for device in devices] + blocks_ty = [BufferType(dtype, shape=block_shape, device=d) for d in ds] + block_src_idx_ty = TensorType(DType.uint32, shape=[]) + block_dst_idx_ty = TensorType(DType.uint32, shape=[]) + num_tokens_ty = TensorType(DType.uint32, shape=[]) + + with Graph( + "mo.kv_collection_cow_strided_memcpy.paged", + input_types=[ + block_dst_idx_ty, + block_src_idx_ty, + num_tokens_ty, + *blocks_ty, + ], + output_types=[], + ) as graph: + block_dst_idx, block_src_idx, num_tokens, *all_blocks = graph.inputs + for blocks in all_blocks: + ops.inplace_custom( + "mo.kv_collection_cow_strided_memcpy.paged", + values=[blocks, block_dst_idx, block_src_idx, num_tokens], + out_types=[], + ) + graph.output() + + return graph + + +class PrefixCache: + def __init__( + self, + session: InferenceSession, + page_size: int, + block_shape: list[int | str], + dtype: DType, + devices: list[Device], + tensors: list[Tensor], + enable_cow: bool = True, + ): + self.page_size = page_size + self.enable_cow = enable_cow + self.radix_trie = RadixTrie(page_size=self.page_size) + self.tensors = tensors + + self.cow_count = 0 + if self.enable_cow and self.page_size > 1: + # Load single op graph for performing memory transfers needed for COW + self.cow_strided_memcpy_graph = session.load( + construct_cow_strided_memcpy_graph( + block_shape, + dtype, + devices, + ), + ) + self.all_tokens = 0 + self.cache_hit_tokens = 0 + + # This is a pointer into the radix trie indicating the prefix of the sequence + # that has been committed into the radix trie. + self.active_requests: dict[int, TrieNode] = {} + + def __contains__(self, block: int) -> bool: + """Check if a block is owned by the prefix cache.""" + return block in self.radix_trie.get_all_blocks() + + def external_claim(self, seq_id: int) -> None: + """Claim a sequence for use by the prefix cache. + + This initializes the cursor in the trie for the given sequence at the + root, indicating that no blocks are committed for this sequence yet. + """ + assert seq_id not in self.active_requests + self.active_requests[seq_id] = self.radix_trie.root + + def release(self, seq_id: int) -> None: + """Release a sequence from the prefix cache. + + This decrements the ref count of committed blocks used by the sequence. + """ + assert seq_id in self.active_requests + node = self.active_requests[seq_id] + self.radix_trie.mark_not_in_use_by(node, seq_id) + del self.active_requests[seq_id] + + @property + def blocks(self) -> set[int]: + """Returns all blocks owned by the prefix cache.""" + return self.radix_trie.get_all_blocks() + + @property + def stale_blocks(self) -> set[int]: + """Returns all blocks that are evictable/stale. + + Stale blocks are those that are not in use by any sequence (refcount == 0) + """ + return self.radix_trie.get_evictable_blocks() + + @property + def cache_hit_rate(self) -> float: + """Returns the prefix cache hit rate.""" + if self.all_tokens == 0: + return 0.0 + assert self.cache_hit_tokens <= self.all_tokens + return self.cache_hit_tokens / self.all_tokens + + def validate_req_state_valid( + self, + seq_id: int, + committed_tokens: np.ndarray, + committed_blocks: list[int], + ): + """Check that the committed tokens and blocks match what was actually + committed into the radix trie.""" + assert seq_id in self.active_requests + node = self.active_requests[seq_id] + # Climb up the trie from the given node, accumulating all the + # prefix tokens and blocks. + tokens, blocks = node.get_prefix_tokens_and_blocks() + assert (tokens == committed_tokens).all() + assert blocks == committed_blocks + + def get_cached_blocks(self, seq_id: int, prompt: np.ndarray) -> list[int]: + """Returns the blocks from the prefix cache that can be reused for the given prompt.""" + node = self.active_requests.get(seq_id, self.radix_trie.root) + # Attempt to match all but the last token in the prompt. This is + # because the model expects a prompt of length at least 1. + _, cached_blocks = self.radix_trie.match_prefix(prompt[:-1], node=node) + return cached_blocks + + def get_num_cached_tokens(self, prompt: np.ndarray) -> int: + """Returns the number of tokens in the CE prompt that are found in the prefix cache.""" + _, prefix_blocks = self.radix_trie.match_prefix(prompt[:-1]) + return len(prefix_blocks) * self.page_size + + def evict_blocks(self, blocks_to_evict: Optional[int] = None) -> list[int]: + """Evict a percentage of all blocks according to a LRU policy on the trie leaves.""" + if blocks_to_evict is None: + blocks_to_evict = len(self.blocks) + return self.radix_trie.evict_blocks(desired_num_evicted=blocks_to_evict) + + def _release_partial_block( + self, + data: PagedCacheMetadata, + free_block_fn: Callable[[int], None], + ) -> None: + """Release the partially cached and uncommitted block. + + There may be a partially cached block if the seq len was not a multiple + of page size after the last `step` operation. We may want to release the + partial block if we can retrieve KV projections for additional tokens + in the block from the cache: + + e.g: + - partial_block b0 = ["I", "love", "to", "dance"] (cached = 2 tokens) + - we have block b1 = ["I", "love", "to", "sing"] (cached = 4 tokens) + in the prefix cache + - we can delete b0 and reuse b1 for the first three tokens for COW + """ + assert data.committed_idx < data.cached_idx + partial_blocks = data.committable_blocks + assert len(partial_blocks) == 1 + free_block_fn(partial_blocks[0]) + data.blocks.pop() + partial_tokens = data.cached_idx - data.committed_idx + assert 0 < partial_tokens < self.page_size + data.cached_idx -= partial_tokens + assert data.committed_idx == data.cached_idx + + def fetch( + self, + seq_id: int, + data: PagedCacheMetadata, + free_block_fn: Callable[[int], None], + alloc_block_fn: Callable[[], int], + ) -> list[int]: + """Extend the kv cache for given request with any cached prefixes. + + This will increment the committed_idx and cached_idx if there is a cache + hit. The prompt will be trimmed in the event that cached_idx is bumped. + """ + # If there is only one committable token, that means that the prompt + # is one token. We cannot reduce the prompt length any further since + # the model expects a prompt of length at least 1. + committable_tokens = data.committable_tokens[:-1] + if len(committable_tokens) == 0: + return [] + + # Query trie for all but last token. + node = self.active_requests[seq_id] + node, prefix_blocks = self.radix_trie.match_prefix( + committable_tokens, node=node + ) + self.active_requests[seq_id] = node + + # Mark the prefix blocks we retrieved from the radix trie cache as + # in use by this sequence so they don't get evicted prematurely. + self.radix_trie.mark_in_use_by(node, seq_id) + + # Update the cache hit rate metrics. + num_cache_hit_tokens = len(prefix_blocks) * self.page_size + self.cache_hit_tokens += num_cache_hit_tokens + self.all_tokens += len(committable_tokens) + + # If there is a block with partially cached tokens, we should release it + # if the cache hit blocks already contain these tokens and more + if data.committed_idx < data.cached_idx and num_cache_hit_tokens > 0: + assert data.committed_idx + num_cache_hit_tokens > data.cached_idx + self._release_partial_block(data, free_block_fn) + + data.blocks.extend(prefix_blocks) + # Bump the committed_idx since we got cache hits + data.committed_idx += num_cache_hit_tokens + data.cached_idx += num_cache_hit_tokens + + if self.enable_cow: + self._fetch_cow(seq_id, data, free_block_fn, alloc_block_fn) + + return prefix_blocks + + def _fetch_cow( + self, + seq_id: int, + data: PagedCacheMetadata, + free_block_fn: Callable[[int], None], + alloc_block_fn: Callable[[], int], + ) -> None: + """Extend the kv cache for given request with any cached prefixes by + copying a portion of the tokens in a committed block to a fresh block. + + This will keep the committed_idx the same, but increment the cached_idx + by between [1, page_size) tokens if we do perform a cow operation. The + prompt will be trimmed in the event that cached_idx is bumped. + """ + assert self.enable_cow + + # If page_size is 1, there is no need to perform COW + if self.page_size == 1: + return + assert self.cow_strided_memcpy_graph is not None + + # Match page_size tokens in the radix trie + committable_tokens = data.committable_tokens[:-1] + if len(committable_tokens) == 0: + return + committable_tokens_cropped = list(committable_tokens[: self.page_size]) + node = self.active_requests[seq_id] + res = node.find_block_with_largest_common_prefix( + committable_tokens_cropped + ) + if res is None: + return + partial_match_block, num_cache_hit_tokens = res + assert 0 < num_cache_hit_tokens < self.page_size + + # No point in performing COW if we have more cached but uncommitted tokens + # in the existing partial block than the matched prefix length. + partial_tokens = data.cached_idx - data.committed_idx + if num_cache_hit_tokens <= partial_tokens: + return + + # If we have a partially cached block, we need to release it before + # appending additional blocks. + if partial_tokens > 0: + assert data.committed_idx + num_cache_hit_tokens > data.cached_idx + self._release_partial_block(data, free_block_fn) + + # Copy prefix_len tokens from partial_match_block to new_block. + new_block = alloc_block_fn() + self.cow_count += 1 + self.cow_strided_memcpy_graph.execute( + new_block, + partial_match_block, + num_cache_hit_tokens, + *self.tensors, + ) + data.blocks.append(new_block) + data.cached_idx += num_cache_hit_tokens + assert len(data.prompt_tokens) > 0 + assert data.cached_idx < data.inflight_idx + + def step( + self, + seq_id: int, + data: PagedCacheMetadata, + free_block_fn: Callable[[int], None], + ) -> None: + """Now that we have written to the inflight blocks, we will try to commit + them to the radix trie. + + This increments the committed_idx. We guarantee that the number of committed + tokens will be a multiple of the page size. There may be some uncommitted + tokens left over due to there being a partial page at the end. Thus the + number of uncommitted tokens will always be less than the page size. + """ + committable_tokens = data.committable_tokens_aligned + node = self.active_requests[seq_id] + node, existing_blocks = self.radix_trie.match_prefix( + committable_tokens, node=node + ) + self.active_requests[seq_id] = node + + # If we computed a kv entry for a token that was already cached, + # we will just release that block we just computed. + for b0, b1 in zip(existing_blocks, data.committable_blocks_aligned): + if b0 != b1: + free_block_fn(b1) + + # Replace the inflight blocks with the existing prefix blocks. + committed_block_idx = data.committed_idx // self.page_size + data.blocks[ + committed_block_idx : committed_block_idx + len(existing_blocks) + ] = existing_blocks + data.committed_idx += len(existing_blocks) * self.page_size + + committable_tokens = data.committable_tokens_aligned + committable_blocks = data.committable_blocks_aligned + assert len(committable_tokens) % self.page_size == 0 + assert ( + len(committable_tokens) == len(committable_blocks) * self.page_size + ) + + # If there are any tokens to commit, insert them into the prefix cache. + node = self.radix_trie.insert( + committable_tokens, + committable_blocks, + node=node, + ) + self.active_requests[seq_id] = node + data.committed_idx += len(committable_tokens) + + # Mark the recently committed blocks as in use by this sequence + # so they don't get evicted prematurely. + self.radix_trie.mark_in_use_by(node, seq_id) diff --git a/src/max/pipelines/kv_cache/radix_trie.py b/src/max/pipelines/kv_cache/radix_trie.py new file mode 100644 index 0000000000..fe848cbe9e --- /dev/null +++ b/src/max/pipelines/kv_cache/radix_trie.py @@ -0,0 +1,479 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Union + +import numpy as np + +from .simple_trie import SimpleTrie + +TokenId = Any +BlockId = Any +SeqId = int + + +from collections import OrderedDict + + +def _token_prefix_match_len( + tokens0: np.ndarray, tokens1: np.ndarray, page_size: int +) -> int: + """Computes the length of maximum shared prefix of two tokens, aligned by + `page_size`. + + e.g: _token_prefix_match_len(["i", "like", "dogs"], ["i", "like", "cats"], page_size = 1) => 2 + _token_prefix_match_len(["i", "like", "dogs"], ["we", "like", "cats"], page_size = 1) => 0 + _token_prefix_match_len(["i", "like", "dogs"], ["i", "like", "dogs", "and", "cats"], page_size = 1) => 3 + """ + assert len(tokens0) % page_size == 0 + assert len(tokens1) % page_size == 0 + shorter_len = min(len(tokens0), len(tokens1)) + for i in range(0, shorter_len, page_size): + if (tokens0[i : i + page_size] != tokens1[i : i + page_size]).any(): + return i + return shorter_len + + +def _token_to_key(tokens: np.ndarray, page_size: int) -> tuple[TokenId, ...]: + assert len(tokens) >= page_size, ( + f"tokens must be at least page_size ({page_size}) long but is only {len(tokens)} tokens" + ) + return tuple(tokens[:page_size]) + + +class TrieNode: + """A TrieNode consists of a list of tokens and blocks. + + - Tokens are the ids of the tokens in the sequence. + - Blocks are the offsets into the KVCache region that back the KV entries + for a given token. I.e: the page index + """ + + node_id_counter = 0 + + def __init__(self) -> None: + """Constructs a TrieNode.""" + # each node is assigned a unique id to look it up in the lru cache + self.node_id = TrieNode.node_id_counter + TrieNode.node_id_counter += 1 + + self.children: Dict[tuple[TokenId, ...], TrieNode] = {} + # Typically in a map, we would have keys mapping to values. + # To avoid collision with KV cache terminology, we call them tokens and blocks. + # + # Only the root should have empty tokens/blocks + self.tokens: np.ndarray = np.array([]) + self.blocks: List[BlockId] = [] + # Only the root should have a null parent + self.parent: Optional[TrieNode] = None + # Sequences that are using the blocks owned by this trie node + # The node can only be evicted if self.active_seqs is empty + self.active_seqs: Set[SeqId] = set() + # A trie containing only the keys in the self.children dict where each + # key is length exactly page_size + self.key_trie = SimpleTrie() + + def is_leaf(self) -> bool: + """Returns true if the node is a leaf node.""" + return len(self.children) == 0 + + def is_root(self) -> bool: + """Returns true if the node is the root node.""" + return self.parent is None + + def is_evictable(self) -> bool: + """Returns true if the node is evictable.""" + return not self.is_root() and len(self.active_seqs) == 0 + + def find_block_with_largest_common_prefix( + self, target: Sequence[TokenId] + ) -> Optional[Tuple[BlockId, int]]: + """Returns any block in the trie that has the given prefix.""" + res = self.key_trie.find_string_with_largest_common_prefix(target) + if res is None: + return None + key, prefix_len = res + if prefix_len == 0: + return None + assert prefix_len <= len(target) + assert target[:prefix_len] == key[:prefix_len] + return self.children[tuple(key)].blocks[0], prefix_len + + def get_prefix_tokens_and_blocks(self) -> Tuple[np.ndarray, List[BlockId]]: + curr: Optional[TrieNode] = self + tokens: List[TokenId] = [] + blocks: List[BlockId] = [] + while curr is not None: + tokens.extend(curr.tokens[::-1]) + blocks.extend(curr.blocks[::-1]) + curr = curr.parent + return np.array(tokens, dtype=np.int64)[::-1], blocks[::-1] + + +class LRUCache(OrderedDict): + """Least recently used block cache to support O(1) eviction operations.""" + + def __init__(self): + super().__init__() + + def __setitem__(self, key: int, value: TrieNode) -> None: + super().__setitem__(key, value) + super().move_to_end(key) + + def move_to_front(self, key: int) -> None: + super().move_to_end(key, last=False) + + def pop_front(self) -> TrieNode: + return super().popitem(last=False)[-1] + + +class RadixTrie: + """This RadixTrie is specially designed for prefix caching in paged attention. + + The RadixTrie allows for efficient insertion and matching of sequences. It + matches each prefix of tokens in a sequence to its corresponding blocks. + Compared to a naive trie, the RadixTrie allows storing multiple tokens in a + single node for less indirection and faster access. + + Blocks in the RadixTrie should be immutable and committed. If it is in the + RadixTrie, it is eligible for sharing. An inflight or uncommitted block that + is being written to by a sequence should not be in the RadixTrie. + + The RadixTrie allows for an LRU eviction policy for its leaves. We only allow + evictions if no active sequences are using the node. + + Currently, the RadixTrie assumes that the paged KVCache page size is 1. + + This implementation is based off of SGLang: + - https://github.com/sgl-project/sglang/blob/337fe53ac41c68d6f171ef3b446f55eb0e98f77c/python/sglang/srt/mem_cache/radix_cache.py#L58 + """ + + def __init__(self, page_size: int = 1) -> None: + """Constructs a RadixTrie.""" + self.root = TrieNode() + self.page_size = page_size + self.evictable_blocks: set[BlockId] = set() + self.all_blocks: set[BlockId] = set() + + # the lru cache contains each evictable block in the trie + self.lru_cache = LRUCache() + + def _check_node_valid(self, node: TrieNode): + """Rudimentary checks of data structure invariants for TrieNode.""" + if self.root == node: + assert len(node.tokens) == 0 + assert len(node.blocks) == 0 + assert not node.parent + else: + assert len(node.tokens) > 0 + assert len(node.blocks) > 0 + assert node.parent + assert len(node.tokens) % self.page_size == 0 + assert len(node.tokens) // self.page_size == len(node.blocks) + + def insert( + self, + tokens: Union[np.ndarray, List[TokenId]], + blocks: List[BlockId], + node: Optional[TrieNode] = None, + ) -> TrieNode: + """Inserts `tokens` and `blocks` into the trie. + + We assume that each block contains exactly one token so the length of both + input lists must match. + + Args: + tokens: Tokens to insert into trie + blocks: KV cache block for each token + node: Node to begin insertion at. If this is not a leaf node, blocks + in the tree are overwritten. + Return: + trie_node: Node corresponding to end of the sequence where future + generated tokens can be inserted + """ + + if isinstance(tokens, list): + tokens = np.array(tokens) + + def insert_helper( + prev: TrieNode, tokens: np.ndarray, blocks: List[BlockId] + ) -> TrieNode: + if len(tokens) == 0: + return prev + + key = _token_to_key(tokens, self.page_size) + if key not in prev.children: + # insert new node + curr = TrieNode() + curr.parent = prev + curr.tokens = tokens + curr.blocks = blocks + prev.children[key] = curr + prev.key_trie.insert(key) + assert curr.is_evictable() and curr.is_leaf() + self.evictable_blocks.update(blocks) + self.lru_cache[curr.node_id] = curr + self.all_blocks.update(blocks) + + curr = prev.children[key] + prefix_len = _token_prefix_match_len( + curr.tokens, tokens, self.page_size + ) + + if prefix_len == len(curr.tokens) and prefix_len == len(tokens): + return curr + + unmatched_tokens = tokens[prefix_len:] + unmatched_blocks = blocks[prefix_len // self.page_size :] + if prefix_len == len(curr.tokens): + return insert_helper(curr, unmatched_tokens, unmatched_blocks) + + # this means that we got a partial match and must split the curr node + # (prev) -> (curr) + # becomes: + # (prev) -> (parent) -> (child) + (parent, _) = self._split_node(curr, prefix_len) + unmatched_tokens = tokens[prefix_len:] + unmatched_blocks = blocks[prefix_len // self.page_size :] + return insert_helper(parent, unmatched_tokens, unmatched_blocks) + + if len(tokens) % self.page_size != 0: + msg = f"Insertion failed: the number of tokens is not divisible by the page size. len(tokens) == {len(tokens)} but page_size == {self.page_size}." + raise ValueError(msg) + if len(tokens) // self.page_size != len(blocks): + msg = f"Insertion failed: the number of tokens and blocks do not match. len(tokens) // self.page_size == {len(tokens)} // {self.page_size} == {len(tokens) // self.page_size} but len(blocks) == {len(blocks)}." + raise ValueError(msg) + + if node is None: + node = self.root + + if len(tokens) == 0: + return node + + # clone to avoid mutating the original lists + tokens = tokens.copy() + blocks = blocks.copy() + return insert_helper(node, tokens, blocks) + + def match_prefix( + self, + tokens: Union[np.ndarray, List[TokenId]], + node: Optional[TrieNode] = None, + ) -> Tuple[TrieNode, List[BlockId]]: + """Matches the input `tokens` with the contents of the trie. + + Args: + tokens: tokens to search the trie for + node: Node to begin matching at. + Return: + Tuple containing: + - trie_node: Node corresponding to end of matched prefix where + future generated tokens can be inserted. + - block_list: KV cache blocks for matched prefix + """ + if isinstance(tokens, list): + tokens = np.array(tokens) + + def match_prefix_helper( + prev: TrieNode, tokens: np.ndarray, blocks: List[BlockId] + ) -> TrieNode: + if len(tokens) == 0: + return prev + + key = _token_to_key(tokens, self.page_size) + if key not in prev.children: + return prev + + curr = prev.children[key] + prefix_len = _token_prefix_match_len( + curr.tokens, tokens, self.page_size + ) + if prefix_len < len(curr.tokens): + # (prev) -> (curr) + # becomes: + # (prev) -> (parent) -> (child) + (parent, _) = self._split_node(curr, prefix_len) + blocks.extend(parent.blocks) + return parent + else: + blocks.extend(curr.blocks) + return match_prefix_helper(curr, tokens[prefix_len:], blocks) + + if node is None: + node = self.root + blocks: List[BlockId] = [] + + if len(tokens) == 0: + return node, [] + + tokens = tokens[: len(tokens) // self.page_size * self.page_size] + curr = match_prefix_helper(node, tokens, blocks) + return curr, blocks + + def _split_node( + self, node: TrieNode, split_len: int + ) -> Tuple[TrieNode, TrieNode]: + """Splits the provided node into two. + + The resulting parent node receives exactly `split_len` tokens/blocks, and + the child receives the remainder. + + before │ after splitting w/ `split_len` = 2 + │ ┌────────┐ + │ │ ab │ (parent) + ┌────────┐ │ └───▲────┘ + │ abcdef │ │ │ + └────────┘ │ ┌───▼────┐ + │ │ cdef │ (child) + │ └────────┘ + """ + assert node != self.root + assert split_len > 0 + assert split_len % self.page_size == 0 + + parent = TrieNode() + child = node + parent.tokens, child.tokens = ( + child.tokens[:split_len], + child.tokens[split_len:], + ) + parent.blocks, child.blocks = ( + child.blocks[: split_len // self.page_size], + child.blocks[split_len // self.page_size :], + ) + + parent.parent = child.parent + assert parent.parent is not None + assert len(parent.tokens) > 0 + parent_key = _token_to_key(parent.tokens, self.page_size) + parent.parent.children[parent_key] = parent + parent.parent.key_trie.insert(parent_key) + child_key = _token_to_key(child.tokens, self.page_size) + parent.children = {child_key: child} + parent.key_trie.insert(child_key) + self.lru_cache[child.node_id] = child + child.parent = parent + + parent.active_seqs = child.active_seqs.copy() + if parent.is_evictable(): + self.lru_cache[parent.node_id] = parent + + self._check_node_valid(parent) + self._check_node_valid(child) + return (parent, child) + + def mark_in_use_by(self, node: TrieNode, seq_id: SeqId): + """Climb up the trie starting from node, marking each node as being + in use by this seq.""" + + curr = node + while curr != self.root: + assert curr is not None + # optimization: if this node is already marked as using this sequence, + # assume that it is already marked for its parents as well + if seq_id in curr.active_seqs: + break + curr.active_seqs.add(seq_id) + if not curr.is_evictable(): + self.evictable_blocks -= set(curr.blocks) + if curr.node_id in self.lru_cache: + del self.lru_cache[curr.node_id] + assert curr.parent is not None + curr = curr.parent + + def mark_not_in_use_by(self, node: TrieNode, seq_id: SeqId): + """Climb up the trie starting from node, marking each node as no longer + in use by this seq. Since nodes without any users may be eligible for + eviction, we also update its last_access_time.""" + + curr = node + while curr != self.root: + assert curr is not None + assert seq_id in curr.active_seqs + curr.active_seqs.remove(seq_id) + if curr.is_evictable(): + self.evictable_blocks.update(curr.blocks) + self.lru_cache[curr.node_id] = curr + assert curr.parent is not None + curr = curr.parent + + def evict_blocks(self, desired_num_evicted: int) -> List[BlockId]: + """Attempt to evict at most `desired_num_evicted` blocks from trie.""" + evicted_blocks: List[BlockId] = [] + + while len(evicted_blocks) < desired_num_evicted and self.lru_cache: + leaf = self.lru_cache.pop_front() + # we guarantee that the parent node will only be evicted after all + # its children have been evicted. as such, this node we will evict + # is a leaf + assert leaf.is_evictable() and leaf.is_leaf() + key = _token_to_key(leaf.tokens, self.page_size) + num_blocks_to_evict = min( + desired_num_evicted - len(evicted_blocks), + len(leaf.blocks), + ) + assert num_blocks_to_evict > 0 + num_tokens_to_evict = num_blocks_to_evict * self.page_size + blocks_left, blocks_to_evict = ( + leaf.blocks[:-num_blocks_to_evict], + leaf.blocks[-num_blocks_to_evict:], + ) + leaf.blocks = blocks_left + leaf.tokens = leaf.tokens[:-num_tokens_to_evict] + evicted_blocks.extend(blocks_to_evict) + if leaf.blocks: + self.lru_cache[leaf.node_id] = leaf + self.lru_cache.move_to_front(leaf.node_id) + else: + parent = leaf.parent + assert parent is not None + del parent.children[key] + del parent.key_trie[key] + + self.evictable_blocks.difference_update(evicted_blocks) + self.all_blocks.difference_update(evicted_blocks) + if len(evicted_blocks) < desired_num_evicted: + assert not self.evictable_blocks + assert len(self.lru_cache) == 0 + + return evicted_blocks + + def get_all_blocks(self) -> set[BlockId]: + """Returns the total number of blocks in the trie.""" + return self.all_blocks + + def get_evictable_blocks(self) -> set[BlockId]: + """Returns the number of blocks that are eligible for eviction.""" + return self.evictable_blocks + + def pretty_format(self, print_blocks: bool = False) -> List[str]: + """Formats the contents of the trie.""" + + def helper(node: TrieNode, indent: int, lines: List[str]): + for _, child in node.children.items(): + tokens = child.tokens + token_list = tokens.tolist() + if print_blocks: + lines.append(f"{'-' * indent}{token_list} : {child.blocks}") + else: + lines.append(f"{'-' * indent}{token_list}") + helper(child, indent + 2, lines) + + lines: List[str] = [] + helper(self.root, 0, lines) + return lines + + def pretty_print(self, print_blocks: bool = True): + """Prints the contents of the trie.""" + for line in self.pretty_format(print_blocks): + print(line) diff --git a/src/max/pipelines/kv_cache/simple_trie.py b/src/max/pipelines/kv_cache/simple_trie.py new file mode 100644 index 0000000000..3ae86eb6a6 --- /dev/null +++ b/src/max/pipelines/kv_cache/simple_trie.py @@ -0,0 +1,152 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from typing import Any, Optional, Sequence, Tuple + +Key = Any + + +class SimpleNode: + """A node in a simple trie data structure.""" + + def __init__(self): + # Pointer to the children of this node + self.children: dict[Key, SimpleNode] = {} + # Whether this node is the end of a word + self.is_eow: bool = False + + +class SimpleTrie: + """A simple prefix trie with basic set insertion and deletion operations. + + Unlike the RadixTrie, this trie only have one item at each node and does not + map multiple keys to multiple values. Instead, it just stores a set of keys. + """ + + def __init__(self): + self.root = SimpleNode() + + def insert(self, s: Sequence[Key]): + """Inserts a sequence into the trie.""" + curr = self.root + for ch in s: + if ch not in curr.children: + curr.children[ch] = SimpleNode() + curr = curr.children[ch] + curr.is_eow = True + + def _search(self, s: Sequence[Key]) -> Tuple[SimpleNode, list[Key]]: + """Internal helper method to search for a sequence in the trie. + + Args: + s: The sequence to search for + + Returns: + A tuple containing: + - The last node reached during the search + - List of keys matched during the search + """ + curr = self.root + matched: list[Key] = [] + for ch in s: + if ch not in curr.children: + return curr, matched + matched.append(ch) + curr = curr.children[ch] + return curr, matched + + def find_string_with_largest_common_prefix( + self, target: Sequence[Key] + ) -> Optional[Tuple[Sequence[Key], int]]: + """Returns a sequence in the trie that shares the longest common prefix + with the target. + + If a match is found, returns a tuple containing: + - The matched sequence + - Length of the common prefix + Returns None if no match is found + """ + curr, matched = self._search(target) + prefix_len = len(matched) + + if prefix_len == 0: + return None + + # Keep going down left spine to find any string in trie that has s + # as its prefix + s = matched + while not curr.is_eow: + if not curr.children: + return None + ch = next(iter(curr.children)) + curr = curr.children[ch] + s.append(ch) + + return s, prefix_len + + def __contains__(self, s: Sequence[Key]) -> bool: + """Checks if the trie contains the exact sequence.""" + node, matched = self._search(s) + return len(matched) == len(s) and node.is_eow + + def __delitem__(self, s: Sequence[Key]) -> None: + """Deletes a sequence from the trie.""" + + def _remove( + root: Optional[SimpleNode], idx: int + ) -> Optional[SimpleNode]: + if not root: + return None + + if idx == len(s): + assert root.is_eow + root.is_eow = False + if len(root.children) == 0: + del root + root = None + return root + + ch = s[idx] + child = _remove(root.children[ch], idx + 1) + if child is None: + del root.children[ch] + else: + root.children[ch] = child + + if len(root.children) == 0 and not root.is_eow: + del root + root = None + return root + + _remove(self.root, 0) + + def pretty_format(self) -> list[str]: + """Returns a formatted string representation of the trie for debugging.""" + lines: list[str] = [] + + def helper(node: SimpleNode, indent: int): + if node.is_eow: + lines.append(f"{'-' * indent}*") + for ch, child in node.children.items(): + lines.append(f"{'-' * indent}{ch}") + helper(child, indent + 2) + + helper(self.root, 0) + return lines + + def pretty_print(self) -> None: + """Prints a formatted visual representation of the trie for debugging.""" + print("SimpleTrie(") + for line in self.pretty_format(): + print(line) + print(")") diff --git a/src/max/pipelines/nn/__init__.py b/src/max/pipelines/nn/__init__.py new file mode 100644 index 0000000000..22b3b1bac4 --- /dev/null +++ b/src/max/pipelines/nn/__init__.py @@ -0,0 +1,88 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .attention import ( + Attention, + AttentionImpl, + AttentionImplQKV, + AttentionQKV, + AttentionWithoutMask, + AttentionWithRope, + AttentionWithRopeQKV, + AttentionWithRopeV2, + DistributedAttentionImpl, + DistributedAttentionWithRope, + GPTQAttentionWithRope, + NaiveAttentionWithRope, +) +from .comm import Signals +from .conv import Conv1D, Conv2D, Conv3D +from .embedding import Embedding, EmbeddingV2, VocabParallelEmbedding +from .kernels import MHAMaskVariant +from .layer import Layer, LayerV2 +from .linear import MLP, MLPV2, DistributedMLP, GPTQLinearV2, Linear, LinearV2 +from .norm import DistributedRMSNorm, LayerNorm, LayerNormV2, RMSNorm, RMSNormV2 +from .rotary_embedding import OptimizedRotaryEmbedding, RotaryEmbedding +from .sequential import Sequential +from .transformer import ( + DistributedTransformer, + DistributedTransformerBlock, + NaiveTransformer, + NaiveTransformerBlock, + Transformer, + TransformerBlock, +) + +__all__ = [ + "Attention", + "AttentionImpl", + "AttentionImplQKV", + "AttentionQKV", + "AttentionWithRope", + "AttentionWithRopeQKV", + "AttentionWithRopeV2", + "AttentionWithoutMask", + "Conv1D", + "Conv2D", + "Conv3D", + "DistributedAttentionImpl", + "DistributedAttentionWithRope", + "DistributedMLP", + "DistributedRMSNorm", + "DistributedTransformer", + "DistributedTransformerBlock", + "Embedding", + "EmbeddingV2", + "GPTQAttentionWithRope", + "GPTQLinearV2", + "Layer", + "LayerNorm", + "LayerNormV2", + "LayerV2", + "Linear", + "LinearV2", + "MHAMaskVariant", + "MLP", + "MLPV2", + "NaiveAttentionWithRope", + "NaiveTransformer", + "NaiveTransformerBlock", + "OptimizedRotaryEmbedding", + "RMSNorm", + "RMSNormV2", + "RotaryEmbedding", + "Sequential", + "Signals", + "Transformer", + "TransformerBlock", +] diff --git a/src/max/pipelines/nn/_identity.py b/src/max/pipelines/nn/_identity.py new file mode 100644 index 0000000000..eeb038c45a --- /dev/null +++ b/src/max/pipelines/nn/_identity.py @@ -0,0 +1,71 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Utility classes for using objects as keys in data structures.""" + +from collections.abc import MutableMapping, MutableSet + + +# From https://stackoverflow.com/questions/16994307/identityset-in-python +class IdentitySet(MutableSet): + """Set that uses object `id` as keys to support unhashable types.""" + + def __init__(self, iterable=()): + self.map = {} # id -> object + self |= iterable # add elements from iterable to the set (union) + + def __len__(self): + return len(self.map) + + def __iter__(self): + return iter(self.map.values()) + + def __contains__(self, x): + return id(x) in self.map + + def add(self, value): + """Add an element.""" + self.map[id(value)] = value + + def discard(self, value): + """Remove an element. Do not raise an exception if absent.""" + self.map.pop(id(value), None) + + def __repr__(self): + if not self: + return "%s()" % (self.__class__.__name__,) + return "%s(%r)" % (self.__class__.__name__, list(self)) + + +class IdentityMap(MutableMapping): + """Map that uses object `id` as keys to support unhashable types.""" + + def __init__(self): + self.key_map = {} # id -> object + self.value_map = {} # id -> Value + + def __getitem__(self, key): + return self.value_map[id(key)] + + def __setitem__(self, key, value): + self.key_map[id(key)] = key + self.value_map[id(key)] = value + + def __delitem__(self, key): + del self.key_map[id(key)] + del self.value_map[id(key)] + + def __iter__(self): + return iter(self.key_map.values()) + + def __len__(self): + return len(self.key_map) diff --git a/src/max/pipelines/nn/attention/__init__.py b/src/max/pipelines/nn/attention/__init__.py new file mode 100644 index 0000000000..5536ee5871 --- /dev/null +++ b/src/max/pipelines/nn/attention/__init__.py @@ -0,0 +1,44 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""The attention mechanism used within the model.""" + +from .attention import Attention, AttentionQKV +from .attention_with_rope import ( + AttentionWithRope, + AttentionWithRopeQKV, + AttentionWithRopeV2, + DistributedAttentionWithRope, + GPTQAttentionWithRope, +) +from .attention_without_mask import AttentionWithoutMask +from .interfaces import ( + AttentionImpl, + AttentionImplQKV, + DistributedAttentionImpl, +) +from .naive_attention_with_rope import NaiveAttentionWithRope + +__all__ = [ + "Attention", + "AttentionQKV", + "AttentionImpl", + "AttentionImplQKV", + "AttentionWithRope", + "DistributedAttentionImpl", + "DistributedAttentionWithRope", + "AttentionWithRopeQKV", + "AttentionWithoutMask", + "NaiveAttentionWithRope", + "AttentionWithRopeV2", + "GPTQAttentionWithRope", +] diff --git a/src/max/pipelines/nn/attention/attention.py b/src/max/pipelines/nn/attention/attention.py new file mode 100644 index 0000000000..5eb57f2815 --- /dev/null +++ b/src/max/pipelines/nn/attention/attention.py @@ -0,0 +1,157 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""A vanilla opaque KV Cache optimized attention mechanism.""" + +from dataclasses import dataclass +from typing import Union + +from max.dtype import DType +from max.graph import TensorValue, ops +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + PagedKVCacheCollection, +) + +from ..kernels import flash_attention, fused_qkv_matmul +from .interfaces import AttentionImpl, AttentionImplQKV + + +@dataclass +class Attention(AttentionImpl): + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + if isinstance(kv_collection, PagedKVCacheCollection): + raise ValueError( + "Paged attention not supported for Attention on non-ragged tensors." + ) + + if "attention_mask" not in kwargs: + raise ValueError("attention_mask not passed as input to Attention") + attention_mask = kwargs["attention_mask"] + if attention_mask.dtype != x.dtype: + msg = ( + "expected attention_mask and x to have the same dtype, but got" + f" {attention_mask.dtype} and {x.dtype}, respectively." + ) + raise ValueError(msg) + + # Get attributes from inputs + batch_size, seq_len = x.shape[0], x.shape[1] + + # Call into fused qkv matmul. + xq = fused_qkv_matmul( + self.kv_params, + input=x, + wqkv=self.wqkv, + kv_collection=kv_collection, + layer_idx=self.layer_idx, + n_heads=self.n_heads, + ) + + xq = ops.reshape( + xq, + [ + batch_size, + seq_len, + self.n_heads, + self.kv_params.head_dim, + ], + ) + + # Calculate Flash Attention + attn_out = flash_attention( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=self.layer_idx, + attention_mask=attention_mask, + valid_lengths=kwargs["valid_lengths"], + scale=self.scale, + ) + + attn_out = ops.reshape(attn_out, shape=[batch_size, seq_len, -1]) + + return self.wo(attn_out) + + +@dataclass +class AttentionQKV(AttentionImplQKV): + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + if isinstance(kv_collection, PagedKVCacheCollection): + raise ValueError( + "Paged attention not supported for Attention on non-ragged tensors." + ) + + if "attention_mask" not in kwargs: + raise ValueError("attention_mask not passed as input to Attention") + attention_mask = kwargs["attention_mask"] + if attention_mask.dtype != x.dtype: + msg = ( + "expected attention_mask and x to have the same dtype, but got" + f" {attention_mask.dtype} and {x.dtype}, respectively." + ) + raise ValueError(msg) + + wqkv = ops.concat((self.wq, self.wk, self.wv)).transpose(0, 1) + wqkv = ops.cast(wqkv, x.dtype) + + # Get attributes from inputs + batch_size, seq_len = x.shape[0], x.shape[1] + + # Call into fused qkv matmul. + xq = fused_qkv_matmul( + self.kv_params, + input=x, + wqkv=wqkv, + kv_collection=kv_collection, + layer_idx=ops.constant(self.layer_idx, DType.uint32), + n_heads=self.n_heads, + ) + + xq = ops.reshape( + xq, + [ + batch_size, + seq_len, + self.n_heads, + self.kv_params.head_dim, + ], + ) + + # Calculate Flash Attention + attn_out = flash_attention( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=ops.constant(self.layer_idx, DType.uint32), + attention_mask=attention_mask, + valid_lengths=kwargs["valid_lengths"], + scale=self.scale, + ) + + attn_out = ops.reshape(attn_out, shape=[batch_size, seq_len, -1]) + + return self.wo(attn_out) diff --git a/src/max/pipelines/nn/attention/attention_with_rope.py b/src/max/pipelines/nn/attention/attention_with_rope.py new file mode 100644 index 0000000000..897a14d068 --- /dev/null +++ b/src/max/pipelines/nn/attention/attention_with_rope.py @@ -0,0 +1,626 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""An opaque KV Cache optimized attention mechanism with Rope.""" + +from __future__ import annotations + +import math +from dataclasses import dataclass +from typing import Callable, List, Optional, Union + +from max.dtype import DType +from max.graph import ( + BufferValue, + DeviceRef, + TensorValue, + Weight, + ops, +) +from max.graph.quantization import QuantizationConfig, QuantizationEncoding +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + KVCacheParams, + PagedKVCacheCollection, +) + +from ..kernels import ( + MHAMaskVariant, + flash_attention_ragged, + fused_qk_ragged_rope, + fused_qkv_ragged_matmul, + fused_qkv_ragged_matmul_quantized, +) +from ..layer import LayerV2 +from ..linear import LinearV2 +from ..rotary_embedding import OptimizedRotaryEmbedding +from .clamp import clamp +from .interfaces import ( + AttentionImpl, + AttentionImplQKV, + AttentionImplV2, + DistributedAttentionImpl, +) + + +@dataclass +class AttentionWithRope(AttentionImpl): + # This class will not use the RotaryEmbedding to + # calculate rope, but it already includes a freqs_cis + # calculation, which we will borrow + + rope: OptimizedRotaryEmbedding + bias: Optional[TensorValue] = None + perm_idx: Optional[TensorValue] = None + quantization_config: Optional[QuantizationConfig] = None + + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + # Get attributes from input. + total_seq_len = x.shape[0] + + # Call into fused qkv ragged matmul. + if self.quantization_config: + xq = fused_qkv_ragged_matmul_quantized( + self.kv_params, + input=x, + wqkv=self.wqkv, + input_row_offsets=kwargs["input_row_offsets"], + kv_collection=kv_collection, + layer_idx=self.layer_idx, + n_heads=self.n_heads, + bias=self.bias, + perm_idx=self.perm_idx, + quantization_config=self.quantization_config, + ) + else: + xq = fused_qkv_ragged_matmul( + self.kv_params, + input=x, + wqkv=self.wqkv, + input_row_offsets=kwargs["input_row_offsets"], + kv_collection=kv_collection, + layer_idx=self.layer_idx, + n_heads=self.n_heads, + bias=self.bias, + ) + + # Apply rope. + xq = xq.reshape((-1, self.n_heads, self.kv_params.head_dim)) + + if xq.device is not None: + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype).to(xq.device) + else: + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype) + + xq = fused_qk_ragged_rope( + self.kv_params, + xq, + kwargs["input_row_offsets"], + kv_collection, + freqs_cis, + self.layer_idx, + interleaved=self.rope.interleaved, + ) + + # Calculate Flash Attention. + attn_out = flash_attention_ragged( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=self.layer_idx, + input_row_offsets=kwargs["input_row_offsets"], + mask_variant=MHAMaskVariant.CAUSAL_MASK, + scale=self.scale, + ) + + attn_out = ops.reshape(attn_out, shape=[total_seq_len, -1]) + + return self.wo(attn_out) + + +class AttentionWithRopeV2(AttentionImplV2): + """Implementation of attention that uses the rope frequency. + + `AttentionWithRopeV2` will replace `AttentionWithRope` as we roll out + the new Layer API. + """ + + # This class will not use the RotaryEmbedding to + # calculate rope, but it already includes a freqs_cis + # calculation, which we will borrow + rope: OptimizedRotaryEmbedding + + def __init__( + self, + *, + rope: OptimizedRotaryEmbedding, + num_attention_heads: int, + num_key_value_heads: int, + hidden_size: int, + kv_params: KVCacheParams, + layer_idx: int, + dtype: DType = DType.float32, + device: DeviceRef = DeviceRef.CPU(), + linear_cls: Callable[..., LinearV2] = LinearV2, + stacked_qkv: bool = False, + scale: float | None = None, + has_bias: bool = False, + clip_qkv: float | None = None, + ): + """Initializes the attention layer. + + Args: + rope: The rope layer to borrow the freq_cis value from. + num_attention_heads: The number of attention heads. + num_key_value_heads: Number of key/value heads. + hidden_size: The dimension of the hidden states. + kv_params: KV Cache Params, including the number of kv heads, the head dim, and data type. + layer_idx: The layer number associated with this Attention block. + dtype: DType of the + device: Device to place the weights and run the computation. + linear_cls: Linear class to use for the outputs dense layer. + stacked_qkv: Whether the weights are stacked together. + scale: Value used to scale the results of the attention output. + has_bias: Whether to use an attention bias. + clip_qkv: If provided, the QKV weights are clamped between + `[-clip_qkv, clip_qkv]` + """ + + super().__init__() + self.rope = rope + self.n_heads = num_attention_heads + self.layer_idx = layer_idx + self.kv_params = kv_params + self.has_bias = has_bias + self.scale = ( + scale if scale else math.sqrt(1.0 / self.kv_params.head_dim) + ) + self.clip_qkv = clip_qkv + + if stacked_qkv and clip_qkv: + raise ValueError( + "`clip_qkv` not yet supported when `stack_qkv=True`." + ) + + if not self.kv_params.cache_strategy.uses_opaque(): + raise ValueError( + f"{self.kv_params.cache_strategy} cache strategy, not supported" + " in Attention layer." + ) + + kv_weight_dim = ( + hidden_size // num_attention_heads + ) * num_key_value_heads + + self.stacked_qkv = stacked_qkv + + if stacked_qkv: + # To keep the weight names consistent with the transformers attention, + # the names are suffixed ".weight". + self.qkv_proj = Weight( + name="qkv_proj.weight", + dtype=dtype, + shape=[hidden_size + 2 * kv_weight_dim, hidden_size], + ) + else: + self.q_proj = Weight( + name="q_proj.weight", + dtype=dtype, + shape=[hidden_size, hidden_size], + ) + self.k_proj = Weight( + name="k_proj.weight", + dtype=dtype, + shape=[kv_weight_dim, hidden_size], + ) + self.v_proj = Weight( + name="v_proj.weight", + dtype=dtype, + shape=[kv_weight_dim, hidden_size], + ) + + if has_bias: + assert not stacked_qkv, "Bias is not supported with stacked qkv." + + self.bias_q = Weight( + name="q_proj.bias", dtype=dtype, shape=[hidden_size] + ) + self.bias_k = Weight( + name="k_proj.bias", dtype=dtype, shape=[kv_weight_dim] + ) + self.bias_v = Weight( + name="v_proj.bias", dtype=dtype, shape=[kv_weight_dim] + ) + + self.o_proj = linear_cls( + in_dim=hidden_size, out_dim=hidden_size, dtype=dtype, device=device + ) + + @property + def wqkv(self) -> TensorValue: + """The concatenation of q, k, and v weight vectors.""" + if self.stacked_qkv: + return self.qkv_proj + else: + wq: TensorValue = self.q_proj + wk: TensorValue = self.k_proj + wv: TensorValue = self.v_proj + if self.clip_qkv: + wq = clamp(wq, min=-self.clip_qkv, max=self.clip_qkv) + wk = clamp(wk, min=-self.clip_qkv, max=self.clip_qkv) + wv = clamp(wv, min=-self.clip_qkv, max=self.clip_qkv) + return ops.concat((wq, wk, wv)) + + @property + def wqkv_bias(self) -> TensorValue | None: + """The concatenation of q, k, and v bias weight vectors.""" + if not self.has_bias: + return None + + return ops.concat((self.bias_q, self.bias_k, self.bias_v)) + + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + # Get attributes from input. + total_seq_len = x.shape[0] + + layer_idx = ops.constant(self.layer_idx, DType.uint32) + # Call into fused qkv ragged matmul. + xq = fused_qkv_ragged_matmul( + self.kv_params, + input=x, + wqkv=self.wqkv, + bias=self.wqkv_bias, + input_row_offsets=kwargs["input_row_offsets"], + kv_collection=kv_collection, + layer_idx=layer_idx, + n_heads=self.n_heads, + ) + + # Apply rope. + xq = xq.reshape((-1, self.n_heads, self.kv_params.head_dim)) + + if xq.device is not None: + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype).to(xq.device) + else: + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype) + + xq = fused_qk_ragged_rope( + self.kv_params, + xq, + kwargs["input_row_offsets"], + kv_collection, + freqs_cis, + layer_idx, + interleaved=self.rope.interleaved, + ) + + # Calculate Flash Attention. + attn_out = flash_attention_ragged( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=layer_idx, + input_row_offsets=kwargs["input_row_offsets"], + mask_variant=MHAMaskVariant.CAUSAL_MASK, + scale=self.scale, + ) + + attn_out = ops.reshape(attn_out, shape=[total_seq_len, -1]) + + return self.o_proj(attn_out) + + +class GPTQAttentionWithRope(AttentionWithRopeV2): + """Implementation of the GPT-Q attention layer.""" + + def __init__( + self, + quantization_config: QuantizationConfig, + rope: OptimizedRotaryEmbedding, + num_attention_heads: int, + num_key_value_heads: int, + hidden_size: int, + kv_params: KVCacheParams, + layer_idx: int, + dtype: DType = DType.float32, + device: DeviceRef | None = None, + scale: float | None = None, + linear_cls: Callable[..., LinearV2] = LinearV2, + ): + # Skip AttentionWithRopeV2.__init__ because the weights are created + # differently. + LayerV2.__init__(self) + self.quantization_config = quantization_config + self.rope = rope + self.n_heads = num_attention_heads + self.layer_idx = layer_idx + self.kv_params = kv_params + self.hidden_size = hidden_size + self.device = device + self.scale = ( + scale if scale else math.sqrt(1.0 / self.kv_params.head_dim) + ) + if not self.kv_params.cache_strategy.uses_opaque(): + raise ValueError( + f"{self.kv_params.cache_strategy} cache strategy, not supported" + " in Attention layer." + ) + + self.kv_weight_dim = ( + hidden_size // num_attention_heads + ) * num_key_value_heads + + self.q_proj_qweight = Weight( + name="q_proj.qweight", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + self.k_proj_qweight = Weight( + name="k_proj.qweight", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + self.v_proj_qweight = Weight( + name="v_proj.qweight", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + + self.q_proj_scales = Weight( + name="q_proj.scales", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + self.k_proj_scales = Weight( + name="k_proj.scales", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + self.v_proj_scales = Weight( + name="v_proj.scales", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + self.o_proj = linear_cls( + in_dim=hidden_size, + out_dim=hidden_size, + dtype=dtype, + # device=device, + quantization_encoding=QuantizationEncoding.GPTQ, + ) + + self.perm_idx = None + if quantization_config.desc_act: + self.perm_idx = Weight( + name="q_proj.perm_idx", + dtype=DType.int32, + shape=[hidden_size], + # device=device, + ) + + @property + def wqkv(self) -> TensorValue: + """The concatenation of q, k, and v weight vectors.""" + + # fmt: off + # the `qweight` tensor for a QuantLinear is of type uint32. When allocated as bytes, we reshape the + # uint8 tensor to [cols, rows * 4] so concatenating the uint8 tensors along axis=1 is equivalent to + # concatenating the original uint32 tensors along axis=1. + wq_qweight = ops.reshape(self.q_proj_qweight, (-1, self.hidden_size * 4)) + wk_qweight = ops.reshape(self.k_proj_qweight, (-1, self.kv_weight_dim * 4)) + wv_qweight = ops.reshape(self.v_proj_qweight, (-1, self.kv_weight_dim * 4)) + + wqkv_qweight = ops.reshape( + ops.concat((wq_qweight, wk_qweight, wv_qweight), axis=1), + (-1, self.hidden_size + 2 * self.kv_weight_dim), + ) + # `scales` tensor is in f16/bf16 type, so we reshape the uint8 tensor to [cols, rows * 2]. + wq_scales = ops.reshape(self.q_proj_scales, (-1, self.hidden_size * 2)) + wk_scales = ops.reshape(self.k_proj_scales, (-1, self.kv_weight_dim * 2)) + wv_scales = ops.reshape(self.v_proj_scales, (-1, self.kv_weight_dim * 2)) + + wqkv_scales = ops.reshape( + ops.concat((wq_scales, wk_scales, wv_scales), axis=1), + (-1, self.hidden_size + 2 * self.kv_weight_dim), + ) + # fmt: on + return ops.concat((wqkv_qweight, wqkv_scales), axis=0) + + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + layer_idx = ops.constant(self.layer_idx, DType.uint32) + + # Get attributes from input. + total_seq_len = x.shape[0] + + wqkv = self.wqkv + if self.device: + wqkv = wqkv.to(self.device) + + # Call into fused qkv ragged matmul. + xq = fused_qkv_ragged_matmul_quantized( + self.kv_params, + input=x, + wqkv=wqkv, + input_row_offsets=kwargs["input_row_offsets"], + kv_collection=kv_collection, + layer_idx=layer_idx, + n_heads=self.n_heads, + perm_idx=self.perm_idx, + quantization_config=self.quantization_config, + ) + + # Apply rope. + xq = xq.reshape((-1, self.n_heads, self.kv_params.head_dim)) + + if xq.device is not None: + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype).to(xq.device) + else: + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype) + + xq = fused_qk_ragged_rope( + self.kv_params, + xq, + kwargs["input_row_offsets"], + kv_collection, + freqs_cis, + layer_idx, + interleaved=self.rope.interleaved, + ) + + # Calculate Flash Attention. + attn_out = flash_attention_ragged( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=layer_idx, + input_row_offsets=kwargs["input_row_offsets"], + mask_variant=MHAMaskVariant.CAUSAL_MASK, + scale=self.scale, + ) + attn_out = ops.reshape(attn_out, shape=[total_seq_len, -1]) + + return self.o_proj(attn_out) + + +def distribute_value( + v: TensorValue, devices: List[DeviceRef] +) -> List[TensorValue]: + return [v.to(device) for device in devices] + + +@dataclass +class DistributedAttentionWithRope(DistributedAttentionImpl): + list_of_attentions: List[AttentionWithRope] + devices: list[DeviceRef] + + def __call__( + self, + x: List[TensorValue], + signal_buffers: List[BufferValue], + kv_collections: List[ + ContinuousBatchingKVCacheCollection | PagedKVCacheCollection + ], + **kwargs, + ) -> List[TensorValue]: + input_row_offsets = kwargs["input_row_offsets"] + assert isinstance(input_row_offsets, TensorValue) + input_row_offsets_ = distribute_value(input_row_offsets, self.devices) + + return list( + ops.allreduce.sum( + inputs=[ + self.list_of_attentions[i]( + x[i], + kv_collections[i], + input_row_offsets=input_row_offsets_[i], + ) + for i in range(len(self.devices)) + ], + signal_buffers=signal_buffers, + ) + ) + + +@dataclass +class AttentionWithRopeQKV(AttentionImplQKV): + # This class will not use the RotaryEmbedding to + # calculate rope, but it already includes a freqs_cis + # calculation, which we will borrow + rope: OptimizedRotaryEmbedding + + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + # Get attributes from input. + total_seq_len = x.shape[0] + + wqkv = ops.concat((self.wq, self.wk, self.wv)) + + # Call into fused qkv ragged matmul. + xq = fused_qkv_ragged_matmul( + self.kv_params, + input=x, + wqkv=wqkv, + input_row_offsets=kwargs["input_row_offsets"], + kv_collection=kv_collection, + layer_idx=ops.constant(self.layer_idx, DType.uint32), + n_heads=self.n_heads, + ) + + # Apply rope. + xq = xq.reshape((-1, self.n_heads, self.kv_params.head_dim)) + + # Cast freqs_cis to xq's dtype to match the fused_qk_ragged_rope kernel. + freqs_cis = ops.cast(self.rope.freqs_cis, xq.dtype) + + xq = fused_qk_ragged_rope( + self.kv_params, + xq, + kwargs["input_row_offsets"], + kv_collection, + freqs_cis, + ops.constant(self.layer_idx, DType.uint32), + interleaved=self.rope.interleaved, + ) + + # Calculate Flash Attention. + attn_out = flash_attention_ragged( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=ops.constant(self.layer_idx, DType.uint32), + input_row_offsets=kwargs["input_row_offsets"], + mask_variant=MHAMaskVariant.CAUSAL_MASK, + scale=self.scale, + ) + + attn_out = ops.reshape(attn_out, shape=[total_seq_len, -1]) + + return self.wo(attn_out) diff --git a/src/max/pipelines/nn/attention/attention_without_mask.py b/src/max/pipelines/nn/attention/attention_without_mask.py new file mode 100644 index 0000000000..47b368fd53 --- /dev/null +++ b/src/max/pipelines/nn/attention/attention_without_mask.py @@ -0,0 +1,74 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""An opaque KV Cache optimized vanilla attention mechanism, with Mask Variants provided inside the Kernel.""" + +from dataclasses import dataclass +from typing import Union + +from max.graph import TensorValue, ops +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + PagedKVCacheCollection, +) + +from ..kernels import ( + MHAMaskVariant, + flash_attention_ragged, + fused_qkv_ragged_matmul, +) +from .interfaces import AttentionImpl + + +@dataclass +class AttentionWithoutMask(AttentionImpl): + mask_variant: MHAMaskVariant + + def __call__( + self, + x: TensorValue, + kv_collection: Union[ + ContinuousBatchingKVCacheCollection, PagedKVCacheCollection + ], + **kwargs, + ) -> TensorValue: + # Get attributes from input. + total_seq_len = x.shape[0] + + # Call into fused qkv ragged matmul. + xq = fused_qkv_ragged_matmul( + self.kv_params, + input=x, + wqkv=self.wqkv, + input_row_offsets=kwargs["input_row_offsets"], + kv_collection=kv_collection, + layer_idx=self.layer_idx, + n_heads=self.n_heads, + ) + + # Reshape for flash attention. + xq = xq.reshape((-1, self.n_heads, self.kv_params.head_dim)) + + # Calculate Flash Attention. + attn_out = flash_attention_ragged( + self.kv_params, + input=xq, + kv_collection=kv_collection, + layer_idx=self.layer_idx, + input_row_offsets=kwargs["input_row_offsets"], + mask_variant=self.mask_variant, + scale=self.scale, + ) + + attn_out = ops.reshape(attn_out, shape=[total_seq_len, -1]) + + return self.wo(attn_out) diff --git a/src/max/pipelines/nn/attention/clamp.py b/src/max/pipelines/nn/attention/clamp.py new file mode 100644 index 0000000000..86404eb314 --- /dev/null +++ b/src/max/pipelines/nn/attention/clamp.py @@ -0,0 +1,22 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max.graph import TensorValue, ops + + +def clamp(x: TensorValue, min: float, max: float) -> TensorValue: + """Clamps values in `x` to `[min, max]`""" + return ops.min( + ops.max(x, ops.constant(min, x.dtype)), + ops.constant(max, x.dtype), + ) diff --git a/src/max/pipelines/nn/attention/interfaces.py b/src/max/pipelines/nn/attention/interfaces.py new file mode 100644 index 0000000000..ba0303cfb2 --- /dev/null +++ b/src/max/pipelines/nn/attention/interfaces.py @@ -0,0 +1,288 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""General interface for Attention.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import dataclass + +from max.graph import ( + BufferValue, + TensorValue, + TensorValueLike, +) +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + KVCacheParams, + PagedKVCacheCollection, +) + +from ..layer import Layer, LayerV2 +from ..linear import Linear + + +@dataclass +class AttentionImpl(Layer, ABC): + """ + A generalized attention interface, that will be used upstream by a general Transformer. + We would expect a seperate subclass, articulating each variation of Attention: + + - AttentionWithRope + - AttentionWithAlibi + - VanillaAttentionWithCausalMask + - ... + + There are a series of shared attributes, however, more may be needed for each individual variant. + For example, we may introduce an OptimizedRotaryEmbedding class for the AttentionWithRope class: + + .. code-block:: python + + @dataclass + class AttentionWithRope(AttentionImpl): + rope: OptimizedRotaryEmbedding + ... + + We expect the ``__call__`` abstractmethod to remain relatively consistent, however the ``**kwargs`` + argument is exposed, allowing you to leverage additional arguments for each particular variant. + For example, we may introduce an VanillaAttentionWithCausalMask class, which includes an attention + mask: + + .. code-block:: python + + @dataclass + class VanillaAttentionWithCausalMask(AttentionImpl): + ... + + def __call__( + self, + x: TensorValueLike, + kv_collection: ContinuousBatchingKVCacheCollection, + valid_lengths: TensorValueLike, + **kwargs, + ) -> tuple[TensorValue, ContinuousBatchingKVCacheCollection]: ... + + if "attn_mask" not in kwargs: + raise ValueError("attn_mask not provided to VanillaAttentionWithCausalMask") + + # Which we can then use the attention mask downstream like so: + op( + attn_mask = kwargs["attn_mask"] + ) + """ + + n_heads: int + """The number of attention heads.""" + + kv_params: KVCacheParams + """KV Cache Params, including the number of kv heads, the head dim, and data type.""" + + layer_idx: TensorValue + """The layer number associated with this Attention block.""" + + wqkv: TensorValue + """The concatenation of q, k, and v weight vectors.""" + + wo: Linear + """A linear layer for the output projection.""" + + scale: float + """The scale factor for the attention.""" + + def __post_init__(self) -> None: + assert self.scale is not None, "scale must be provided to AttentionImpl" + + if not self.kv_params.cache_strategy.uses_opaque(): + raise ValueError( + f"{self.kv_params.cache_strategy} cache strategy, not supported" + " in Attention layer." + ) + + @abstractmethod + def __call__( + self, + x: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection + | PagedKVCacheCollection, + **kwargs, + ) -> TensorValue: ... + + +class AttentionImplV2(LayerV2, ABC): + """A generalized attention interface, that will be used upstream by a general Transformer. + We would expect a separate subclass, articulating each variation of Attention: + + - AttentionWithRope + - AttentionWithAlibi + - VanillaAttentionWithCausalMask + - ... + + `AttentionImplV2` will replace `AttentionImpl` as we roll out changes to the + Layer API. + + There are a series of shared attributes, however, more may be needed for each individual variant. + For example, we may introduce an OptimizedRotaryEmbedding class for the AttentionWithRope class: + + .. code-block:: python + + @dataclass + class AttentionWithRope(AttentionImplV2): + rope: OptimizedRotaryEmbedding + ... + + We expect the ``__call__`` abstractmethod to remain relatively consistent, however the ``**kwargs`` + argument is exposed, allowing you to leverage additional arguments for each particular variant. + For example, we may introduce an VanillaAttentionWithCausalMask class, which includes an attention + mask: + + .. code-block:: python + + class VanillaAttentionWithCausalMask(AttentionImplV2): + ... + + def __call__( + self, + x: TensorValueLike, + kv_collection: ContinuousBatchingKVCacheCollection, + **kwargs, + ) -> tuple[TensorValue, ContinuousBatchingKVCacheCollection]: ... + + if "attn_mask" not in kwargs: + raise ValueError("attn_mask not provided to VanillaAttentionWithCausalMask") + + # Which we can then use the attention mask downstream like so: + op( + attn_mask = kwargs["attn_mask"] + ) + """ + + @abstractmethod + def __call__( + self, + x: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection + | PagedKVCacheCollection, + **kwargs, + ) -> TensorValue: ... + + +@dataclass +class DistributedAttentionImpl(Layer, ABC): + """ + A generalized Distributed attention interface. + """ + + @abstractmethod + def __call__( + self, + x: list[TensorValue], + signal_buffers: list[BufferValue], + kv_collections: list[ + ContinuousBatchingKVCacheCollection | PagedKVCacheCollection + ], + **kwargs, + ) -> list[TensorValue]: ... + + +@dataclass +class AttentionImplQKV(Layer, ABC): + """ + A generalized attention interface, that will be used upstream by a general Transformer. + We would expect a seperate subclass, articulating each variation of Attention: + + - AttentionWithRope + - AttentionWithAlibi + - VanillaAttentionWithCausalMask + - ... + + There are a series of shared attributes, however, more may be needed for each individual variant. + For example, we may introduce an OptimizedRotaryEmbedding class for the AttentionWithRope class: + + .. code-block:: python + + @dataclass + class AttentionWithRope(AttentionImpl): + rope: OptimizedRotaryEmbedding + ... + + We expect the ``__call__`` abstractmethod to remain relatively consistent, however the ``**kwargs`` + argument is exposed, allowing you to leverage additional arguments for each particular variant. + For example, we may introduce an VanillaAttentionWithCausalMask class, which includes an attention + mask: + + .. code-block:: python + + @dataclass + class VanillaAttentionWithCausalMask(AttentionImpl): + ... + + def __call__( + self, + x: TensorValueLike, + kv_collection: ContinuousBatchingKVCacheCollection, + valid_lengths: TensorValueLike, + **kwargs, + ) -> tuple[TensorValue, ContinuousBatchingKVCacheCollection]: ... + + if "attn_mask" not in kwargs: + raise ValueError("attn_mask not provided to VanillaAttentionWithCausalMask") + + # Which we can then use the attention mask downstream like so: + op( + attn_mask = kwargs["attn_mask"] + ) + """ + + n_heads: int + """The number of attention heads.""" + + kv_params: KVCacheParams + """KV Cache Params, including the number of kv heads, the head dim, and data type.""" + + layer_idx: int + """The layer number associated with this Attention block.""" + + wq: TensorValueLike + """The q weight vector.""" + + wk: TensorValueLike + """The k weight vector.""" + + wv: TensorValueLike + """The v weight vector.""" + + wo: Linear + """A linear layer for the output projection.""" + + scale: float + """The scale factor for the attention.""" + + def __post_init__(self) -> None: + assert self.scale is not None, ( + "scale must be provided to AttentionImplQKV" + ) + + if not self.kv_params.cache_strategy.uses_opaque(): + raise ValueError( + f"{self.kv_params.cache_strategy} cache strategy, not supported" + " in Attention layer." + ) + + @abstractmethod + def __call__( + self, + x: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection + | PagedKVCacheCollection, + **kwargs, + ) -> TensorValue: ... diff --git a/src/max/pipelines/nn/attention/naive_attention_with_rope.py b/src/max/pipelines/nn/attention/naive_attention_with_rope.py new file mode 100644 index 0000000000..3f136f167c --- /dev/null +++ b/src/max/pipelines/nn/attention/naive_attention_with_rope.py @@ -0,0 +1,223 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""An attention layer, using only native max graph operations, the naive cache, and ROPE.""" + +from __future__ import annotations + +import math + +from max.dtype import DType +from max.graph import BufferValue, TensorValue, TensorValueLike, ops +from max.pipelines.kv_cache import KVCacheParams + +from ..layer import LayerV2 +from ..linear import Linear, LinearV2 +from ..rotary_embedding import RotaryEmbedding +from .clamp import clamp + + +class NaiveAttentionWithRope(LayerV2): + def __init__( + self, + n_heads: int, + kv_params: KVCacheParams, + dim: int, + wq: Linear | LinearV2, + wk: Linear | LinearV2, + wv: Linear | LinearV2, + wo: Linear | LinearV2, + rope: RotaryEmbedding, + scale: float | None = None, + clip_qkv: float | None = None, + ): + super().__init__() + self.n_heads = n_heads + self.kv_params = kv_params + self.dim = dim + self.q_proj = wq + self.k_proj = wk + self.v_proj = wv + self.o_proj = wo + self.rope = rope + self.scale = ( + scale if scale else math.sqrt(1.0 / self.kv_params.head_dim) + ) + self.clip_qkv = clip_qkv + + if self.kv_params.cache_strategy.uses_opaque(): + raise ValueError( + f"{self.kv_params.cache_strategy} cache strategy, not supported" + " in Attention layer." + ) + + def repeat_kv(self, kv: TensorValue) -> TensorValue: + """Repeats key/value tensors to match the number of query heads.""" + batch = kv.shape[0] + kv = ops.reshape( + kv, + [batch, -1, self.kv_params.n_kv_heads, 1, self.kv_params.head_dim], + ) + + kv = ops.tile( + kv, [1, 1, 1, self.n_heads // self.kv_params.n_kv_heads, 1] + ) + return ops.reshape( + kv, [batch, -1, self.n_heads, self.kv_params.head_dim] + ) + + def attention( + self, + xq: TensorValueLike, + xk: TensorValueLike, + xv: TensorValueLike, + attn_mask: TensorValueLike, + keys: TensorValueLike, + values: TensorValueLike, + ) -> TensorValue: + xq = TensorValue(xq) + xk = TensorValue(xk) + xv = TensorValue(xv) + attn_mask = TensorValue(attn_mask) + keys = TensorValue(keys) + values = TensorValue(values) + + # Broadcast the attention mask across heads. + # Do so in the graph so that the broadcast can be fused downstream ops. + batch, seq_len, post_seq_len = attn_mask.shape + attn_mask = attn_mask.reshape( + (batch, 1, seq_len, post_seq_len) + ).broadcast_to((batch, self.n_heads, seq_len, post_seq_len)) + + keys = keys.transpose(0, 1) + values = values.transpose(0, 1) + + keys = self.repeat_kv(keys) + values = self.repeat_kv(values) + + xq = xq.transpose(1, 2) + keys = keys.transpose(1, 2) + values = values.transpose(1, 2) + + scores = xq @ ops.transpose(keys, 2, 3) + # Note, the graph compiler currently requires the order of operands + # to be `scores * scale` in order to pattern match the fused attention + # operator. + return ( + ops.softmax( + scores * ops.constant(self.scale, dtype=DType.float32) + + attn_mask + ) + @ values + ) + + def __call__( + self, + x: TensorValueLike, + attention_mask: TensorValueLike, + k_cache: BufferValue, + v_cache: BufferValue, + start_pos: TensorValue, + layer_index: int, + ) -> TensorValue: + """Computes attention on x, reusing the KV cache. + + Args: + x: Activations with shape (batch, seq_len, dim). + k_cache: The full keys cache buffer with shape + (max_seq_len, n_layers, max_batch, n_kv_heads, head_dim). + v_cache: The full values cache buffer with shape + (max_seq_len, n_layers, max_batch, n_kv_heads, head_dim). + start_pos: Scalar of the current position in the kv_cache. + + Returns the result of multi-headed self attention on the input. + """ + x = TensorValue(x) + batch, seq_len = x.shape[0], x.shape[1] + # Apply `clip_qkv` before matmuling the weights + if self.clip_qkv: + assert isinstance(self.q_proj.weight, TensorValue) + self.q_proj.weight = clamp( + self.q_proj.weight, min=-self.clip_qkv, max=self.clip_qkv + ) + assert isinstance(self.k_proj.weight, TensorValue) + self.k_proj.weight = clamp( + self.k_proj.weight, min=-self.clip_qkv, max=self.clip_qkv + ) + assert isinstance(self.v_proj.weight, TensorValue) + self.v_proj.weight = clamp( + self.v_proj.weight, min=-self.clip_qkv, max=self.clip_qkv + ) + + xq = self.q_proj(x) + xk = self.k_proj(x) + xv = self.v_proj(x) + + xq = ops.reshape( + xq, [batch, seq_len, self.n_heads, self.kv_params.head_dim] + ) + + xk = ops.reshape( + xk, + [ + batch, + seq_len, + self.kv_params.n_kv_heads, + self.kv_params.head_dim, + ], + ) + xv = ops.reshape( + xv, + [ + batch, + seq_len, + self.kv_params.n_kv_heads, + self.kv_params.head_dim, + ], + ) + + xq = self.rope(xq, start_pos, seq_len) + xk = self.rope(xk, start_pos, seq_len) + + # Write xk and xv back the to cache at start_pos. + # The cache can have a larger max batch size than the current input. + # We slice down to the active batch size. + # cache[start_pos:start_pos+seq_len, layer_index, :batch] = ... + seq_len_val = TensorValue(seq_len) + slice_seq_len = (slice(start_pos, start_pos + seq_len_val), seq_len) + batch_val = TensorValue(batch) + slice_batch = (slice(0, batch_val), batch) + k_cache[slice_seq_len, layer_index, slice_batch] = xk.transpose( + 0, 1 + ).cast(k_cache.dtype) + v_cache[slice_seq_len, layer_index, slice_batch] = xv.transpose( + 0, 1 + ).cast(k_cache.dtype) + + # Then slice the correct keys and values for attention. + # The cache can have a larger max batch size than the current input. + # We slice down to the active batch size. + # ... = cache[0:start_pos+seq_len, layer_index, :batch] + slice_post_seq_len = (slice(0, start_pos + seq_len_val), "post_seq_len") + keys = k_cache[slice_post_seq_len, layer_index, slice_batch].cast( + xq.dtype + ) + values = v_cache[slice_post_seq_len, layer_index, slice_batch].cast( + xq.dtype + ) + + output = ( + self.attention(xq, xk, xv, attention_mask, keys, values) + .transpose(1, 2) + .reshape([batch, seq_len, -1]) + ) + return self.o_proj(output) diff --git a/src/max/pipelines/nn/comm/__init__.py b/src/max/pipelines/nn/comm/__init__.py new file mode 100644 index 0000000000..92288c849d --- /dev/null +++ b/src/max/pipelines/nn/comm/__init__.py @@ -0,0 +1,18 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .allreduce import Signals + +__all__ = [ + "Signals", +] diff --git a/src/max/pipelines/nn/comm/allreduce.py b/src/max/pipelines/nn/comm/allreduce.py new file mode 100644 index 0000000000..3ab64efaa0 --- /dev/null +++ b/src/max/pipelines/nn/comm/allreduce.py @@ -0,0 +1,51 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Allreduce module definitions.""" + +from collections.abc import Iterable + +from max.dtype import DType +from max.graph import BufferType, DeviceRef + + +class Signals: + """Signal buffers used for peer-to-peer communication in allreduce. + + Device code uses these buffers by enabling peer-to-peer access. + Then thread blocks use the buffers to implement barriers for + synchronization, and to hold intermediate communication results. + """ + + NUM_BYTES = (1 + 128) * 1024 * 1024 + """The size of the signal buffers used for communication in allreduce.""" + # NOTE: ``NUM_BYTES`` must stay in sync with the size of the ``Signal`` + # Mojo struct + the size of the intermediate buffer for communication. + + devices: list[DeviceRef] + """List of devices that these signals communicate between.""" + + def __init__(self, devices: Iterable[DeviceRef]) -> None: + """ + Args: + devices: Devices between which these signals communicate. + """ + self.devices = list(devices) + + def input_types(self) -> list[BufferType]: + """Gets graph input types corresponding to these signal buffers.""" + return [ + BufferType( + dtype=DType.uint8, shape=(Signals.NUM_BYTES,), device=dev + ) + for dev in self.devices + ] diff --git a/src/max/pipelines/nn/compute_log_probabilities.py b/src/max/pipelines/nn/compute_log_probabilities.py new file mode 100644 index 0000000000..2914c34582 --- /dev/null +++ b/src/max/pipelines/nn/compute_log_probabilities.py @@ -0,0 +1,101 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from typing import Callable + +import numpy as np +from max.pipelines import LogProbabilities +from scipy.special import log_softmax # type: ignore + + +def compute_log_probabilities( + get_logits_and_samples: Callable[ + [int, bool], (tuple[np.ndarray, np.ndarray] | None) + ], + batch_top_n: list[int], + batch_echo: list[bool], +) -> list[LogProbabilities | None]: + """Computes the log probabilities. + + Args: + get_logits_and_samples: Callable that takes the batch index and an + `echo` bool and returns the logits and sampled tokens for that batch. + Args: + - batch_index is an int between [0, batch_size) + - echo is whether that item was requested to echo the input tokens. + Returns (None if batch item is empty): + - Logits should have shape = (n_tokens, vocab_size). + - Sampled tokens should have shape = (n_tokens). + batch_top_n: Number of top log probabilities to return per input in + the batch. For any element where `top_n == 0`, the + LogProbabilities is skipped. + batch_echo: Whether to include input tokens in the returned log + probabilities. + + Returns: + Computed log probabilities for each item in the batch. + """ + log_probabilities: list[LogProbabilities | None] = [] + for batch, (top_n, echo) in enumerate(zip(batch_top_n, batch_echo)): + if top_n == 0: + log_probabilities.append(None) + continue + + logits_and_samples = get_logits_and_samples(batch, echo) + if not logits_and_samples: + log_probabilities.append(None) + continue + + logits, samples = logits_and_samples + log_probs = log_softmax(logits, axis=-1) + + # Get top n tokens. + top_n_indices = np.argpartition(log_probs, -top_n, axis=-1)[ + ..., -top_n: + ] + + # Get the log probabilities of each sampled token. + sampled_log_probs = np.take_along_axis( + log_probs, samples.reshape(-1, 1), axis=1 + ).reshape(-1) + + # Store the stats for each sample token. + num_tokens = log_probs.shape[0] + token_log_probabilities = [] + top_log_probabilities = [] + for i in range(num_tokens): + token_log_probabilities.append(sampled_log_probs[i].item()) + + # Compute top n log probs. + top_tokens = {} + for n in range(top_n): + top_token = top_n_indices[i][n] + top_token_logits = log_probs[i][top_token] + top_tokens[top_token] = top_token_logits.item() + + # Include sampled token in the top tokens. + sampled_token = samples[i].item() + top_tokens[sampled_token] = sampled_log_probs[i].item() + + top_log_probabilities.append(top_tokens) + + log_probabilities.append( + LogProbabilities( + token_log_probabilities=token_log_probabilities, + top_log_probabilities=top_log_probabilities, + ) + ) + + return log_probabilities diff --git a/src/max/pipelines/nn/conv.py b/src/max/pipelines/nn/conv.py new file mode 100644 index 0000000000..b7cda54f3e --- /dev/null +++ b/src/max/pipelines/nn/conv.py @@ -0,0 +1,177 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from dataclasses import dataclass +from typing import Optional, Tuple, Union + +from max.graph import TensorValue, TensorValueLike, Weight, ops + +from .layer import Layer + + +@dataclass +class Conv2D(Layer): + """A 2D convolution over an input signal composed of several input + planes. + """ + + filter: TensorValueLike + bias: Optional[TensorValueLike] = None + + stride: Union[int, Tuple[int, int]] = (1, 1) + padding: Union[int, Tuple[int, int, int, int]] = (0, 0, 0, 0) + dilation: Union[int, Tuple[int, int]] = (1, 1) + groups: int = 1 + + def __call__(self, x: TensorValue) -> TensorValue: + # These need to be casted as the underlying ops.conv2d call + # expects them to only be tuple types. + if isinstance(self.stride, int): + self.stride = (self.stride, self.stride) + + if isinstance(self.padding, int): + self.padding = ( + self.padding, + self.padding, + self.padding, + self.padding, + ) + + if isinstance(self.dilation, int): + self.dilation = (self.dilation, self.dilation) + + if ( + isinstance(self.filter, Weight) + and self.filter.quantization_encoding is not None + ): + raise ValueError("Conv1D not implemented with weight quantization.") + return ops.conv2d( + x, + self.filter, + self.stride, + self.dilation, + self.padding, + self.groups, + self.bias, + ) + + +@dataclass +class Conv1D(Layer): + """A 1D convolution over an input signal composed of several input + planes. + """ + + filter: TensorValueLike # [kernel_size, in_channels, out_channels] + bias: Optional[TensorValueLike] = None + + stride: int = 1 + padding: int = 0 + dilation: int = 1 + groups: int = 1 + + def __call__(self, x: TensorValueLike) -> TensorValue: + """ + Args: + x: a tensor of shape [batch_size, length, in_channels] + + Returns: + a tensor of shape [batch_size, new_length, out_channels] + new_length = ((length + 2 * padding - (kernel_size - 1) - 1) / stride) + 1 + """ + # TODO(GEX-327): Support Conv1D in mo rather than implementing it using Conv2D. + # Reshape [batch_size, length, in_channels] to [batch_size, height=1, length, in_channels]. + x = ops.unsqueeze(x, 1) + # Reshape [kernel_size, in_channels, out_channels] to [height=1, kernel_size, in_channels, out_channels]. + filter = ops.unsqueeze(self.filter, 0) + if ( + isinstance(self.filter, Weight) + and self.filter.quantization_encoding is not None + ): + raise ValueError("Conv1D not implemented with weight quantization.") + else: + output = ops.conv2d( + x, + filter, + (1, self.stride), + (1, self.dilation), + (0, 0, self.padding, self.padding), + self.groups, + self.bias, + ) + # Reshape [batch_size, height=1, new_length, out_channels] to [batch_size, new_length, out_channels]. + return ops.squeeze(output, 1) + + +@dataclass +class Conv3D(Layer): + """A 3D convolution over an input signal composed of several input + planes. + """ + + filter: TensorValueLike # [depth, height, width, in_channels / num_groups, out_channels] + bias: Optional[TensorValueLike] = None # [out_channels] + + stride: Union[int, Tuple[int, int, int]] = (1, 1, 1) + padding: Union[int, Tuple[int, int, int, int, int, int]] = ( + 0, + 0, + 0, + 0, + 0, + 0, + ) + dilation: Union[int, Tuple[int, int, int]] = (1, 1, 1) + groups: int = 1 + + def __call__(self, x: TensorValueLike) -> TensorValue: + """ + Args: + x: a tensor of shape [batch_size, length, in_channels] + + Returns: + a tensor of shape [batch_size, new_length, out_channels] + new_length = ((length + 2 * padding - (kernel_size - 1) - 1) / stride) + 1 + """ + # These need to be casted as the underlying ops.conv2d call + # expects them to only be tuple types. + if isinstance(self.stride, int): + self.stride = (self.stride, self.stride, self.stride) + + if isinstance(self.padding, int): + self.padding = ( + self.padding, + self.padding, + self.padding, + self.padding, + self.padding, + self.padding, + ) + + if isinstance(self.dilation, int): + self.dilation = (self.dilation, self.dilation, self.dilation) + + if ( + isinstance(self.filter, Weight) + and self.filter.quantization_encoding is not None + ): + raise ValueError("Conv3D not implemented with weight quantization.") + return ops.conv3d( + x, + self.filter, + self.stride, + self.dilation, + self.padding, + self.groups, + self.bias, + ) diff --git a/src/max/pipelines/nn/embedding.py b/src/max/pipelines/nn/embedding.py new file mode 100644 index 0000000000..fceaa845d3 --- /dev/null +++ b/src/max/pipelines/nn/embedding.py @@ -0,0 +1,255 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import math +from dataclasses import dataclass +from typing import Optional + +from max.dtype import DType +from max.graph import ( + BufferValue, + DeviceRef, + TensorValue, + TensorValueLike, + Weight, + ops, +) +from max.graph.quantization import QuantizationEncoding + +from .layer import Layer, LayerV2 + + +@dataclass +class Embedding(Layer): + weights: TensorValueLike + + def __call__(self, indices: TensorValueLike) -> TensorValue: + result = ops.gather(self.weights, indices, axis=0) + if ( + isinstance(self.weights, Weight) + and self.weights.quantization_encoding is not None + ): + result = ops.dequantize(self.weights.quantization_encoding, result) + return result + + +class EmbeddingV2(LayerV2): + """ + A lookup table for embedding integer indices into dense vectors. + + This layer maps each integer index to a dense vector of fixed size. + Embedding weights are stored on the CPU but are moved to the specified + device during the model init phase. + + Example: + + .. code-block:: python + + embedding_layer = EmbeddingV2( + vocab_size=1000, + hidden_dim=256, + dtype=DType.float32, + device=DeviceRef.GPU(), + name="embeddings", + ) + + # Token indices of shape: [batch, ..., num_indices]. + token_indices: TensorValueLike + embeddings = embedding_layer(token_indices) + """ + + weight: Weight + """The embedding weight matrix stored on the CPU. + Model init moves weights to the device specified in :obj:`device`.""" + + device: DeviceRef | None + """The device on which embedding lookup is performed.""" + + def __init__( + self, + vocab_size: int, + hidden_dim: int, + dtype: DType, + device: DeviceRef | None = None, + quantization_encoding: Optional[QuantizationEncoding] = None, + name: Optional[str] = None, + ) -> None: + """Initializes the embedding layer with the given arguments. + + Args: + vocab_size: The number of unique items in the vocabulary. + Indices must be in the range ``[0, vocab_size)``. + hidden_dim: The dimensionality of each embedding vector. + dtype: The data type of the embedding weights. + device: The device where embedding lookups are executed. + Model init transfers the initially CPU-resident weights to this + device. + name: The name identifier for the embedding weight matrix. + """ + super().__init__() + + self.device = device + self.weight = Weight( + name or "weight", + dtype, + shape=(vocab_size, hidden_dim), + device=DeviceRef.CPU() if self.device else None, + quantization_encoding=quantization_encoding, + ) + + def __call__(self, indices: TensorValueLike) -> TensorValue: + """Embeds the input indices by looking up corresponding vectors. + + Args: + indices: A tensor of integer indices to look up. + Each index must be in the range ``[0, vocab_size)``. + + Returns: + A tensor containing the embeddings corresponding to the input + indices. + The result resides on the device specified in :obj:`device`. + """ + weight = self.weight.to(self.device) if self.device else self.weight + result = ops.gather( + TensorValue(weight), + indices, + axis=0, + ) + if self.weight.quantization_encoding is not None: + result = ops.dequantize(self.weight.quantization_encoding, result) + return result + + +class VocabParallelEmbedding(LayerV2): + """ + A lookup table for embedding integer indices into dense vectors. + + This layer works like `nn.Embedding` except the embedding table is sharded + on the vocabulary dimension across all devices. + + Example: + + .. code-block:: python + + embedding_layer = VocabParallelEmbedding( + vocab_size=1000, + hidden_dim=256, + dtype=DType.float32, + device=[DeviceRef.GPU(0), DeviceRef.GPU(1)], + name="embeddings", + ) + + # Token indices of shape: [batch, ..., num_indices]. + token_indices: TensorValueLike + embeddings = embedding_layer(token_indices) + """ + + def __init__( + self, + vocab_size: int, + hidden_dim: int, + dtype: DType, + devices: list[DeviceRef], + quantization_encoding: Optional[QuantizationEncoding] = None, + name: Optional[str] = None, + ): + """ + Args: + vocab_size: The number of unique items in the vocabulary. + Indices must be in the range ``[0, vocab_size)``. + hidden_dim: The dimensionality of each embedding vector. + dtype: The data type of the embedding weights. + devices: The devices where embedding lookups are executed. + Model init transfers the initially CPU-resident weights to this + device. + name: The name identifier for the embedding weight matrix. + """ + super().__init__() + self.vocab_size = vocab_size + self.devices = devices + + self.num_devices = len(self.devices) + self.shard_size = math.ceil(self.vocab_size / self.num_devices) + + # The weight is loaded in with a single op, then copied to each device + # in __call__. + self.weight = Weight( + name or "weight", + dtype, + shape=(vocab_size, hidden_dim), + device=DeviceRef.CPU(), + quantization_encoding=quantization_encoding, + ) + + def __call__( + self, indices: TensorValueLike, signal_buffers: list[BufferValue] + ) -> list[TensorValue]: + """Embeds the input indices by looking up corresponding vectors. + + Args: + indices: A tensor of integer indices to look up. + Each index must be in the range ``[0, vocab_size)``. + + Returns: + A tensor containing the embeddings corresponding to the input + indices. + The result resides on the device specified in :obj:`device`. + """ + # Shard the weight onto each device. + input = TensorValue(indices) + outputs = [ + self._per_device_call(input, n) for n in range(self.num_devices) + ] + return ops.allreduce.sum(outputs, signal_buffers) + + def _per_device_call( + self, indices: TensorValue, device_idx: int + ) -> TensorValue: + """Computes the embeddings for the input indices, for a single device.""" + # Copy a shard from the embedding weights onto the device. + device = self.devices[device_idx] + vocab_start_index = self.shard_size * device_idx + vocab_end_index = min( + self.shard_size * (device_idx + 1), self.vocab_size + ) + embedding_shard = self.weight[vocab_start_index:vocab_end_index].to( + device + ) + + indices = indices.to(device) + # Process indices so that all tokens are between 0 and the shard size. + + # Set up mask so that the 1=tokens within range, 0=tokens out of range. + input_mask = ops.logical_and( + indices >= vocab_start_index, indices < vocab_end_index + ) + + # Tokens that are out of this range are masked out. + indices -= vocab_start_index + + # Apply mask to avoid searching for out-of-bound tokens + indices *= input_mask + + result = ops.gather( + embedding_shard, + indices, + axis=0, + ) + if self.weight.quantization_encoding is not None: + result = ops.dequantize(self.weight.quantization_encoding, result) + result *= ops.cast( + ops.unsqueeze(input_mask, 1), result.dtype + ) # Apply input mask again + return result diff --git a/src/max/pipelines/nn/hooks/__init__.py b/src/max/pipelines/nn/hooks/__init__.py new file mode 100644 index 0000000000..b39c9375e4 --- /dev/null +++ b/src/max/pipelines/nn/hooks/__init__.py @@ -0,0 +1,20 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .print_hook import PrintHook +from .torch_print_hook import TorchPrintHook + +__all__ = [ + "PrintHook", + "TorchPrintHook", +] diff --git a/src/max/pipelines/nn/hooks/base_print_hook.py b/src/max/pipelines/nn/hooks/base_print_hook.py new file mode 100644 index 0000000000..4241cd88bb --- /dev/null +++ b/src/max/pipelines/nn/hooks/base_print_hook.py @@ -0,0 +1,159 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import dataclasses +import os +from abc import ABC, abstractmethod +from collections import Counter +from dataclasses import dataclass +from typing import Any + +from max.pipelines.nn._identity import IdentityMap + + +@dataclass +class LayerInfo: + layer_name: str + call_count: int = 0 + + +class BasePrintHook(ABC): + """Base hook for printing values. + + This class defines a `__call__` method that prints the inputs and outputs. + Only layers that have been saved with `hook.add_layer` will be printed. + + Abstract methods: + - print_value(name, value) -> bool: Override this method to print the value, + and return whether the print was successful. + + Properties: + - export_path: The base path to write values into (can be None). The full + exported path is "{export_path}/{step}". + + Methods: + - __call__(layer, args, kwargs, outputs): Calls `self.print_value`. + - add_layer(layer, name): Stores the name of a layer. + - step(): Can be called to increment the step and update the export path. + - remove(): To be used to remove the hook and run some cleanup steps. + - summarize(): Summarize the total number of tensors printed at each step. + """ + + def __init__(self, export_path: str | None = None): + self._known_layers = IdentityMap() # Maps layer -> LayerInfo + self._export_path = export_path + self._current_step = 0 + # Keep a counter for creating unique layer names. + self._layer_counter: dict[str, int] = Counter() + + # Maps step number -> [list of printed tensors] + self._recorded_prints: dict[int, list[str]] = {} + + def add_layer(self, layer, name): + self._known_layers[layer] = LayerInfo(name) + + @property + def export_path(self) -> str | None: + if self._export_path is None: + return None + return os.path.join(self._export_path, str(self._current_step)) + + def step(self): + self._current_step += 1 + + # Update export path. + if export_path := self.export_path: + os.makedirs(export_path, exist_ok=True) + + # Reset layer call counts. + for info in self._known_layers.values(): + info.call_count = 0 + + def __call__(self, layer, args, kwargs, outputs): + """Print all TensorValues.""" + if layer not in self._known_layers: + # If layer is not yet named, use the class name. + layer_cls = type(layer).__name__ + self._layer_counter[layer_cls] += 1 + layer_name = layer_cls + if self._layer_counter[layer_cls] > 1: + layer_name = f"{layer_name}{self._layer_counter[layer_cls]}" + self._known_layers[layer] = LayerInfo(layer_name) + + # Update call count and get layer name. + info = self._known_layers[layer] + info.call_count += 1 + if info.call_count > 1: + debug_name = f"{info.layer_name}({info.call_count})" + else: + debug_name = info.layer_name + + # Print input args and kwargs + for n, arg in enumerate(args): + self.print_and_record(f"{debug_name}-input_{n}", arg) + for key, value in kwargs.items(): + self.print_and_record(f"{debug_name}-input_{key}", value) + + # Print outputs. + if self.print_and_record(f"{debug_name}-output", outputs): + pass + elif isinstance(outputs, (list, tuple)): + for n, out in enumerate(outputs): + self.print_and_record(f"{debug_name}-output_{n}", out) + elif dataclasses.is_dataclass(outputs): + for field in dataclasses.fields(outputs): + self.print_and_record( + f"{debug_name}-output_{field.name}", + getattr(outputs, field.name), + ) + else: + print( + f"Was not able to write outputs from {debug_name} (output type" + f" was {type(outputs)})" + ) + + def print_and_record(self, name: str, value: Any) -> bool: + """Runs self.print_value and records the tensor if printed.""" + print_success = self.print_value(name, value) + if print_success: + if self._current_step not in self._recorded_prints: + self._recorded_prints[self._current_step] = [] + self._recorded_prints[self._current_step].append(name) + return print_success + + @abstractmethod + def print_value(self, name: str, value: Any) -> bool: + """Prints a value, and returns whether the print is successful.""" + raise NotImplementedError + + def summarize(self): + action = "Printed" + if self.export_path: + action = "Saved" + + tensors_printed = False + for step, tensors in self._recorded_prints.items(): + print(f"{action} {len(tensors)} tensors for step {step}.") + tensors_printed = tensors_printed or bool(len(tensors)) + + if not tensors_printed: + print("No tensors exported.") + elif self._export_path: + print(f"Tensors exported to {self._export_path}") + + def remove(self): + # Clean up export_path if it's empty. + if (export_path := self.export_path) and not os.listdir(export_path): + os.rmdir(export_path) diff --git a/src/max/pipelines/nn/hooks/identity.py b/src/max/pipelines/nn/hooks/identity.py new file mode 100644 index 0000000000..eeb038c45a --- /dev/null +++ b/src/max/pipelines/nn/hooks/identity.py @@ -0,0 +1,71 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Utility classes for using objects as keys in data structures.""" + +from collections.abc import MutableMapping, MutableSet + + +# From https://stackoverflow.com/questions/16994307/identityset-in-python +class IdentitySet(MutableSet): + """Set that uses object `id` as keys to support unhashable types.""" + + def __init__(self, iterable=()): + self.map = {} # id -> object + self |= iterable # add elements from iterable to the set (union) + + def __len__(self): + return len(self.map) + + def __iter__(self): + return iter(self.map.values()) + + def __contains__(self, x): + return id(x) in self.map + + def add(self, value): + """Add an element.""" + self.map[id(value)] = value + + def discard(self, value): + """Remove an element. Do not raise an exception if absent.""" + self.map.pop(id(value), None) + + def __repr__(self): + if not self: + return "%s()" % (self.__class__.__name__,) + return "%s(%r)" % (self.__class__.__name__, list(self)) + + +class IdentityMap(MutableMapping): + """Map that uses object `id` as keys to support unhashable types.""" + + def __init__(self): + self.key_map = {} # id -> object + self.value_map = {} # id -> Value + + def __getitem__(self, key): + return self.value_map[id(key)] + + def __setitem__(self, key, value): + self.key_map[id(key)] = key + self.value_map[id(key)] = value + + def __delitem__(self, key): + del self.key_map[id(key)] + del self.value_map[id(key)] + + def __iter__(self): + return iter(self.key_map.values()) + + def __len__(self): + return len(self.key_map) diff --git a/src/max/pipelines/nn/hooks/print_hook.py b/src/max/pipelines/nn/hooks/print_hook.py new file mode 100644 index 0000000000..845a6c0c3a --- /dev/null +++ b/src/max/pipelines/nn/hooks/print_hook.py @@ -0,0 +1,91 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Print hook for MAX Pipeline models.""" + +from __future__ import annotations + +import logging +import os +from collections import deque +from typing import Any, Optional, Tuple + +from max.graph import TensorValue +from max.pipelines.nn._identity import IdentitySet +from max.pipelines.nn.layer import Layer, add_layer_hook, clear_hooks + +from .base_print_hook import BasePrintHook + +logger = logging.getLogger("max.pipelines") + + +class PrintHook(BasePrintHook): + """Hook that prints/saves layer tensor inputs and outputs. + + This class must be initialized added before the graph is built so the + print ops can be added to the graph. + """ + + def __init__(self, export_path: Optional[str] = None): + super().__init__(export_path=export_path) + add_layer_hook(self) + if export_path is not None: + logger.warning( + "Export path is currently not supported. Values will be printed" + " to stdout with COMPACT format." + ) + + def name_layers(self, model: Layer): + """Create names for all layers in the model based on nested attributes.""" + for layer, name in _walk_layers(model): + self.add_layer(layer, name) + + @property + def export_path(self) -> Optional[str]: + if self._export_path is None: + return None + return os.path.join(self._export_path, str(self._current_step)) + + def print_value(self, name: str, value: Any) -> bool: + if isinstance(value, TensorValue): + value.print(name) + return True + return False + + def remove(self): + super().remove() + clear_hooks() # TODO: Add individual hook remover. + + def __del__(self): + self.summarize() + + +_SUPPORTED_TYPES = (Layer, list, tuple) + + +def _walk_layers(model): + """Walks through model and yields all layers with generated names.""" + seen = IdentitySet() + seen.add(model) + queue: deque[Tuple[Any, str]] = deque([(model, "model")]) + + while queue: + obj, name = queue.popleft() + if isinstance(obj, Layer): + yield obj, name + for k, v in obj.__dict__.items(): + if v not in seen or isinstance(v, _SUPPORTED_TYPES): + queue.append((v, f"{name}.{k}")) + elif isinstance(obj, (list, tuple)): + for n, v in enumerate(obj): + if v not in seen or isinstance(v, _SUPPORTED_TYPES): + queue.append((v, f"{name}.{n}")) diff --git a/src/max/pipelines/nn/hooks/torch_print_hook.py b/src/max/pipelines/nn/hooks/torch_print_hook.py new file mode 100644 index 0000000000..1decc2677c --- /dev/null +++ b/src/max/pipelines/nn/hooks/torch_print_hook.py @@ -0,0 +1,69 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Print hook for torch models.""" + +from __future__ import annotations + +import os +from typing import Any + +import torch + +from .base_print_hook import BasePrintHook + + +class TorchPrintHook(BasePrintHook): + """A torch-compatible print hook.""" + + _handle: torch.utils.hooks.RemovableHandle + """A handle used to remove the forward hook registered by this class.""" + + def __init__(self, export_path: str | None = None): + super().__init__(export_path) + self._handle = torch.nn.modules.module.register_module_forward_hook( + self + ) + + if export_path := self.export_path: + os.makedirs(export_path, exist_ok=True) + + def name_layers(self, model: torch.nn.Module): + """Create names for all layers in the model.""" + for module_name, module in model.named_modules(): + name = f"model.{module_name}" if module_name else "model" + self.add_layer(module, name) + + @property + def export_path(self) -> str | None: + if self._export_path is None: + return None + return os.path.join(self._export_path, str(self._current_step)) + + def __call__(self, module, args, outputs) -> None: # type: ignore + super().__call__(module, args, kwargs={}, outputs=outputs) + + def print_value(self, name: str, value: Any) -> bool: + if isinstance(value, torch.Tensor): + if export_path := self.export_path: + full_path = f"{export_path}/{name}.pt" + torch.save(value, full_path) + else: + print(name, value) + return True + return False + + def remove(self): + super().remove() + + if self._handle: + self._handle.remove() diff --git a/src/max/pipelines/nn/kernels.py b/src/max/pipelines/nn/kernels.py new file mode 100644 index 0000000000..476491da17 --- /dev/null +++ b/src/max/pipelines/nn/kernels.py @@ -0,0 +1,910 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""Helper functions for wrapping custom kv cache/attention related ops.""" + +from __future__ import annotations + +from dataclasses import dataclass +from enum import Enum + +import numpy as np +from max.dtype import DType +from max.graph import Dim, TensorType, TensorValue, TensorValueLike, ops +from max.graph.quantization import QuantizationConfig +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + KVCacheParams, + KVCacheStrategy, + PagedKVCacheCollection, +) + + +def fused_qkv_ragged_matmul( + kv_params: KVCacheParams, + input: TensorValue, + input_row_offsets: TensorValue, + wqkv: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection | PagedKVCacheCollection, + layer_idx: TensorValue, + n_heads: int, + bias: TensorValue | None = None, +) -> TensorValue: + """Computes fused query, key, and value projections with ragged input. + + `input` and `input_row_offsets` are used together to implement the ragged + tensor. + `input_row_offsets` indicates where each batch starts and ends in `input` + + Raises: + ValueError: on input shapes/dtypes that are invalid for the kernel. + """ + if input.dtype != wqkv.dtype: + msg = ( + "expected input and wqkv to have the same dtype, but got" + f" {input.dtype} and {wqkv.dtype}, respectively." + ) + raise ValueError(msg) + + input_rank_expected = 2 + if input.rank != input_rank_expected: + msg = f"expected input to have rank {input_rank_expected}, was {input.rank}" + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = ( + "expected input_row_offsets to have dtype uint32, was" + f" {input_row_offsets.dtype}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected layer_idx to have dtype uint32, was {layer_idx.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy not in { + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.PAGED, + }: + msg = f"unsupported cache strategy for fused_qkv_ragged_matmul: {kv_params.cache_strategy}" + raise ValueError(msg) + + parameters: dict[str, int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + } + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = int(kv_params.page_size) + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + + if bias: + op_name = f"mo.fused_qkv_matmul.ragged.{cache_strategy_str}.bias" + + return ops.inplace_custom( + op_name, + values=[ + input, + input_row_offsets, + wqkv, + kv_collection, + layer_idx, + bias, + ], + out_types=[ + TensorType( + dtype=input.dtype, + shape=input.shape[:-1] + [n_heads * kv_params.head_dim], + device=input.device, + ) + ], + parameters=parameters, + )[0].tensor + + op_name = f"mo.fused_qkv_matmul.ragged.{cache_strategy_str}" + + return ops.inplace_custom( + op_name, + values=[input, input_row_offsets, wqkv, kv_collection, layer_idx], + out_types=[ + TensorType( + dtype=input.dtype, + shape=input.shape[:-1] + [n_heads * kv_params.head_dim], + device=input.device, + ) + ], + parameters=parameters, + )[0].tensor + + +def fused_qkv_ragged_matmul_quantized( + kv_params: KVCacheParams, + input: TensorValue, + input_row_offsets: TensorValue, + wqkv: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection | PagedKVCacheCollection, + layer_idx: TensorValue, + n_heads: int, + quantization_config: QuantizationConfig, + perm_idx: TensorValue | None = None, + bias: TensorValue | None = None, +) -> TensorValue: + """Computes fused query, key, and value projections with ragged input and + quantized weight matrices. A `quantization_config` must be provided. + + `input` and `input_row_offsets` are used together to implement the ragged + tensor. + `input_row_offsets` indicates where each batch starts and ends in `input` + + Raises: + ValueError: on input shapes/dtypes that are invalid for the kernel. + """ + + input_rank_expected = 2 + if input.rank != input_rank_expected: + msg = f"expected input to have rank {input_rank_expected}, was {input.rank}" + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = ( + "expected input_row_offsets to have dtype uint32, was" + f" {input_row_offsets.dtype}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected layer_idx to have dtype uint32, was {layer_idx.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy not in { + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.PAGED, + }: + msg = f"unsupported cache strategy for fused_qkv_ragged_matmul: {kv_params.cache_strategy}" + raise ValueError(msg) + + # In the group-wise quantization scheme, every `group_size` quantized weights + # share the same scale. If `has_zp` is `True`, there is also a group-wise zero + # point that need to be substracted from the quantized weights. + # Since the new extensibility API doesn't currently support `bool` type parameters, + # we pass `has_zp` as an interger (`has_zp_int`). + # For GPTQ, `has_zp_int` will always be 0. + parameters: dict[str, int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + "group_size": quantization_config.group_size, + "has_zp_int": 0, + } + if perm_idx: + input = ops.gather(input, TensorValue(perm_idx), axis=1) + wqkv = ops.custom( + "GPTQ_gpu_repack_b4_g128_desc_act", + list((wqkv, perm_idx)), + out_types=[ + TensorType( + DType.uint8, + ((wqkv.shape[1], wqkv.shape[0])), + ) + ], + )[0].tensor + else: + wqkv = ops.custom( + "GPTQ_gpu_repack_b4_g128", + list((wqkv,)), + out_types=[ + TensorType( + DType.uint8, + ((wqkv.shape[1], wqkv.shape[0])), + ) + ], + )[0].tensor + + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = int(kv_params.page_size) + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + + args = [input, input_row_offsets, wqkv, kv_collection, layer_idx] + if bias: + args.append(bias) + bias_name_str = "bias." + else: + bias_name_str = "" + + op_name = f"mo.fused_qkv_matmul.ragged.{cache_strategy_str}.{bias_name_str}quantized" + + return ops.inplace_custom( + op_name, + values=args, + out_types=[ + TensorType( + dtype=input.dtype, + shape=input.shape[:-1] + [n_heads * kv_params.head_dim], + device=input.device, + ) + ], + parameters=parameters, + )[0].tensor + + +def fused_qkv_matmul( + kv_params: KVCacheParams, + input: TensorValue, + wqkv: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + layer_idx: TensorValue, + n_heads: int, +) -> TensorValue: + """Computes fused query, key and value projections.""" + if input.dtype != wqkv.dtype: + msg = ( + "expected input and wqkv to have the same dtype, but got" + f" {input.dtype} and {wqkv.dtype}, respectively." + ) + raise ValueError(msg) + + input_rank_expected = 3 + if input.rank != input_rank_expected: + msg = f"expected input to have rank {input_rank_expected}, was {input.rank}" + raise ValueError(msg) + + wqkv_rank_expected = 2 + if wqkv.rank != wqkv_rank_expected: + msg = ( + f"expected wqkv to have rank {wqkv_rank_expected}, was {wqkv.rank}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected layer_idx to have dtype uint32, was {layer_idx.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy != KVCacheStrategy.CONTINUOUS: + msg = f"unsupported cache strategy for fused_qkv_matmul: {kv_params.cache_strategy}" + raise ValueError(msg) + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.fused_qkv_matmul.padded.{cache_strategy_str}" + + return ops.inplace_custom( + op_name, + values=[input, wqkv, kv_collection, layer_idx], + out_types=[ + TensorType( + dtype=input.dtype, + shape=input.shape[:-1] + [n_heads * kv_params.head_dim], + device=input.device, + ) + ], + parameters={ + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + }, + )[0].tensor + + +def matmul_kv_cache_ragged( + kv_params: KVCacheParams, + hidden_states: TensorValue, + input_row_offsets: TensorValue, + weight: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + layer_idx: int | np.integer, +) -> None: + """Computes key and value projections with ragged input. + + `hidden_states` and `input_row_offsets` are used together to + implement the ragged tensor. + `input_row_offsets` indicates where each batch starts and ends in `input` + """ + if hidden_states.dtype != weight.dtype: + msg = ( + "expected hidden_states and weight to have the same dtype, but got" + f" {hidden_states.dtype} and {weight.dtype}, respectively." + ) + raise ValueError(msg) + + hidden_states_rank_expected = 2 + if hidden_states.rank != hidden_states_rank_expected: + msg = ( + "expected hidden_states to have rank " + f"{hidden_states_rank_expected}, was {hidden_states.rank}" + ) + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = ( + "expected input_row_offsets to have dtype uint32, was" + f" {input_row_offsets.dtype}" + ) + raise ValueError(msg) + + if kv_params.cache_strategy != KVCacheStrategy.CONTINUOUS: + msg = f"unsupported cache strategy for matmul_kv_cache_ragged: {kv_params.cache_strategy}" + raise ValueError(msg) + + parameters: dict[str, int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + } + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = kv_params.page_size + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.kv_matmul.ragged.{cache_strategy_str}" + + ops.inplace_custom( + name=op_name, + values=[ + hidden_states, + input_row_offsets, + weight, + kv_collection, + ops.constant(layer_idx, DType.uint32), + ], + parameters=parameters, + ) + + +def fused_qk_ragged_rope( + kv_params: KVCacheParams, + input: TensorValue, + input_row_offsets: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection | PagedKVCacheCollection, + freqs_cis: TensorValue, + layer_idx: TensorValue, + interleaved: bool = True, +) -> TensorValue: + """Computes fused query-key attention with rotary positional encodings and ragged inputs. + + `input` and `input_row_offsets` are used together to implement the ragged tensor. + `input_row_offsets` indicates where each batch starts and ends in `input` + """ + + if input.dtype != freqs_cis.dtype: + msg = ( + "expected input and freqs_cis to share a dtype, but got" + f" {input.dtype} and {freqs_cis.dtype} respectively" + ) + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = ( + "expected input_row_offsets to have dtype uint32, was" + f" {input_row_offsets.dtype}" + ) + + if layer_idx.dtype != DType.uint32: + msg = f"expected layer_idx to have dtype uint32, was {layer_idx.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy not in { + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.PAGED, + }: + msg = f"unsupported cache strategy for fused_qk_ragged_rope: {kv_params.cache_strategy}" + raise ValueError(msg) + + parameters: dict[str, bool | int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + "interleaved": interleaved, + } + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = kv_params.page_size + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.fused_qk_rope.ragged.{cache_strategy_str}" + + return ops.inplace_custom( + op_name, + values=[input, input_row_offsets, kv_collection, freqs_cis, layer_idx], + out_types=[ + TensorType( + dtype=input.dtype, shape=input.shape, device=input.device + ) + ], + parameters=parameters, + )[0].tensor + + +def fused_qk_rope( + kv_params: KVCacheParams, + input: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + freqs_cis_2d: TensorValue, + layer_idx: TensorValue, + interleaved: bool = True, +) -> TensorValue: + """Computes fused query-key attention with rotary positional encodings.""" + input_rank_expected = 4 + if input.rank != input_rank_expected: + msg = ( + f"expected input of rank {input_rank_expected} but got {input.rank}" + ) + raise ValueError(msg) + + freqs_cis_rank_expected = 2 + if freqs_cis_2d.rank != freqs_cis_rank_expected: + msg = ( + f"expected freqs_cis_2d of rank {freqs_cis_rank_expected} but got " + f"{freqs_cis_2d.rank}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected uint32 layer_idx but got {layer_idx.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy != KVCacheStrategy.CONTINUOUS: + msg = f"unsupported cache strategy for fused_qk_rope: {kv_params.cache_strategy}" + raise ValueError(msg) + + parameters: dict[str, bool | int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + "interleaved": interleaved, + } + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = kv_params.page_size + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.fused_qk_rope.padded.{cache_strategy_str}" + + return ops.inplace_custom( + op_name, + values=[input, kv_collection, freqs_cis_2d, layer_idx], + out_types=[ + TensorType( + dtype=input.dtype, shape=input.shape, device=input.device + ) + ], + parameters=parameters, + )[0].tensor + + +def flash_attention( + kv_params: KVCacheParams, + input: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + layer_idx: TensorValue, + attention_mask: TensorValue, + valid_lengths: TensorValue, + scale: float, +) -> TensorValue: + """Computes flash attention provided the mo.opaque KV Cache.""" + input_rank_expected = 4 + if input.rank != input_rank_expected: + msg = ( + f"expected input of rank {input_rank_expected} but got {input.rank}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected uint32 layer_idx but got {layer_idx.dtype}" + raise ValueError(msg) + + if attention_mask.dtype != input.dtype: + msg = ( + f"expected attention mask dtype {attention_mask.dtype} to match " + f"the input's dtype {input.dtype}" + ) + raise ValueError(msg) + + if valid_lengths.dtype != DType.uint32: + msg = f"expected uint32 valid_lengths but got {valid_lengths.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy != KVCacheStrategy.CONTINUOUS: + msg = f"unsupported cache strategy for flash_attention: {kv_params.cache_strategy}" + raise ValueError(msg) + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.mha.padded.{cache_strategy_str}.tensor_mask.no_pos" + + return ops.inplace_custom( + op_name, + values=[ + input, + kv_collection, + layer_idx, + attention_mask, + valid_lengths, + # NOTE: The scale argument to the flash attention kernel is + # constrained to float32. + ops.constant(scale, dtype=DType.float32), + ], + out_types=[ + TensorType( + dtype=input.dtype, shape=input.shape, device=input.device + ) + ], + parameters={ + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + }, + )[0].tensor + + +def flash_attention_with_causal_mask( + kv_params: KVCacheParams, + input: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection, + layer_idx: TensorValue, + valid_lengths: TensorValue, + scale: float, +) -> TensorValue: + """Computes flash attention provided the mo.opaque KV Cache. + Notably, materializes the causal mask within the kernel.""" + + if input.shape[0] != valid_lengths.shape[0]: + msg = ( + "expected batch size of input, to equal length of valid_lengths" + f" got batch size of input ({input.shape[0]}), length of" + f" valid_lengths ({valid_lengths.shape[0]})" + ) + raise ValueError(msg) + + if input.dtype != kv_params.dtype: + msg = ( + f"expected input to be dtype: {kv_params.dtype}, got {input.dtype}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected uint32 layer_idx but got {layer_idx.dtype}" + raise ValueError(msg) + + if valid_lengths.dtype != DType.uint32: + msg = f"expected uint32 valid_lengths but got {valid_lengths.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy != KVCacheStrategy.CONTINUOUS: + msg = f"unsupported cache strategy for flash_attention_with_causal_mask: {kv_params.cache_strategy}" + raise ValueError(msg) + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.mha.padded.{cache_strategy_str}.causal_mask.no_pos" + + return ops.inplace_custom( + op_name, + values=[ + input, + kv_collection, + layer_idx, + valid_lengths, + # NOTE: The scale argument to flash attention is constrained to float32. + ops.constant(scale, dtype=DType.float32), + ], + out_types=[ + TensorType( + dtype=input.dtype, shape=input.shape, device=input.device + ) + ], + parameters={ + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + }, + )[0].tensor + + +@dataclass +class MHAMaskConfig: + attention_mask_variant: AttentionMaskVariant + positional_encoding_variant: PositionalEncodingVariant + + +class AttentionMaskVariant(str, Enum): + NULL_MASK = "null_mask" + CAUSAL_MASK = "causal_mask" + TENSOR_MASK = "tensor_mask" + + +class PositionalEncodingVariant(str, Enum): + NO_POS = "no_pos" + ALIBI_POS = "alibi_pos" + + +class MHAMaskVariant(str, Enum): + CAUSAL_MASK = 0 + CAUSAL_ALIBI_MASK = 1 + NULL_MASK = 2 + + +_MHA_MASK_CONFIG_DICT = { + MHAMaskVariant.CAUSAL_MASK: MHAMaskConfig( + attention_mask_variant=AttentionMaskVariant.CAUSAL_MASK, + positional_encoding_variant=PositionalEncodingVariant.NO_POS, + ), + MHAMaskVariant.CAUSAL_ALIBI_MASK: MHAMaskConfig( + attention_mask_variant=AttentionMaskVariant.CAUSAL_MASK, + positional_encoding_variant=PositionalEncodingVariant.ALIBI_POS, + ), + MHAMaskVariant.NULL_MASK: MHAMaskConfig( + attention_mask_variant=AttentionMaskVariant.NULL_MASK, + positional_encoding_variant=PositionalEncodingVariant.NO_POS, + ), +} + + +def flash_attention_ragged( + kv_params: KVCacheParams, + input: TensorValue, + input_row_offsets: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection | PagedKVCacheCollection, + layer_idx: TensorValue, + mask_variant: MHAMaskVariant, + scale: float, +) -> TensorValue: + """Computes flash (self) attention provided the `!mo.opaque` KV Cache. + + Notably, this materializes the attention mask (dependent on MHAMaskVariant) + within the kernel. + `input` and `input_row_offsets` are used together to implement the ragged + tensor. + `input_row_offsets` indicates where each batch starts and ends in `input` + + Note that this is self attention and the KV sequence length is + assumed to be equal to the Q sequence length. + For KV sequence length != Q sequence length, use `cross_attention_ragged`. + """ + input_rank_expected = 3 + if input.rank != input_rank_expected: + msg = ( + f"expected input of rank {input_rank_expected} but got {input.rank}" + ) + raise ValueError(msg) + + if input.dtype != kv_params.dtype: + msg = ( + f"expected input to be dtype: {kv_params.dtype}, got {input.dtype}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected uint32 layer_idx but got {layer_idx.dtype}" + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = f"expected uint32 input_row_offsets but got {input_row_offsets.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy not in { + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.PAGED, + }: + msg = f"unsupported cache strategy for flash_attention_ragged: {kv_params.cache_strategy}" + raise ValueError(msg) + + parameters: dict[str, int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + } + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = kv_params.page_size + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + mha_mask_config = _MHA_MASK_CONFIG_DICT[mask_variant] + op_name = f"mo.mha.ragged.{cache_strategy_str}.{str(mha_mask_config.attention_mask_variant.value)}.{str(mha_mask_config.positional_encoding_variant.value)}" + + return ops.inplace_custom( + op_name, + values=[ + input, + input_row_offsets, + kv_collection, + layer_idx, + # NOTE: The scale argument to flash attention is constrained to float32. + ops.constant(scale, dtype=DType.float32), + ], + out_types=[ + TensorType( + dtype=input.dtype, shape=input.shape, device=input.device + ) + ], + parameters=parameters, + )[0].tensor + + +def cross_attention_ragged( + kv_params: KVCacheParams, + input: TensorValue, + input_row_offsets: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection | PagedKVCacheCollection, + layer_idx: TensorValue, + mask_variant: MHAMaskVariant, + kv_input_row_offsets: TensorValue, + q_max_seq_len: TensorValue, + scale: float, +) -> TensorValue: + """Computes cross attention provided the `!mo.opaque` KV Cache. + + Notably, this materializes the attention mask (dependent on MHAMaskVariant) + within the kernel. + `input` and `input_row_offsets` are used together to implement the ragged + tensor. + `input_row_offsets` indicates where each batch starts and ends in `input` + + attention, `kv_input_row_offsets` represents the KV sequence length. + """ + input_rank_expected = 3 + if input.rank != input_rank_expected: + msg = ( + f"expected input of rank {input_rank_expected} but got {input.rank}" + ) + raise ValueError(msg) + + if input.dtype != kv_params.dtype: + msg = ( + f"expected input to be dtype: {kv_params.dtype}, got {input.dtype}" + ) + raise ValueError(msg) + + if layer_idx.dtype != DType.uint32: + msg = f"expected uint32 layer_idx but got {layer_idx.dtype}" + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = f"expected uint32 input_row_offsets but got {input_row_offsets.dtype}" + raise ValueError(msg) + + if kv_params.cache_strategy not in { + KVCacheStrategy.CONTINUOUS, + KVCacheStrategy.PAGED, + }: + msg = f"unsupported cache strategy for cross_attention_ragged: {kv_params.cache_strategy}" + raise ValueError(msg) + + if q_max_seq_len and (q_max_seq_len.dtype != DType.uint32): + msg = ( + "expected q_max_seq_len to be uint32 but got {q_max_seq_len.dtype}" + ) + raise ValueError(msg) + + parameters: dict[str, int | str | DType] = { + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + } + if kv_params.cache_strategy == KVCacheStrategy.PAGED: + assert kv_params.page_size is not None + parameters["page_size"] = kv_params.page_size + + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + mha_mask_config = _MHA_MASK_CONFIG_DICT[mask_variant] + op_name = f"mo.cross_attention.ragged.{cache_strategy_str}.{str(mha_mask_config.attention_mask_variant.value)}.{str(mha_mask_config.positional_encoding_variant.value)}" + + return ops.inplace_custom( + op_name, + values=[ + input, + input_row_offsets, + # Plumb in the query max sequence length for cross attention. + # For self attention this is the same as the KV max seq len stored + # on the kv_collection, but that isn't the case for cross attention. + q_max_seq_len, + kv_input_row_offsets, + kv_collection, + layer_idx, + # NOTE: The scale argument to flash attention is constrained to float32. + ops.constant(scale, dtype=DType.float32), + ], + out_types=[ + TensorType( + dtype=input.dtype, shape=input.shape, device=input.device + ) + ], + parameters=parameters, + )[0].tensor + + +def swish_glu( + a: TensorValueLike, b0: TensorValueLike, b1: TensorValueLike +) -> TensorValue: + """Computes swish(a@b0.t()) * (a@b1.t())""" + a = TensorValue(a) + b0 = TensorValue(b0) + b1 = TensorValue(b1) + a_rank_expected = 2 + if a.rank != a_rank_expected: + msg = f"expected a to have rank {a_rank_expected}, was {a.rank}" + raise ValueError(msg) + + b0_rank_expected = 2 + if b0.rank != b0_rank_expected: + msg = f"expected b0 to have rank {b0_rank_expected}, was {b0.rank}" + raise ValueError(msg) + + b1_rank_expected = 2 + if b1.rank != b1_rank_expected: + msg = f"expected b1 to have rank {b1_rank_expected}, was {b1.rank}" + raise ValueError(msg) + + m = a.shape[0] + n = b0.shape[0] + if b0.shape[1] != a.shape[1]: + msg = f"a.shape[1] == {a.shape[1]} != {b0.shape[1]} == b0.shape[1]" + raise ValueError(msg) + + if b0.shape != b1.shape: + msg = f"b0.shape == {b0.shape} != {b1.shape} == b1.shape" + raise ValueError(msg) + + if a.dtype != b0.dtype or a.dtype != b1.dtype: + msg = ( + "Element types of all arguments must be equal, but received" + f" {a.dtype}, {b0.dtype}, and {b1.dtype}." + ) + raise ValueError(msg) + + return ops.custom( + "swishGLU", + values=[a, b0, b1], + out_types=[ + TensorType( + dtype=a.dtype, + shape=[m, n], + device=a.device, + ) + ], + )[0].tensor + + +def rms_norm_key_cache( + kv_params: KVCacheParams, + kv_collection: ContinuousBatchingKVCacheCollection, + gamma: TensorValue, + epsilon: float | np.floating, + layer_idx: int | np.integer, + total_seq_len: Dim, + input_row_offsets: TensorValue, +) -> None: + """Computes RMSNorm on the _new_ entries in the KVCache. + + Currently, the KVCacheT class itself isn't aware of the new cache entries + until cache length increment, which happens after model forward. + So use `input_row_offsets` to do this bookkeeping. + """ + cache_strategy_str = kv_params.cache_strategy.kernel_substring() + op_name = f"mo.rms_norm_kv_cache.ragged.{cache_strategy_str}" + + gamma_rank_expected = 1 + if gamma.rank != gamma_rank_expected: + msg = ( + f"expected gamma of rank {gamma_rank_expected} but got {gamma.rank}" + ) + raise ValueError(msg) + + if input_row_offsets.dtype != DType.uint32: + msg = f"expected uint32 input_row_offsets but got {input_row_offsets.dtype}" + raise ValueError(msg) + + ops.inplace_custom( + op_name, + values=[ + kv_collection, + gamma, + ops.constant(epsilon, gamma.dtype), + ops.constant(layer_idx, DType.uint32), + ops.cast(TensorValue.from_dim(total_seq_len), DType.uint32), + input_row_offsets, + ], + parameters={ + "num_heads": kv_params.n_kv_heads_per_device, + "head_dim": kv_params.head_dim, + }, + ) diff --git a/src/max/pipelines/nn/layer/__init__.py b/src/max/pipelines/nn/layer/__init__.py new file mode 100644 index 0000000000..d3a8fc44a9 --- /dev/null +++ b/src/max/pipelines/nn/layer/__init__.py @@ -0,0 +1,30 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .layer import ( + Layer, + LayerV2, + add_layer_hook, + clear_hooks, + recursive_named_layers, +) +from .layer_list import LayerList + +__all__ = [ + "Layer", + "LayerV2", + "add_layer_hook", + "clear_hooks", + "recursive_named_layers", + "LayerList", +] diff --git a/src/max/pipelines/nn/layer/layer.py b/src/max/pipelines/nn/layer/layer.py new file mode 100644 index 0000000000..3b76c479b6 --- /dev/null +++ b/src/max/pipelines/nn/layer/layer.py @@ -0,0 +1,423 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +import difflib +import threading +from abc import ABC, abstractmethod +from collections import deque +from dataclasses import dataclass +from functools import wraps +from inspect import signature +from typing import ( + Any, + Callable, + Dict, + Iterable, + Mapping, + Tuple, + Union, + get_args, +) + +import numpy as np +from max.driver import DLPackArray, Tensor +from max.dtype import DType +from max.graph import DeviceRef, ShapeLike, TensorValue, Weight +from max.graph.quantization import QuantizationEncoding +from max.graph.weights import WeightData + +from .._identity import IdentitySet + +DLPackCompatible = Union[DLPackArray, np.ndarray] + + +@dataclass +class ShardingStrategy: + """Defines how to load and shard a weight onto multiple devices.""" + + host_device: DeviceRef + shard_value: Callable[[Weight], tuple[TensorValue, ...]] + + +class Layer: + """Base Layer class. + + Currently, only functionality is for adding hooks to the call function of + each layer to support testing, debugging or profiling. + """ + + def __init_subclass__(cls): + if cls.__name__ == "LayerV2": + # LayerV2 subclasses Layer, but we don't want to apply + # _call_with_hooks to it. + return + # Check `__dict__` instead of `hasattr` because `hasattr` passes on + # subclasses that don't implement the method. + if "__call__" in cls.__dict__: + setattr(cls, "__call__", _call_with_hooks(cls.__dict__["__call__"])) + + def __call__(self, *args, **kwargs): + """Defines the forward function of this layer. + + Subclasses must override this function. There is no exact signature that a + call function must follow, but inputs/outputs should generally be + `max.graph.TensorValue`. Non-`TensorValue` inputs are fine, but + cannot be updated once the graph is built. + """ + + +class LayerV2(Layer, ABC): + """(new) Base class for model layers with weight and device management. + + This will be merged with the above class once all layers have been moved to + V2. + """ + + def __init__(self): + # `__init__` may be called if `__setattr__` is called before + # `super().__init__()`. So, to avoid resetting the values, first + # check to see if the layer has been initialized before. + if not hasattr(self, "_sublayers"): + self._sublayers: dict[str, LayerV2] = {} + self._layer_weights: dict[str, Weight] = {} + self._weight_values: dict[str, DLPackCompatible] = {} + self._shared_weights: dict[str, Weight] = {} + + # Update device list and sharding strategy to a singular object + # similar to a partition spec. + self._devices: tuple[DeviceRef, ...] = () + self._sharding_strategy: ShardingStrategy | None = None + + def __setattr__(self, name, value): + try: + if isinstance(value, LayerV2): + self._sublayers[name] = value + if self._devices or self._sharding_strategy: + value.to( + *self._devices, + sharding_strategy=self._sharding_strategy, + ) + elif isinstance(value, Weight): + self._layer_weights[value.name] = value + except AttributeError: + # The layer didn't call `super().__init__()` first thing. + LayerV2.__init__(self) + self.__setattr__(name, value) + return + super().__setattr__(name, value) + + def __repr__(self): + # TODO: Make this pretty + return f"{type(self).__name__}({len(self.sublayers)} layers, {len(self.layer_weights)} weights)" + + def to( + self, + *devices: DeviceRef, + sharding_strategy: ShardingStrategy | None = None, + ) -> None: + if len(self._devices) > 1 and not sharding_strategy: + raise ValueError( + "Must provide a sharding strategy if multiple devices are provided." + ) + + for _, layer in recursive_named_layers(self): + layer._devices = devices + layer._sharding_strategy = sharding_strategy + + @property + def layer_weights(self) -> dict[str, Weight]: + return self._layer_weights + + def __delattr__(self, name: str): + self._sublayers.pop(name, None) + self._layer_weights.pop(name, None) + self._shared_weights.pop(name, None) + super().__delattr__(name) + + def set_shared_weight(self, name: str, weight: Weight): + setattr(self, name, weight) + self._shared_weights[name] = weight + + @property + def sublayers(self) -> dict[str, LayerV2]: + return self._sublayers + + def load_state_dict( + self, + state_dict: Mapping[str, DLPackCompatible | WeightData], + *, + override_quantization_encoding: bool = False, + ) -> None: + """Sets the values of all weights in this model. + + Args: + state_dict: A map from weight name to a numpy array or + max.driver.Tensor. + override_quantization_encoding: Whether to override the weight + quantization based on the loaded value. + + Raises: + Error if any weight in the model is not present in the state dict. + """ + for name, layer in recursive_named_layers(self): + weight_prefix = f"{name}." if name else "" + for weight_name, weight in layer.layer_weights.items(): + # Skip the shared weights, since their values are loaded with + # the original layers. + if weight_name in layer._shared_weights: + continue + full_weight_name = f"{weight_prefix}{weight_name}" + if (data := state_dict.get(full_weight_name)) is not None: + if isinstance(data, WeightData): + data = _array_from_weight_loader( + weight, + data, + override_quantization_encoding, + full_weight_name, + ).data + else: + _validate_weight_value(weight, data, full_weight_name) + self._weight_values[full_weight_name] = data + weight.name = full_weight_name + else: + msg = f"Could not find weight '{full_weight_name}'. " + if possible_match := difflib.get_close_matches( + full_weight_name, state_dict.keys(), n=1 + ): + msg += f" Did you mean '{possible_match[0]}'?" + raise ValueError() + + def state_dict( + self, auto_initialize: bool = True + ) -> dict[str, DLPackCompatible]: + """Returns values of all weights in the model. + + The values returned are the same as the values set in `load_state_dict`. + If `load_state_dict` has not been called and none of the weights have + values, then they are initialized to zero. + + Args: + auto_initialize: Determines whether to initialize weights to zero if + the weight value has not been loaded. If this is False, a + ValueError is raised if an uninitialized weight is found. + + Returns: + Map from weight name to the weight value (can be numpy array or + max.driver.Tensor). + """ + + state_dict = {} + for full_weight_name, weight in self.raw_state_dict().items(): + if (data := self._weight_values.get(full_weight_name)) is None: + if not auto_initialize: + raise ValueError( + f"Weight '{full_weight_name}' was not initialized." + ) + data = self._weight_values[full_weight_name] = Tensor.zeros( + weight.shape.static_dims, weight.dtype + ) + state_dict[full_weight_name] = data + return state_dict + + def raw_state_dict(self) -> dict[str, Weight]: + """Returns all weights objects in the model. + Unlike `state_dict`, this returns `max.graph.Weight` objects instead of + the assigned values. Some parameters inside the `Weight` can be + configured before a graph is built. Do not change these attributes after + building a graph: + + - Weight.shape + - Weight.dtype + - Weight.quantization_encoding + - Weight.device + - Weight.align + + Returns: + Map from weight name to the `max.graph.Weight` object. + """ + state_dict = {} + for name, layer in recursive_named_layers(self): + prefix = f"{name}." if name else "" + + for weight_name, weight in layer.layer_weights.items(): + state_dict[f"{prefix}{weight_name}"] = weight + return state_dict + + @abstractmethod + def __call__(self, *args, **kwargs): + """Defines the forward function of this layer. + + Subclasses must override this function. There is no exact signature that a + call function must follow, but inputs/outputs should generally be + `max.graph.TensorValue`. Non-`TensorValue` inputs are fine, but + cannot be updated once the graph is built. + """ + + +def _array_from_weight_loader( + weight: Weight, + data: WeightData, + override_quantization_encoding: bool, + name: str, +) -> WeightData: + """Processes and validates the data from WeightData.""" + + if weight.quantization_encoding == QuantizationEncoding.GPTQ: + # Load all weights with GPTQ quantization as uint8. + # Store the original shape and dtype of the weight (used in layers like + # GPTLinear). + weight.original_dtype_and_shape = (data.dtype, data.shape) + data = data.view(DType.uint8) + else: + data = data.astype(weight.dtype) + + if weight.quantization_encoding: + # TODO: Set the quantized weight shape correctly when initializing the + # weight. For now, we trust that the value loaded from the checkpoint + # has the correct shape. + weight._shape = data.shape + elif weight.shape != data.shape: + raise ValueError( + f"Value provided to weight '{name}' had different shape" + f" (expected={weight.shape}, actual={data.shape})" + ) + + if weight.quantization_encoding != data.quantization_encoding: + if override_quantization_encoding: + weight.quantization_encoding = data.quantization_encoding + # We don't raise an error if `override_quantization_encoding` is `False` + # because in some cases the data is not aware of its own quantization + # type (e.g. data loaded from GPTQ Safetensors do not have a + # quantization label) + return data.astype(weight.dtype) + + +def _get_value_shape_dtype(value: DLPackCompatible) -> tuple[ShapeLike, DType]: + if isinstance(value, Tensor): + shape = value.shape + dtype = value.dtype + elif isinstance(value, np.ndarray): + shape = value.shape + dtype = DType.from_numpy(value.dtype) + else: + # `from_dlpack` does not copy the data. + value_tensor = Tensor.from_dlpack(value) + shape = value_tensor.shape + dtype = value_tensor.dtype + + return shape, dtype + + +def _validate_weight_value(weight: Weight, value: Any, name: str) -> None: + if not isinstance(value, get_args(DLPackCompatible)): + raise ValueError( + f"The class type of '{name}' value ({type(value)}) is not an array " + "type that we understand. Please use a numpy array or max.driver.Tensor." + ) + + shape, dtype = _get_value_shape_dtype(value) + + diffs = [] + weight_shape = tuple(weight.shape.static_dims) + if shape != weight_shape: + diffs.append(f"shape (expected={weight_shape}, actual={shape})") + if dtype != weight.dtype: + diffs.append(f"dtype (expected={weight.dtype}, actual={dtype})") + if diffs: + diff_str = " and ".join(diffs) + raise ValueError( + f"Value provided to weight '{name}' had different {diff_str}." + ) + + +def recursive_named_layers( + parent: LayerV2, prefix: str = "" +) -> Iterable[tuple[str, LayerV2]]: + """Recursively walks through the layers and generates names.""" + seen = IdentitySet() + queue: deque[tuple[str, LayerV2]] = deque() + queue.append((prefix, parent)) + + while queue: + name, layer = queue.popleft() + if layer in seen: + continue + seen.add(layer) + + yield (name, layer) + prefix = f"{name}." if name else "" + for local_name, layer in layer.sublayers.items(): + queue.append((f"{prefix}{local_name}", layer)) + + +_LOCAL = threading.local() +_LAYER_HOOKS = _LOCAL._layer_hooks = [] + + +def add_layer_hook( + fn: Callable[[Layer, Tuple[Any, ...], Dict[str, Any], Any], Any], +) -> None: + """Adds a hook to call a function after each layer's `__call__`. + + The function will be passed four inputs: the layer, input_args, + input_kwargs and outputs. The function can either return `None` or new + outputs that will replace the layer returned outputs. + + Note that input and outputs contain graph Values, which show limited + information (like shape and dtype). You can still see the computed values + if you include the Value in the `graph.output` op, or call `value.print`. + + Example of printing debug inputs: + + .. code-block:: python + + def print_info(layer, args, kwargs, outputs): + print("Layer:", type(layer).__name__) + print("Input args:", args) + print("Input kwargs:", kwargs) + print("Outputs:", outputs) + return outputs + + add_layer_hook(print_info) + """ + _LAYER_HOOKS.append(fn) + + +def clear_hooks(): + """Remove all hooks.""" + _LAYER_HOOKS.clear() + + +def _call_with_hooks(call_fn): + @wraps(call_fn) + def __call_with_hooks(layer, *args, **kwargs): + # Hide this wrapper from rich traceback. + _rich_traceback_omit = True + + outputs = call_fn(layer, *args, **kwargs) + # Use the inspect lib to ensure that args and kwargs are passed + # to the hook as defined in the function signature. + bound_args = signature(call_fn).bind(layer, *args, **kwargs) + for hook in _LAYER_HOOKS: + # Call the hook. Note that the first argument in `bound_args.args` + # is the layer, so it is skipped. + hook_outputs = hook( + layer, bound_args.args[1:], bound_args.kwargs, outputs + ) + if hook_outputs is not None: + outputs = hook_outputs + return outputs + + return __call_with_hooks diff --git a/src/max/pipelines/nn/layer/layer_list.py b/src/max/pipelines/nn/layer/layer_list.py new file mode 100644 index 0000000000..1f0aad4d82 --- /dev/null +++ b/src/max/pipelines/nn/layer/layer_list.py @@ -0,0 +1,77 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from typing import Sequence + +from max.graph import TensorValue + +from .layer import Layer, LayerV2 + + +class LayerList(LayerV2): + """Stores a list of layers. + + Can be used as a regular python list.""" + + def __init__(self, layers: Sequence[Layer]): + super().__init__() + self.layers = list(layers) + + # Only assign `LayerV2` objects to Sequential.sublayers. We ensure that + # the V2 functionality (getting sublayers) is correct by throwing + # an error in the `sublayers` property if any layer is still V1. + for n, layer in enumerate(layers): + if isinstance(layer, LayerV2): + self._sublayers[str(n)] = layer + + @property + def sublayers(self) -> dict[str, LayerV2]: + if len(self._sublayers) != len(self.layers): + raise ValueError( + "Not all layers in this Sequential object have " + "been migrated to V2." + ) + return super().sublayers + + def __len__(self): + return len(self.layers) + + def __getitem__(self, i: int) -> Layer: + return self.layers[i] + + def __delitem__(self, i: int): + del self.layers[i] + + def __setitem__(self, i: int, layer: Layer): + self.layers[i] = layer + + def insert(self, i, layer: Layer): + self.layers.insert(i, layer) + + def append(self, layer: Layer): + self.layers.append(layer) + + def extend(self, layer: Layer): + self.layers.append(layer) + + def __str__(self): + return str(self.layers) + + def __iter__(self): + return iter(self.layers) + + def __call__(self, *args, **kwargs) -> TensorValue: + x = self.layers[0](*args, **kwargs) + for layer in self.layers[1:]: + x = layer(x) + return x diff --git a/src/max/pipelines/nn/linear.py b/src/max/pipelines/nn/linear.py new file mode 100644 index 0000000000..dd6a625af0 --- /dev/null +++ b/src/max/pipelines/nn/linear.py @@ -0,0 +1,555 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Multi-layer Perceptron.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +import numpy as np +from max.dtype import DType +from max.graph import ( + BufferValue, + DeviceRef, + TensorValue, + TensorValueLike, + Weight, + ops, +) +from max.graph.quantization import QuantizationConfig, QuantizationEncoding +from max.graph.weights import Weights + +from .kernels import swish_glu +from .layer import Layer, LayerV2 + + +class LinearV2(LayerV2): + """ + Applies a linear transformation to incoming data: :math:`y = xW^T + b`. + + This layer implements a fully connected layer where inputs are multiplied + by a weight matrix and optionally added with a bias vector. + Both weights and bias initially reside on CPU, and the model init phase + moves them to :obj:`device`. + + Example: + + .. code-block:: python + + linear_layer = LinearV2( + in_dim=256, + out_dim=128, + dtype=DType.float32, + device=DeviceRef.GPU(), + name="linear", + has_bias=True + ) + + # Input tensor of shape: [batch, ..., 256] + input_tensor: TensorValue + output = linear_layer(input_tensor) + """ + + weight: Weight | TensorValue + """The weight matrix stored on CPU with shape (out_dim, in_dim). + Model init transposes the weight and moves it to :obj:`device`.""" + + bias: Weight | None = None + """The optional bias vector stored on CPU with shape (out_dim,). + Model init moves the bias to :obj:`device` if present.""" + + device: DeviceRef | None + """The device where matrix operations are performed.""" + + def __init__( + self, + in_dim: int, + out_dim: int, + dtype: DType, + device: DeviceRef | None = None, + has_bias: bool = False, + quantization_encoding: Optional[QuantizationEncoding] = None, + name: Optional[str] = None, + ) -> None: + """Initializes the linear layer with weights and optional bias. + + Args: + in_dim: The dimensionality of the input space. + out_dim: The dimensionality of the output space. + dtype: The data type for both weights and bias. + device: The target device for computation. + Weights remain on CPU until moved during computation. + name: Base name for weights (appended with ``.weight`` and + ``.bias`` if applicable). + has_bias: When :obj:`True`, adds a bias vector to the layer. + Defaults to :obj:`False`. + """ + super().__init__() + + self.device = device + + self.weight = Weight( + name=f"{name}.weight" if name else "weight", + dtype=dtype, + shape=(out_dim, in_dim), + device=DeviceRef.CPU() if self.device else None, + quantization_encoding=quantization_encoding, + ) + self.quantization_encoding = quantization_encoding + + if has_bias: + self.bias = Weight( + name=f"{name}.bias" if name else "bias", + dtype=dtype, + shape=(out_dim,), + device=DeviceRef.CPU() if self.device else None, + quantization_encoding=quantization_encoding, + ) + + def __call__(self, x: TensorValue) -> TensorValue: + """Applies a linear transformation to the input data. + + Args: + x: Input tensor of shape ``(..., in_dim)``. + The last dimension must match the layer's ``in_dim``. + The input tensor must reside on :obj:`device`. + + Returns: + Output tensor of shape ``(..., out_dim)``. + The result resides on the device specified in :obj:`device`. + + Raises: + ValueError: If the last dimension of ``x`` doesn't match ``in_dim``. + """ + weight: TensorValue = self.weight + if self.device: + weight = weight.to(self.device) + + if self.quantization_encoding: + res = ops.qmatmul( + self.quantization_encoding, + None, + x, + weight, + ) + else: + res = x @ weight.T + if self.bias is not None: + bias = self.bias.to(self.device) if self.device else self.bias + res += bias + return res + + +def _allocate_if_needed(value: Weights | Weight, dtype, shape) -> Weight: + if isinstance(value, Weight): + return value + else: + return value.weight.allocate(dtype, shape) + + +@dataclass +class Linear(Layer): + """A unified linear layer that delegates to either regular or quantized implementation.""" + + weight: TensorValueLike + bias: Optional[TensorValueLike] = None + + def __call__(self, x: TensorValue) -> TensorValue: + weight = TensorValue(self.weight) + res = x @ weight.T + if self.bias is not None: + res += self.bias + return res + + @classmethod + def create( + cls, + dtype: DType, + quantization_encoding: Optional[QuantizationEncoding], + in_features: int, + out_features: int, + weights: Weights | Weight, + bias: Optional[Weights | Weight] = None, + quantization_config: Optional[QuantizationConfig] = None, + ) -> "Linear": + """Factory method to create a Linear layer with appropriate implementation.""" + if not quantization_encoding: + weight = _allocate_if_needed( + weights, dtype, [in_features, out_features] + ) + bias_weight = ( + _allocate_if_needed(bias, dtype, [out_features]) + if bias + else None + ) + return Linear(weight=weight, bias=bias_weight) + else: + return QLinear._create( + dtype, + quantization_encoding, + in_features, + out_features, + weights, + bias, + quantization_config, + ) + + +@dataclass +class QLinear(Linear): + """A quantized fully connected layer.""" + + # Because Linear.bias is optional and Linear is a dataclass and we inherit from Linear, all our fields must be optional even if it doesn't make logical sense + quantization_encoding: QuantizationEncoding | None = None + + @classmethod + def _create( + cls, + dtype: DType, + quantization_encoding: QuantizationEncoding, + in_features: int, + out_features: int, + weights: Weights | Weight, + bias: Optional[Weights | Weight], + quantization_config: Optional[QuantizationConfig], + ) -> "Linear": + if quantization_encoding != QuantizationEncoding.GPTQ: + weight = _allocate_if_needed( + weights, dtype, [in_features, out_features] + ) + bias_weight = ( + _allocate_if_needed(bias, dtype, [out_features]) + if bias + else None + ) + return QLinear( + weight=weight, + bias=bias_weight, + # GGUF weights can have different quantization per weight + quantization_encoding=weight.quantization_encoding, + ) + else: + return GPTQLinear._create( + dtype, + quantization_encoding, + in_features, + out_features, + weights, + bias, + quantization_config, + ) + + def __call__(self, x: TensorValue) -> TensorValue: + assert self.quantization_encoding is not None + weight = TensorValue(self.weight) + res = ops.qmatmul( + self.quantization_encoding, + None, + x, + weight, + ) + if self.bias is not None: + res += TensorValue(self.bias) + return res + + +@dataclass +class GPTQLinear(QLinear): + "A Linear layer for GPTQ encoding" + + # Because QLinear has optional fields, so must we, since we subclass QLinear + quantization_config: QuantizationConfig | None = None + perm_idx: Optional[TensorValueLike] | None = None + + @classmethod + def _create( + cls, + dtype: DType, + quantization_encoding: QuantizationEncoding, + in_features: int, + out_features: int, + weights: Weights | Weight, + bias: Optional[Weights | Weight], + quantization_config: Optional[QuantizationConfig], + ) -> "Linear": + """Internal method to create a Linear layer from GPTQ weights.""" + + assert quantization_config, ( + "QuantizationConfig must be provided for GPTQLinear" + ) + + assert quantization_config.sym, "GPTQ with sym=False is not supported." + + desc_act = quantization_config.desc_act + + perm_idx = None + + if isinstance(weights, Weights) and weights.qweight.exists(): + orig_quantized_weights = [weights.qweight, weights.scales] + quantized_weights = [] + for idx, qw in enumerate(orig_quantized_weights): + orig = qw.allocate() + # TODO(AITLIB-135): allocate_as_bytes is only available for + # safetensors. This isn't a problem right now because gptq is + # only present for safetensors + weight_bytes = qw.allocate_as_bytes() # type: ignore + assert len(orig.shape) == 2 + reshaped = ops.reshape( + weight_bytes, + (orig.shape[0] * orig.dtype.size_in_bytes, orig.shape[1]), + ).transpose(0, 1) + quantized_weights.append(reshaped) + + weight = ops.concat( + (quantized_weights[0], quantized_weights[1]), axis=1 + ).transpose(0, 1) + + if desc_act: + perm_idx = weights.g_idx.allocate( + DType.int32, + [out_features], + ) + # hack: argsort the perm_idx array + weights._allocated[perm_idx.name] = np.argsort( # type: ignore + weights._allocated[perm_idx.name] # type: ignore + ).astype(np.int32) + + return GPTQLinear( + weight=weight, + bias=None, + quantization_encoding=quantization_encoding, + quantization_config=quantization_config, + perm_idx=perm_idx, + ) + + else: + weight = _allocate_if_needed( + weights, DType.bfloat16, [in_features, out_features] + ) + bias_weight = ( + _allocate_if_needed(bias, dtype, [out_features]) + if bias + else None + ) + return Linear(weight, bias_weight) + + def __call__(self, x: TensorValue) -> TensorValue: + assert self.quantization_encoding is not None + weight = TensorValue(self.weight) + if self.perm_idx is not None: + perm_idx = TensorValue(self.perm_idx) + res = ops.qmatmul( + self.quantization_encoding, + self.quantization_config, + ops.gather(x, perm_idx, axis=(x.rank - 1)), + weight, + perm_idx, + ) + else: + res = ops.qmatmul( + self.quantization_encoding, + self.quantization_config, + x, + weight, + ) + if self.bias is not None: + res += TensorValue(self.bias) + return res + + +@dataclass +class GPTQLinearV2(LinearV2): + "A Linear layer for GPTQ encoding" + + def __init__( + self, + in_dim: int, + out_dim: int, + dtype: DType, + device: DeviceRef | None = None, + has_bias: bool = False, + quantization_encoding: Optional[QuantizationEncoding] = None, + quantization_config: Optional[QuantizationConfig] = None, + ) -> None: + """Initializes the linear layer with weights and optional bias with + GPTQ quantization. + + Args: + in_dim: The dimensionality of the input space. + out_dim: The dimensionality of the output space. + dtype: The data type for both weights and bias. + device: The target device for computation. + Weights remain on CPU until moved during computation. + has_bias: When :obj:`True`, adds a bias vector to the layer. + Defaults to :obj:`False`. + quantization_encoding: The quantization encoding of the weights. + quantization_config: Extra config for the weight quantization. + """ + del out_dim, dtype # Unused. + if has_bias: + raise ValueError("has_bias=True is not supported in GPTQLinear.") + + # Skip LinearV2 initialization. + LayerV2.__init__(self) + self.device = device + self.qweight = Weight( + name="qweight", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + device=DeviceRef.CPU() if device else None, + quantization_encoding=quantization_encoding, + ) + self.scales = Weight( + name="scales", + dtype=DType.uint8, + shape=(1, 1), # Shape will be overridden at load_state_dict. + device=DeviceRef.CPU() if device else None, + quantization_encoding=quantization_encoding, + ) + + assert quantization_config, ( + "QuantizationConfig must be provided for GPTQLinear" + ) + assert quantization_config.sym, "GPTQ with sym=False is not supported." + + self.quantization_config = quantization_config + + desc_act = self.quantization_config.desc_act + self.perm_idx = None + if desc_act: + self.perm_idx = Weight( + "perm_idx", + DType.int32, + [in_dim], + device=DeviceRef.CPU() if device else None, + ) + + def __call__(self, x: TensorValue) -> TensorValue: + assert self.qweight.quantization_encoding is not None + qweight_dtype, qweight_shape = self.qweight.original_dtype_and_shape + qweight = ops.reshape( + self.qweight, + (qweight_shape[0] * qweight_dtype.size_in_bytes, qweight_shape[1]), + ).transpose(0, 1) + + scales_dtype, scales_shape = self.scales.original_dtype_and_shape + scales = ops.reshape( + self.scales, + (scales_shape[0] * scales_dtype.size_in_bytes, scales_shape[1]), + ).transpose(0, 1) + weight = ops.concat((qweight, scales), axis=1).transpose(0, 1) + if self.device: + weight = weight.to(self.device) + if self.perm_idx is not None: + perm_idx: TensorValue = self.perm_idx + if self.device: + perm_idx = perm_idx.to(self.device) + + res = ops.qmatmul( + self.qweight.quantization_encoding, + self.quantization_config, + ops.gather(x, self.perm_idx, axis=(x.rank - 1)), + weight, + self.perm_idx, + ) + else: + res = ops.qmatmul( + self.qweight.quantization_encoding, + None, + x, + weight, + ) + if self.bias is not None: + res += TensorValue(self.bias) + return res + + +@dataclass +class MLP(Layer): + """ + Simple multi-layer perceptron composed of three linear layers. + Uses SiLU activation function. + """ + + gate_proj: Linear + down_proj: Linear + up_proj: Linear + + def __call__(self, x: TensorValueLike) -> TensorValue: + if ( + self.gate_proj.bias is None + and self.up_proj.bias is None + and TensorValue(x).rank == 2 + and TensorValue(x).device is not None + and TensorValue(x).device != DeviceRef.CPU() + and False # GEX-1476: This causes elaboration errors - disable swish_glu pathway. + ): + return self.down_proj( + swish_glu( + x, + self.gate_proj.weight, + self.up_proj.weight, + ) + ) + + return self.down_proj(ops.silu(self.gate_proj(x)) * self.up_proj(x)) # type: ignore + + +@dataclass +class MLPV2(LayerV2): + """ + Simple multi-layer perceptron composed of three linear layers. + Uses SiLU activation function. + """ + + gate_proj: LinearV2 + down_proj: LinearV2 + up_proj: LinearV2 + + def __post_init__(self): + super().__init__() + + def __call__(self, x: TensorValueLike) -> TensorValue: + if ( + self.gate_proj.bias is None + and self.up_proj.bias is None + and TensorValue(x).rank == 2 + and TensorValue(x).device is not None + and TensorValue(x).device != DeviceRef.CPU() + and False # GEX-1476: This causes elaboration errors - disable swish_glu pathway. + ): + return self.down_proj( + swish_glu( + x, + self.gate_proj.weight, + self.up_proj.weight, + ) + ) + + return self.down_proj( + ops.silu(self.gate_proj(x)) * self.up_proj(x) # type: ignore + ) + + +@dataclass +class DistributedMLP(Layer): + list_of_mlps: list[MLP] + num_devices: int + + def __call__( + self, x: list[TensorValue], signal_buffers: list[BufferValue] + ) -> list[TensorValue]: + mlp_outs = [self.list_of_mlps[i](x[i]) for i in range(self.num_devices)] + return ops.allreduce.sum(mlp_outs, signal_buffers) diff --git a/src/max/pipelines/nn/norm/__init__.py b/src/max/pipelines/nn/norm/__init__.py new file mode 100644 index 0000000000..6c5ff6c0b1 --- /dev/null +++ b/src/max/pipelines/nn/norm/__init__.py @@ -0,0 +1,23 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .layer_norm import LayerNorm, LayerNormV2 +from .rms_norm import DistributedRMSNorm, RMSNorm, RMSNormV2 + +__all__ = [ + "LayerNorm", + "LayerNormV2", + "RMSNorm", + "RMSNormV2", + "DistributedRMSNorm", +] diff --git a/src/max/pipelines/nn/norm/layer_norm.py b/src/max/pipelines/nn/norm/layer_norm.py new file mode 100644 index 0000000000..9619d19ced --- /dev/null +++ b/src/max/pipelines/nn/norm/layer_norm.py @@ -0,0 +1,75 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Layer Normalization layer.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import TensorValue, Weight, ops + +from ..layer import Layer, LayerV2 + + +@dataclass +class LayerNorm(Layer): + """Layer normalization block.""" + + weight: Weight + bias: Weight | None = None + eps: float = 1e-6 + + def __call__(self, input: TensorValue): + # TODO: AIPIPE-95 Replace with a broadcasting rmo.layer_norm + bias = ( + ops.cast(self.bias, input.dtype) + if self.bias + # If bias wasn't passed then use bias-less layer norm (beta = 0). + else ops.broadcast_to( + ops.constant(0.0, input.dtype), shape=(input.shape[-1],) + ) + ) + return ops.layer_norm( + input, + gamma=ops.cast(self.weight, input.dtype), + beta=bias, + epsilon=self.eps, + ) + + +class LayerNormV2(LayerV2): + """Layer normalization block.""" + + def __init__(self, dims: int, eps: float = 1e-5, use_bias=True): + self.weight = Weight("weight", DType.float32, (dims,)) + self.bias = Weight("bias", DType.float32, (dims,)) if use_bias else None + self.eps = eps + + def __call__(self, input: TensorValue): + # TODO: AIPIPE-95 Replace with a broadcasting rmo.layer_norm + bias = ( + ops.cast(self.bias, input.dtype) + if self.bias + # If bias wasn't passed then use bias-less layer norm (beta = 0). + else ops.broadcast_to( + ops.constant(0.0, input.dtype), shape=(input.shape[-1],) + ) + ) + return ops.layer_norm( + input, + gamma=ops.cast(self.weight, input.dtype), + beta=bias, + epsilon=self.eps, + ) diff --git a/src/max/pipelines/nn/norm/rms_norm.py b/src/max/pipelines/nn/norm/rms_norm.py new file mode 100644 index 0000000000..f6e4b455c3 --- /dev/null +++ b/src/max/pipelines/nn/norm/rms_norm.py @@ -0,0 +1,64 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Normalization layer.""" + +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import ( + DeviceRef, + TensorType, + TensorValue, + TensorValueLike, + Weight, + ops, +) + +from ..layer import Layer, LayerV2 + + +@dataclass +class RMSNorm(Layer): + weight: TensorValueLike + eps: float = 1e-6 + + def __call__(self, x: TensorValue) -> TensorValue: + return ops.custom( + "rms_norm", + [x, ops.cast(self.weight, x.dtype), ops.cast(self.eps, x.dtype)], + [TensorType(dtype=x.dtype, shape=x.shape, device=x.device)], + )[0].tensor + + +@dataclass +class DistributedRMSNorm(Layer): + rms_norms: list[RMSNorm] + devices: list[DeviceRef] + + def __call__(self, xs: list[TensorValue]) -> list[TensorValue]: + return [self.rms_norms[i](xs[i]) for i in range(len(self.devices))] + + +class RMSNormV2(LayerV2): + def __init__(self, dim: int, eps: float = 1e-6): + super().__init__() + self.weight = Weight("weight", DType.float32, [dim]) + self.eps = eps + + def __call__(self, x: TensorValue) -> TensorValue: + return ops.custom( + "rms_norm", + [x, ops.cast(self.weight, x.dtype), ops.cast(self.eps, x.dtype)], + [TensorType(dtype=x.dtype, shape=x.shape, device=x.device)], + )[0].tensor diff --git a/src/max/pipelines/nn/rotary_embedding.py b/src/max/pipelines/nn/rotary_embedding.py new file mode 100644 index 0000000000..ae622d8dad --- /dev/null +++ b/src/max/pipelines/nn/rotary_embedding.py @@ -0,0 +1,156 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""The rope embedding used within the model.""" + +from dataclasses import dataclass +from functools import cached_property +from typing import Optional + +import numpy as np +from max.dtype import DType +from max.graph import Dim, DimLike, TensorValue, TensorValueLike, ops + +from .layer import LayerV2 + + +@dataclass +class RotaryEmbedding(LayerV2): + """ + RotaryEmbedding layer to calculate and apply the frequency tensor for complex exponentials. + """ + + dim: DimLike + n_heads: int + theta: float + """Hyperparameter used to control the frequency scaling of the sinusoidal components of the embeddings.""" + max_seq_len: int + """The maximum sequence length for model's input.""" + rope_scaling: Optional[np.ndarray] = None + """Scaling factor for the positional frequencies.""" + _freqs_cis: Optional[TensorValueLike] = None + interleaved: bool = True + + def __post_init__(self): + super().__init__() + + def freqs_cis_base(self) -> TensorValue: + """ + Computes the frequency tensor for complex exponentials (cis) + for a given seq_len. Tensor is scaled with theta parameter. + Required to apply Rotary Position Embedding (RoPE) to tensor. + See 'Roformer: Enhanced Transformer with Rotary Embedding' + (arxiv.org/pdf/2104.09864). + + Returns: + The frequency tensor for complex exponentials with shape + (max_seq_len * 2, dim//(2 * n_heads), 2) + """ + if self._freqs_cis is None: + n = self.dim // self.n_heads # type: ignore + # Note: using float64 to avoid an overflow on the exponential, then converting back to float32. + iota = ops.range( + ops.constant(0, DType.float64), + ops.constant(n - 1, DType.float64), # type: ignore + ops.constant(2, DType.float64), + out_dim=n // 2, + ) + if self.rope_scaling is not None: + iota = iota * self.rope_scaling + freqs = ops.cast(1.0 / (self.theta ** (iota / n)), DType.float32) + t = ops.range( + ops.constant(0, DType.float32), + ops.constant(self.max_seq_len * 2.0, DType.float32), + ops.constant(1, DType.float32), + out_dim=self.max_seq_len * 2, + ) + freqs = ops.outer(t, freqs) + self._freqs_cis = ops.stack( + [ops.cos(freqs), ops.sin(freqs)], axis=-1 + ) + return TensorValue(self._freqs_cis) + + @cached_property + def freqs_cis(self) -> TensorValue: + self._freqs_cis = self.freqs_cis_base() + return self._freqs_cis + + def __call__( + self, x: TensorValueLike, start_pos: TensorValue, seq_len: Dim + ) -> TensorValue: + """Applies rotary positional embeddings (RoPE) to `x`. + + Args: + x: Activation tensor with shape (batch, seq_len, n_kv_heads, head_dim). + start_pos: starting position of input tensor + seq_len: length of input tensor + + Returns: + Input activation tensor with rotary positional embeddings applied and + the same shape as `x`. + """ + v = TensorValue(x) + + if self.interleaved: + complex = ops.as_interleaved_complex(v) + x_re = complex[..., 0] + x_im = complex[..., 1] + else: + head_dim = v.shape[-1] + head_dim_val = TensorValue(head_dim) + half_dim = head_dim // 2 + half_dim_val = TensorValue(half_dim) + slice_re = (slice(0, half_dim_val), half_dim) + slice_im = (slice(half_dim_val, head_dim_val), half_dim) + x_re = v[..., slice_re] + x_im = v[..., slice_im] + + seq_len_val = TensorValue(seq_len) + freqs_cis_sliced = self.freqs_cis[ + (slice(start_pos, start_pos + seq_len_val), seq_len), + ] + # TODO(MSDK-1188): Ideally this cast would happen inside of the cached + # self.freqs_cis property instead of here, but complex.dtype is not + # known at that point. + freqs_cis_sliced = ops.cast(freqs_cis_sliced, v.dtype) + + freqs_cis_bcast = ops.unsqueeze(ops.unsqueeze(freqs_cis_sliced, 1), 0) + + freqs_re = freqs_cis_bcast[..., 0] + freqs_im = freqs_cis_bcast[..., 1] + + rope_re = (x_re * freqs_re) - (x_im * freqs_im) + rope_im = (x_re * freqs_im) + (x_im * freqs_re) + + if self.interleaved: + rope_complex = ops.stack([rope_re, rope_im], axis=-1) + else: + rope_complex = ops.concat((rope_re, rope_im), axis=-1) + + # Cast back to the activations dtype, which may differ from + # freqs_cis's dtype. + return ops.cast(ops.reshape(rope_complex, v.shape), v.dtype) + + +@dataclass +class OptimizedRotaryEmbedding(RotaryEmbedding): + """ + Optimized version of RotaryEmbedding using 2D frequency tensor representation. + """ + + @cached_property + def freqs_cis(self): + freqs = self.freqs_cis_base() + d1, d2, d3 = freqs.shape + new_f_shape = [d1.dim, d2.dim * d3.dim] # type: ignore + self._freqs_cis = ops.reshape(freqs, new_f_shape) + return self._freqs_cis diff --git a/src/max/pipelines/nn/sequential.py b/src/max/pipelines/nn/sequential.py new file mode 100644 index 0000000000..0d75fb976f --- /dev/null +++ b/src/max/pipelines/nn/sequential.py @@ -0,0 +1,20 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""A General sequential layer, each layer is executed with the outputs of the previous.""" + +from .layer import LayerList + + +class Sequential(LayerList): + """A sequential stack of layers where each layer is called by the outputs + of the previous layer.""" diff --git a/src/max/pipelines/nn/transformer/__init__.py b/src/max/pipelines/nn/transformer/__init__.py new file mode 100644 index 0000000000..02c70b1c3c --- /dev/null +++ b/src/max/pipelines/nn/transformer/__init__.py @@ -0,0 +1,29 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +"""The transformer mechanism used within the model.""" + +from .distributed_transformer import ( + DistributedTransformer, + DistributedTransformerBlock, +) +from .naive_transformer import NaiveTransformer, NaiveTransformerBlock +from .transformer import Transformer, TransformerBlock + +__all__ = [ + "DistributedTransformer", + "DistributedTransformerBlock", + "NaiveTransformer", + "NaiveTransformerBlock", + "Transformer", + "TransformerBlock", +] diff --git a/src/max/pipelines/nn/transformer/distributed_transformer.py b/src/max/pipelines/nn/transformer/distributed_transformer.py new file mode 100644 index 0000000000..0172b003f0 --- /dev/null +++ b/src/max/pipelines/nn/transformer/distributed_transformer.py @@ -0,0 +1,149 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from dataclasses import dataclass + +from max.dtype import DType +from max.graph import BufferValue, DeviceRef, TensorValue, TensorValueLike, ops +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, + PagedKVCacheCollection, +) + +from ..attention.interfaces import DistributedAttentionImpl +from ..embedding import VocabParallelEmbedding +from ..layer import Layer +from ..linear import DistributedMLP, LinearV2 +from ..norm import DistributedRMSNorm, LayerNorm, RMSNorm + + +# TODO (pavan): clean up duplicate instances of distribute_value, shard_col_value, +# shard_row_value across the codebase into a multi gpu utils file +def distribute_value(v, devices: list[DeviceRef]): + return [v.to(device) for device in devices] + + +@dataclass +class DistributedTransformerBlock(Layer): + """Stack of Attention, FeedForward, and RMSNorm layers.""" + + attention: DistributedAttentionImpl + mlp: DistributedMLP + attention_norm: DistributedRMSNorm + mlp_norm: DistributedRMSNorm + devices: list[DeviceRef] + + def __call__( + self, + xs: list[TensorValue], + signal_buffers: list[BufferValue], + kv_collections: list[ + ContinuousBatchingKVCacheCollection | PagedKVCacheCollection + ], + **kwargs, + ) -> list[TensorValue]: + attn_outs = self.attention( + self.attention_norm(xs), signal_buffers, kv_collections, **kwargs + ) + + hs = [x + attn_out for x, attn_out in zip(xs, attn_outs)] + mlp_outs = self.mlp(self.mlp_norm(hs), signal_buffers) + hs = [h + mlp_out for h, mlp_out in zip(hs, mlp_outs)] + + return hs + + +@dataclass +class DistributedTransformer(Layer): + """Transformer model consisting for TransformerBlock layers.""" + + dim: int + n_heads: int + layers: list[DistributedTransformerBlock] + norm: RMSNorm | LayerNorm + output: LinearV2 + embedding: VocabParallelEmbedding + kv_params: KVCacheParams + kv_collection_constructor: ( + FetchContinuousBatchingKVCacheCollection | FetchPagedKVCacheCollection + ) + devices: list[DeviceRef] + all_logits: bool = False + + def __call__( + self, + tokens: TensorValueLike, + signal_buffers: list[BufferValue], + kv_cache_inputs_per_dev: list[tuple[TensorValue, ...]], + **kwargs, + ) -> tuple[TensorValue, ...]: + h = self.embedding(tokens, signal_buffers) + + kv_collections = [ + self.kv_collection_constructor(*kv_cache_inputs) + for kv_cache_inputs in kv_cache_inputs_per_dev + ] + + for _, layer in enumerate(self.layers): + h = layer(h, signal_buffers, kv_collections, **kwargs) + + h0 = h[0] # All the outputs are the same here. + if self.all_logits: + # When echo is enabled, the logits of the input tokens are + # returned. + logits = ops.cast(self.output(self.norm(h0)), DType.float32) + if "input_row_offsets" in kwargs: + # For ragged tensors gather the last tokens from packed dim 0. + input_row_offsets: TensorValueLike = kwargs["input_row_offsets"] + last_token_indices = input_row_offsets[1:] - 1 # type: ignore + last_token_logits = ops.gather( + logits, last_token_indices, axis=0 + ) + else: + # For padded tensors, use `gather_nd`. + # Unsqueeze since `gather_nd` expects a static last dim. + valid_lengths: TensorValueLike = kwargs["valid_lengths"] + last_token_logits = ops.gather_nd( + logits, + indices=ops.unsqueeze(valid_lengths - 1, -1), # type: ignore + batch_dims=1, + ) + return (last_token_logits, logits) + else: + # Otherwise, only return the logits for the last non-pad token + # (right-padded). + if "input_row_offsets" in kwargs: + # For ragged tensors gather the last tokens from packed dim 0. + input_row_offsets = kwargs["input_row_offsets"] + last_token_indices = input_row_offsets[1:] - 1 # type: ignore + # Should be: last_token = h[last_token_indices] + last_token = ops.gather(h0, last_token_indices, axis=0) + else: + # For padded tensors, use `gather_nd`. + # Unsqueeze since `gather_nd` expects a static last dim. + valid_lengths = kwargs["valid_lengths"] + last_token = ops.gather_nd( + h0, + indices=ops.unsqueeze(valid_lengths - 1, -1), # type: ignore + batch_dims=1, + ) + + # Always return float32 logits, no matter the activation type + return ( + ops.cast(self.output(self.norm(last_token)), DType.float32), + ) diff --git a/src/max/pipelines/nn/transformer/naive_transformer.py b/src/max/pipelines/nn/transformer/naive_transformer.py new file mode 100644 index 0000000000..ae3dadbb2d --- /dev/null +++ b/src/max/pipelines/nn/transformer/naive_transformer.py @@ -0,0 +1,139 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from typing import Callable + +from max.dtype import DType +from max.graph import TensorValue, TensorValueLike, ops + +from ..attention import NaiveAttentionWithRope +from ..embedding import Embedding, EmbeddingV2 +from ..layer import Layer, LayerList, LayerV2 +from ..linear import Linear, LinearV2 + + +class NaiveTransformerBlock(LayerV2): + """Max-Graph Only Stack of Attention, FeedForward, and RMSNorm layers.""" + + def __init__( + self, + attention: NaiveAttentionWithRope, + mlp: Layer, + attention_norm: Layer, + mlp_norm: Layer, + residual_multiplier: float = 1.0, + ): + super().__init__() + self.self_attn = attention + self.mlp = mlp + self.input_layernorm = attention_norm + self.post_attention_layernorm = mlp_norm + self.residual_multiplier = residual_multiplier + + def __call__( + self, + x: TensorValue, + attention_mask: TensorValueLike, + k_cache: TensorValueLike, + v_cache: TensorValueLike, + start_pos: TensorValue, + layer_index: int, + ) -> tuple[TensorValue, TensorValue, TensorValue]: + residual_multiplier = ops.constant(self.residual_multiplier, x.dtype) + attn_out = self.self_attn( + self.input_layernorm(x), + attention_mask, + k_cache, # type: ignore + v_cache, # type: ignore + start_pos, + layer_index, + ) + + if self.residual_multiplier != 1.0: + attn_out = attn_out * residual_multiplier + + h = x + attn_out + mlp = self.mlp(self.post_attention_layernorm(h)) + if self.residual_multiplier != 1.0: + mlp = mlp * residual_multiplier + + return h + mlp + + +class NaiveTransformer(LayerV2): + """Max-Graph only model consisting of NaiveTransformerBlock layers.""" + + def __init__( + self, + dim: int, + n_heads: int, + layers: list[NaiveTransformerBlock], + norm: Layer, + output: Linear | LinearV2, + theta: float, + embedding: Embedding | EmbeddingV2, + output_type: DType | None = None, + embedding_multiplier: float = 1.0, + logits_postprocessor: Callable[[TensorValue], TensorValue] + | None = None, + ): + super().__init__() + self.dim = dim + self.n_heads = n_heads + self.layers = LayerList(layers) + self.norm = norm + self.lm_head = output + self.theta = theta + self.embed_tokens = embedding + self.output_type = output_type + self.embedding_multiplier = embedding_multiplier + self.logits_postprocessor = logits_postprocessor + + def _apply_logits_postprocessor( + self, output: tuple[TensorValue] + ) -> tuple[TensorValue]: + if self.logits_postprocessor is None: + return output + return tuple(self.logits_postprocessor(elem) for elem in output) # type:ignore + + def __call__( + self, + tokens: TensorValueLike, + attention_mask: TensorValueLike, + k_cache: TensorValueLike, + v_cache: TensorValueLike, + start_pos: TensorValueLike, + ) -> tuple[TensorValue]: + h = self.embed_tokens(tokens) + + if self.embedding_multiplier != 1.0: + h = h * ops.constant(self.embedding_multiplier, h.dtype) + + for i in range(len(self.layers)): + h = self.layers[i]( + h, + attention_mask, + k_cache, + v_cache, + start_pos, + i, + ) + + output = self.lm_head(self.norm(h)) + if self.output_type is not None: + casted_output = ops.cast(output, self.output_type) + return self._apply_logits_postprocessor((casted_output,)) + + return self._apply_logits_postprocessor((output,)) diff --git a/src/max/pipelines/nn/transformer/transformer.py b/src/max/pipelines/nn/transformer/transformer.py new file mode 100644 index 0000000000..c0ba441975 --- /dev/null +++ b/src/max/pipelines/nn/transformer/transformer.py @@ -0,0 +1,162 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Callable + +from max.dtype import DType +from max.graph import TensorValue, TensorValueLike, ops +from max.pipelines.kv_cache import ( + ContinuousBatchingKVCacheCollection, + FetchContinuousBatchingKVCacheCollection, + FetchPagedKVCacheCollection, + KVCacheParams, + PagedKVCacheCollection, +) + +from ..attention.interfaces import ( + AttentionImpl, + AttentionImplQKV, + AttentionImplV2, +) +from ..embedding import Embedding, EmbeddingV2 +from ..layer import Layer, LayerList, LayerV2 +from ..linear import Linear, LinearV2 + + +class TransformerBlock(LayerV2): + """Stack of Attention, FeedForward, and RMSNorm layers.""" + + def __init__( + self, + attention: AttentionImpl | AttentionImplV2 | AttentionImplQKV, + mlp: Layer, + attention_norm: Layer, + mlp_norm: Layer, + residual_multiplier: float = 1.0, + ): + super().__init__() + self.self_attn = attention + self.mlp = mlp + self.input_layernorm = attention_norm + self.post_attention_layernorm = mlp_norm + self.residual_multiplier = residual_multiplier + + def __call__( + self, + x: TensorValue, + kv_collection: ContinuousBatchingKVCacheCollection + | PagedKVCacheCollection, + **kwargs, + ) -> TensorValue: + residual_multiplier = ops.constant(self.residual_multiplier, x.dtype) + attn_out = self.self_attn( + self.input_layernorm(x), + kv_collection, + **kwargs, + ) + + if self.residual_multiplier != 1.0: + attn_out = attn_out * residual_multiplier + + h = x + attn_out + mlp = self.mlp(self.post_attention_layernorm(h)) + if self.residual_multiplier != 1.0: + mlp = mlp * residual_multiplier + + return h + mlp + + +class Transformer(LayerV2): + """Transformer model consisting for TransformerBlock layers.""" + + def __init__( + self, + dim: int, + n_heads: int, + layers: list[TransformerBlock], + norm: Layer, + output: Linear | LinearV2, + embedding: Embedding | EmbeddingV2, + kv_params: KVCacheParams, + kv_collection_constructor: ( + FetchContinuousBatchingKVCacheCollection + | FetchPagedKVCacheCollection + ), + all_logits: bool = False, + embedding_multiplier: float = 1.0, + logits_postprocessor: Callable[[TensorValue], TensorValue] + | None = None, + ): + super().__init__() + self.dim = dim + self.n_heads = n_heads + self.layers = LayerList(layers) + self.norm = norm + self.lm_head = output + self.embed_tokens = embedding + self.kv_params = kv_params + self.kv_collection_constructor = kv_collection_constructor + self.all_logits = all_logits + self.embedding_multiplier = embedding_multiplier + self.logits_postprocessor = logits_postprocessor + + def _apply_logits_postprocessor( + self, output: tuple[TensorValue, ...] + ) -> tuple[TensorValue, ...]: + if self.logits_postprocessor is None: + return output + return tuple(self.logits_postprocessor(elem) for elem in output) + + def __call__( + self, + tokens: TensorValueLike, + kv_cache_inputs: Sequence[TensorValue], + **kwargs, + ) -> tuple[TensorValue, ...]: + # TODO: Split into a ragged and non-ragged version. + h = self.embed_tokens(tokens) + + if self.embedding_multiplier != 1.0: + h = h * ops.constant(self.embedding_multiplier, h.dtype) + + kv_collection = self.kv_collection_constructor(*kv_cache_inputs) + + for _, layer in enumerate(self.layers): + h = layer(h, kv_collection, **kwargs) + + normalized = self.norm(h) + + if "input_row_offsets" in kwargs: + # Ragged inputs/activations + last_indices = kwargs["input_row_offsets"][1:] - 1 + last_tokens = ops.gather(normalized, last_indices, axis=0) + else: + # Dense padded inputs/activations + valid_lengths = kwargs["valid_lengths"] + # TODO: Remove once `gather_nd` works with nonstatic last dims. + indices = ops.unsqueeze(valid_lengths - 1, -1) + last_tokens = ops.gather_nd(normalized, indices, batch_dims=1) + + # Always return float32 logits, no matter the activation type. + last_token_logits = ops.cast(self.lm_head(last_tokens), DType.float32) + + if self.all_logits: + all_logits = ops.cast(self.lm_head(normalized), DType.float32) + return self._apply_logits_postprocessor( + (last_token_logits, all_logits) + ) + + return self._apply_logits_postprocessor((last_token_logits,)) diff --git a/src/max/pipelines/pipeline.py b/src/max/pipelines/pipeline.py new file mode 100644 index 0000000000..822602fb07 --- /dev/null +++ b/src/max/pipelines/pipeline.py @@ -0,0 +1,739 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# mypy: disable-error-code="import-not-found" +"""HF Token Generation Pipeline""" + +from __future__ import annotations + +import logging +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import ( + Any, + Generic, + List, + Optional, + Protocol, + Sequence, + Type, + TypeVar, + runtime_checkable, +) + +import torch +from max.driver import Device, Tensor +from max.dtype import DType +from max.engine import InferenceSession +from max.pipelines.kv_cache import ( + KVCacheInputs, + KVCacheInputsSequence, + infer_optimal_batch_size, +) +from max.profiler import Tracer, traced +from transformers import AutoTokenizer + +from .config import PipelineConfig +from .context import InputContext +from .interfaces import TokenGenerator +from .kv_cache import KVCacheManager, KVCacheParams +from .response import LogProbabilities, TextResponse +from .sampling import token_sampler + +try: + import xgrammar as xgr + + # This retrieves the last logger handler added + # which presumably is the one initialized in xgrammar + # and removes it, this stops our server logging from + # doubling up. + logger = logging.getLogger() + handler = logger.handlers[-1] + logger.removeHandler(handler) +except ImportError: + pass + +logger = logging.getLogger("max.pipelines") + +ARCH_SAFE_VRAM_USAGE_LIMIT = { + "DeepseekCoder": 0.96, + "ExaoneForCausalLM": 0.96, + "LlamaForCausalLM": 0.96, + "MistralForCausalLM": 0.96, +} + + +def upper_bounded_default(upper_bound: int, default: int | None) -> int: + """ + Given an upper bound and an optional default value, returns a final value + that cannot exceed the upper bound. + + Args: + default: The default value to use, or None to use the upper bound. + upper_bound: The upper bound to use. + + Raises: + ValueError: If the provided default value exceeds the upper bound. + + Returns: + The final value. + """ + if default is None: + return upper_bound + elif default > upper_bound: + raise ValueError( + f"default value provided ({default}) exceeds the upper bound ({upper_bound})" + ) + return default + + +class ModelInputs: + """ + Base class for model inputs. + Use this class to encapsulate inputs for your model. + You may store any number of dataclass fields + + Example: + >>> class ReplitInputs(ModelInputs): + ... tokens: Tensor + ... input_row_offsets: Tensor + ... + ... def __init__(self, tokens: Tensor, input_row_offsets: Tensor): + ... self.tokens = tokens + ... self.input_row_offsets = input_row_offsets + ... + >>> # Create tensors + >>> tokens = Tensor.zeros((1, 2, 3), DType.int64) + >>> input_row_offsets = Tensor.zeros((1, 1, 1), DType.int64) + >>> # Initialize inputs + >>> inputs = ReplitInputs(tokens=tokens, input_row_offsets=input_row_offsets) + >>> # Access tensors + >>> list(inputs) == [tokens, input_row_offsets] + True + """ + + +@dataclass(frozen=True) +class ModelOutputs: + next_token_logits: Tensor | None = None + """Logits for just the next token.""" + + logits: Tensor | None = None + """Logits for the entire token sequence.""" + + +T = TypeVar("T", bound=InputContext) + + +class PipelineModel(ABC, Generic[T]): + """A pipeline model with setup, input preparation and execution methods.""" + + _MAX_DEFAULT_BATCH_SIZE = 4096 + _MIN_DEFAULT_BATCH_SIZE = 1 + + def __init__( + self, pipeline_config: PipelineConfig, session: InferenceSession + ) -> None: + self.pipeline_config = pipeline_config + + if isinstance(self, KVCacheMixin): + self.kv_manager = self.load_kv_manager( + session, pipeline_config._available_cache_memory + ) + + @classmethod + @abstractmethod + def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + """Calculate the optimal max sequence length for the model. + Models are expected to implement this method. + + Example: + >>> class MistralModel(PipelineModel): + ... @classmethod + ... def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: + ... try: + ... return upper_bounded_default( + ... upper_bound=pipeline_config.huggingface_config.max_seq_len, + ... default=pipeline_config.max_length, + ... ) + ... except ValueError as e: + ... msg = ( + ... "Unable to infer max_length for Mistral, the provided " + ... f"max_length ({pipeline_config.max_length}) exceeds the " + ... f"model's max_seq_len " + ... f"({pipeline_config.huggingface_config.max_seq_len})." + ... ) + ... raise ValueError(msg) from e + ... + """ + raise NotImplementedError( + "PipelineModel must implement calculate_max_seq_len" + ) + + @classmethod + @abstractmethod + def get_kv_params(cls, pipeline_config: PipelineConfig) -> KVCacheParams: + """Returns the KV cache params for the pipeline model.""" + ... + + @classmethod + @abstractmethod + def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: + """Returns the number of layers for the pipeline model.""" + ... + + @classmethod + def infer_optimal_batch_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + ) -> int: + """Returns the estimated optimal batch size to run the model + given current memory constraints.""" + if not issubclass(cls, KVCacheMixin): + # we rely on the KVCache setup to know optimal batch size. + # If we don't have that, default to BS=1. + return 1 + elif ( + len(pipeline_config.devices) == 1 + and pipeline_config.devices[0].is_host + ): + # batching on CPU is generally not useful, so we hard-code a batch size of 1. + return 1 + + # TODO we should map HF configs to a unified MAX Config object + # this would help avoid these excessive calls to class methods. + n_layers = cls.get_num_layers(pipeline_config) + kv_params = cls.get_kv_params(pipeline_config) + inferred_batch_size = infer_optimal_batch_size( + params=kv_params, + max_seq_len=cls.calculate_max_seq_len(pipeline_config), + num_layers=n_layers, + available_cache_memory=available_cache_memory, + devices=pipeline_config.devices, + ) + + # clamp the floor of the inferred batch size to 1 and the ceiling to 4096 + inferred_batch_size = max( + cls._MIN_DEFAULT_BATCH_SIZE, + min(inferred_batch_size, cls._MAX_DEFAULT_BATCH_SIZE), + ) + return inferred_batch_size + + @classmethod + def estimate_weights_size(cls, pipeline_config: PipelineConfig) -> int: + """Calculates the estimated memory consumption of our model.""" + + # TODO move this logic to the PipelineModel instead of PipelineConfig class. + # Better yet, make this more accurate by loading and measuring memory consumption + # after we load the model + return pipeline_config.weights_size() + + @abstractmethod + def execute( + self, + model_inputs: ModelInputs, + # TODO(zheng): This should be tucked inside ModelInputs in the future. + kv_cache_inputs: KVCacheInputs | None = None, + ) -> ModelOutputs: + """Executes the graph with the given inputs. + + Args: + model_inputs: The model inputs to execute, containing tensors and any other + required data for model execution. + kv_cache_inputs: The kv cache inputs to execute, containing tensors and any other + required data for model execution. + + Returns: + ModelOutputs containing the pipeline's output tensors. + + This is an abstract method that must be implemented by concrete PipelineModels + to define their specific execution logic. + """ + + @abstractmethod + def prepare_initial_token_inputs( + self, context_batch: Sequence[T] + ) -> ModelInputs: + """Prepares the initial inputs to be passed to `.execute()`. + + The inputs and functionality of this method can vary per model. + For example, the model inputs could include: + - Encoded tensors + - A unique IDs for each tensor if this model uses a KV Cache manager. + + This function would batch the encoded tensors, claim a slot in the kv + cache if the ID hasn't been seen before, and return the inputs and + caches as a list of tensors.""" + ... + + @abstractmethod + def prepare_next_token_inputs( + self, + next_tokens: Tensor, + prev_model_inputs: ModelInputs, + ) -> ModelInputs: + """Prepares the secondary inputs to be passed to `.execute()`. + + While `prepare_initial_token_inputs` is responsible for managing the initial inputs. + This function is responsible for updating the inputs, for each step in a multi-step execution pattern. + """ + ... + + def compute_log_probabilities( + self, + model_inputs: ModelInputs, + model_outputs: ModelOutputs, + next_tokens: Tensor, + batch_top_n: list[int], + batch_echo: list[bool], + ) -> list[LogProbabilities | None] | None: + """Optional method that can be overridden to compute log probabilities. + + Args: + model_inputs: Inputs to the model returned by + `prepare_*_token_inputs()`. + model_outputs: Outputs returned by `execute()`. + next_tokens: Sampled tokens. Should have shape=[batch size] + batch_top_n: Number of top log probabilities to return per input in + the batch. For any element where `top_n == 0`, the + LogProbabilities is skipped. + batch_echo: Whether to include input tokens in the returned log + probabilities. + + Returns: + List of log probabilities. + """ + raise NotImplementedError( + f"Log probabilities not implemented for {type(self)}." + ) + + +@runtime_checkable +class KVCacheMixin(Protocol): + def load_kv_manager( + self, + session: InferenceSession, + available_cache_memory: Optional[int], + ) -> KVCacheManager: + """Provided a PipelineConfig and InferenceSession, loads the KV manager. + + Args: + session: Inference session to compile and init the KV cache. + available_cache_memory: Amount of memory available to the KV cache, + in bytes. + + Returns: + Either a single KV cache manager or a tuple of KV cache managers: + one per input modality. + """ + ... + + @classmethod + @abstractmethod + def estimate_kv_cache_size( + cls, + pipeline_config: PipelineConfig, + available_cache_memory: int, + devices: list[Device], + ) -> int: + """Estimates the size of the kv cache in bytes.""" + ... + + +class TextGenerationPipeline(TokenGenerator[T]): + """Generalized token generator pipeline.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + pipeline_model: Type[PipelineModel], + # TODO: This should be removed. + eos_token_id: int, + ) -> None: + self._pipeline_config = pipeline_config + + # Expand eos tokens if more are provided in pipeline_config + if "eos_token_id" in pipeline_config.huggingface_config: + eos_tokens = pipeline_config.huggingface_config.eos_token_id + if isinstance(eos_tokens, int): + if eos_tokens != eos_token_id: + msg = f"eos_token_id provided in huggingface config ({eos_tokens}), does not match provided eos_token_id ({eos_token_id}), using provided eos_token_id" + logger.warning(msg) + + self._eos_token_id = set([eos_tokens]) + elif isinstance(eos_tokens, list): + if eos_token_id in eos_tokens: + self._eos_token_id = set(eos_tokens) + else: + self._eos_token_id = set([eos_token_id]) + else: + msg = f"eos_token_id in huggingface_config, is neither int or list: {eos_tokens}" + logger.warning(msg) + self._eos_token_id = set([eos_token_id]) + + else: + self._eos_token_id = set([eos_token_id]) + + # Create a grammar compiler if constrained decoding is enabled + self.vocab_size = None + if pipeline_config.enable_structured_output: + tokenizer = AutoTokenizer.from_pretrained( + pipeline_config.model_path + ) + self.vocab_size = len(tokenizer) + tokenizer_info = xgr.TokenizerInfo.from_huggingface( + tokenizer, + vocab_size=self.vocab_size, + ) + + self._grammar_compiler = xgr.GrammarCompiler(tokenizer_info) + + # Initialize Session. + session = InferenceSession(devices=self._pipeline_config.devices) + + # Enable profiling if enabled. + session.gpu_profiling(self._pipeline_config.gpu_profiling) + + # Use experimental kernels if enabled by env var `USE_EXPERIMENTAL_KERNELS`. + session._use_experimental_kernels( + self._pipeline_config.use_experimental_kernels + ) + + # Load model. + self._pipeline_model = pipeline_model( + pipeline_config=self._pipeline_config, session=session + ) + + # Load sampler. + self._sampler = session.load( + token_sampler(self._pipeline_config.sampling_params), + ) + + def calculate_num_steps( + self, + num_steps: int, + context: T, + ) -> int: + max_seq_len = self._pipeline_model.calculate_max_seq_len( + self._pipeline_config + ) + # this is effectively: max_seq_len - (num_tokens_in_kv_cache + num_new_tokens) - num_new_tokens + num_available_steps = max_seq_len - ( + context.current_length - context.active_length + ) + if num_available_steps <= 0: + raise ValueError( + f"Request {context.cache_seq_id} length ({context.current_length}) is larger than or equal to the configured max_length ({max_seq_len})" + ) + + return ( + num_steps + if num_available_steps > num_steps + else num_available_steps + ) + + @traced + def prepare_batch( + self, + batch: list[T], + num_steps: int, + ) -> tuple[ModelInputs, List[KVCacheInputs], int, Optional[torch.Tensor]]: + tracer: Tracer = Tracer("prepare_batch") + + if self._pipeline_config.enable_structured_output: + assert self.vocab_size is not None + bitmask = torch.ones( + xgr.get_bitmask_shape( + len(batch), + self.vocab_size, + ), + dtype=torch.int32, + ) + else: + bitmask = None + + seq_ids_and_prompts = {} + seq_ids_and_untrimmed_lengths = {} + tracer.next("claim_cache_rows") + for i, context in enumerate(batch): + # Initialize a matcher if needed + if context.json_schema and context.matcher is None: + if not self._pipeline_config.enable_structured_output: + msg = "json_schema provided but constrained decoding is not enabled." + raise ValueError(msg) + + try: + compiled_grammar = ( + self._grammar_compiler.compile_json_schema( + context.json_schema, + any_whitespace=False, + ) + ) + matcher = xgr.GrammarMatcher(compiled_grammar) + context.set_matcher(matcher) + except Exception as e: + msg = f"Json schema provided in request cannot be compiled to valid grammar. \ + Please update your json schema to produce valid structured output. From XGrammar: {e}" + logger.warning(msg) + # I am removing the json_schema, so it doesn't try to load the grammar repeatedly. + context.json_schema = None # type: ignore + + # Claim cache rows for context. + if not self._pipeline_model.kv_manager.contains( + context.cache_seq_id + ): + self._pipeline_model.kv_manager.external_claim( + [context.cache_seq_id] + ) + + # Gather tokens and untrimmed lengths. + seq_ids_and_prompts[context.cache_seq_id] = context.next_tokens + seq_ids_and_untrimmed_lengths[context.cache_seq_id] = ( + context.active_length + ) + + # Update num_steps. + num_steps = self.calculate_num_steps(num_steps, context) + + # Update bitmask + if ( + self._pipeline_config.enable_structured_output + and context.matcher + ): + context.matcher.fill_next_token_bitmask(bitmask, index=i) + + # `fetch` mutates the seq_ids_and_prompts input in place when tokens are + # retrieved from the cache. This shortens the prompt in the event that + # some tokens have backing KV cache entries. + tracer.next("fetch_kv_cache") + kv_cache_inputs = self._pipeline_model.kv_manager.fetch( + seq_ids_and_prompts, num_steps + ) + + # Update the context with the new possibly shortened prompt. + tracer.next("trim_prompt") + for context in batch: + untrimmed_length = seq_ids_and_untrimmed_lengths[ + context.cache_seq_id + ] + trimmed_length = len(seq_ids_and_prompts[context.cache_seq_id]) + bump_length = untrimmed_length - trimmed_length + if bump_length > 0: + context.bump_token_indices( + start_idx=bump_length, + ) + + return ( + self._pipeline_model.prepare_initial_token_inputs(batch), + kv_cache_inputs, + num_steps, + bitmask, + ) + + @traced + def sample_logits( + self, + logits: Tensor, + prev_tokens: Tensor, + bitmask: Optional[Tensor], + ) -> tuple[Tensor, Tensor]: + if bitmask is not None: + a, b = self._sampler(logits, prev_tokens, bitmask)[:2] + else: + a, b = self._sampler( + logits, + prev_tokens, + )[:2] + assert isinstance(a, Tensor) + assert isinstance(b, Tensor) + return (a, b) + + @traced + def next_token( + self, + batch: dict[str, T], + num_steps: int, + ) -> list[dict[str, Any]]: + """Provided a batch, process batch inputs, execute the graph for num_steps in a multi-step scenario, + then decode the tokens holistically and return the list of decoded tokens. + """ + tracer: Tracer = Tracer("compute_parameters") + + # Flatten our batch for consistent indexing. + context_batch = list(batch.values()) + + # # Get extra compute parameters for each input. + batch_top_n = [context.log_probabilities for context in context_batch] + compute_log_probabilities = any(batch_top_n) + batch_echo: list[bool] = [ + context.log_probabilities_echo for context in context_batch + ] + + # Prepare the batch. + model_inputs, batched_kv_cache_inputs, num_steps, bitmask = ( + self.prepare_batch(context_batch, num_steps) + ) + + # Multistep execution loop. + tracer.next("allocate_generated_tokens") + generated_tokens = Tensor.zeros( + (len(context_batch), 0), + dtype=DType.int64, + device=self._pipeline_config.devices[0], + ) + + curr_step_inputs = model_inputs + batch_log_probabilities = [] + tracer.next(f"multistep_execution_loop_{num_steps}_steps") + for i in range(num_steps): + tracer.push(f"step_{i}") + + # Execute the model and get next tokens. + model_outputs = self._pipeline_model.execute( + model_inputs=curr_step_inputs, + kv_cache_inputs=KVCacheInputsSequence( + kv_cache_inputs=batched_kv_cache_inputs, + ), + ) + assert model_outputs.next_token_logits is not None + next_token_logits = model_outputs.next_token_logits + + if bitmask is not None: + assert self.vocab_size is not None + bits = 2 ** torch.arange(32, dtype=torch.int32) + bitmask = (bitmask.unsqueeze(-1) & bits) != 0 + bitmask = bitmask.reshape( + len(context_batch), + -1, + ).to(torch.bool) + bitmask = bitmask[:, 0 : self.vocab_size] + + bitmask = Tensor.from_dlpack(bitmask).to( + self._pipeline_config.devices[0] + ) + + # Sample next token. + tracer.next("sample_next_token") + new_tokens, new_generated_tokens = self.sample_logits( + next_token_logits, + generated_tokens, + bitmask, + ) + + assert isinstance(new_tokens, Tensor) + assert isinstance(new_generated_tokens, Tensor) + generated_tokens = new_generated_tokens + + if compute_log_probabilities: + try: + tracer.next("compute_log_probabilities") + batch_log_probabilities.append( + self._pipeline_model.compute_log_probabilities( + curr_step_inputs, + model_outputs, + new_tokens, + batch_top_n, + batch_echo, + ) + ) + except NotImplementedError: + logger.warning( + "Unable to compute log probabilities for" + f" {self._pipeline_config.model_path}" + ) + batch_log_probabilities.append(None) + # Check if we're on our last iteration. If so, skip preparing the next batch + if i == num_steps - 1: + tracer.pop() # pops f"step_{i}" + break + # Prepare inputs for the next token in multistep execution + tracer.next("increment_cache_lengths") # pops sample_next_token + # Unpack model inputs for execute() call by getting all fields + batched_kv_cache_inputs = ( + self._pipeline_model.kv_manager.increment_cache_lengths( + batched_kv_cache_inputs, # type: ignore + curr_step_inputs, + ) + ) + tracer.next("prepare_next_token_inputs") # pops inc_cache_lengths + curr_step_inputs = self._pipeline_model.prepare_next_token_inputs( + new_tokens, curr_step_inputs + ) + tracer.pop() # pops step_{i} + + # Do the copy to host for each token generated. + tracer.next( + "generated_tokens.to(CPU())" + ) # pops multistep_execution_loop_steps + generated_tokens_host = generated_tokens.to_numpy() + + # Actually update the cache lengths in our kv_cache manager + tracer.next("kv_manager.step") # pops generated_tokens.to(CPU()) + seq_ids_and_new_tokens = { + ctx.cache_seq_id: generated_tokens_host[i] + for i, ctx in enumerate(context_batch) + } + self._pipeline_model.kv_manager.step(seq_ids_and_new_tokens) + tracer.pop() # pops kv_manager.step + + # Prepare the response, pruning away completed requests as we go. + res: list[dict[str, Any]] = [{} for _ in range(num_steps)] + tracer.push("prepare_response") + for batch_index, (request_id, context) in enumerate(batch.items()): + step = 0 + while step < num_steps: + # Convert to a Python scalar to improve serialization performance. + next_token = int(generated_tokens_host[batch_index, step]) + + # Write this token into our pre-allocated tokens array. + context.update( + new_token=next_token, + ) + + max_length = upper_bounded_default( + upper_bound=self._pipeline_model.calculate_max_seq_len( + self._pipeline_config + ), + default=context.max_length, + ) + + # The current length is incremented above, during context.update + # As such, if we are already at the max length, exiting here + # would cause us to miss updating the request. + # As such, we overrun here by 1, ensuring that the context object + # tracks special tokens like eos_token_id appropriately for benchmarking + # and other uses, but that they are not returned in the request. + if ( + next_token in self._eos_token_id + or context.current_length > max_length + ): + step += 1 + break + + # Set up TextResponse + log_probs: Optional[LogProbabilities] = None + if compute_log_probabilities and ( + log_probs_for_step := batch_log_probabilities[step] + ): + log_probs = log_probs_for_step[batch_index] + + # Removing the positional arguments here, go about 100us faster. + res[step][request_id] = TextResponse(next_token, log_probs) + + step += 1 + + return res + + def release(self, context: T) -> None: + """Mark the context as complete, releasing the cache slot from the KV manager.""" + self._pipeline_model.kv_manager.release(context.cache_seq_id) diff --git a/src/max/pipelines/registry.py b/src/max/pipelines/registry.py new file mode 100644 index 0000000000..312b0d1e79 --- /dev/null +++ b/src/max/pipelines/registry.py @@ -0,0 +1,1045 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Model registry, for tracking various model variants.""" + +from __future__ import annotations + +import functools +import logging +import os +from io import StringIO +from typing import Callable, Optional, Type, Union, cast + +import torch +from max.graph.weights import WeightsAdapter + +from .config import ( + PipelineConfig, + PipelineEngine, + RopeType, + SupportedEncoding, + WeightsFormat, +) +from .embeddings_pipeline import EmbeddingsPipeline +from .hf_pipeline import HFEmbeddingsPipeline, HFTextGenerationPipeline +from .interfaces import ( + EmbeddingsGenerator, + PipelineTask, + PipelineTokenizer, + TokenGenerator, +) +from .kv_cache import KVCacheStrategy +from .pipeline import KVCacheMixin, PipelineModel, TextGenerationPipeline +from .tokenizer import TextAndVisionTokenizer, TextTokenizer + +logger = logging.getLogger("max.pipelines") + +# Store a map of checkpoint encodings that can be cast to another dtype while +# keeping similar results. Maps the requested encoding to an acceptable +# alternate checkpoint encoding. +_ALTERNATE_ENCODINGS = { + SupportedEncoding.float32: SupportedEncoding.bfloat16, + SupportedEncoding.bfloat16: SupportedEncoding.float32, +} + +_PIPELINE_TASK_MAP = { + PipelineTask.TEXT_GENERATION: TextGenerationPipeline, + PipelineTask.EMBEDDINGS_GENERATION: EmbeddingsPipeline, +} + + +_HF_PIPELINE_TASK_MAP: dict[ + PipelineTask, type[HFTextGenerationPipeline] | type[HFEmbeddingsPipeline] +] = { + PipelineTask.TEXT_GENERATION: HFTextGenerationPipeline, + PipelineTask.EMBEDDINGS_GENERATION: HFEmbeddingsPipeline, +} + + +def _to_human_memory_size(bytes: int) -> str: + """Convert bytes to human readable memory size.""" + KiB = 1024 + MiB = KiB * 1024 + GiB = MiB * 1024 + TiB = GiB * 1024 + if bytes > TiB: + return f"{bytes / TiB:.2f} TiB" + if bytes > GiB: + return f"{bytes / GiB:.2f} GiB" + if bytes > MiB: + return f"{bytes / MiB:.2f} MiB" + return f"{bytes / KiB:.2f} KiB" + + +class SupportedArchitecture: + def __init__( + self, + name: str, + example_repo_ids: list[str], + default_encoding: SupportedEncoding, + supported_encodings: dict[SupportedEncoding, list[KVCacheStrategy]], + pipeline_model: Type[PipelineModel], + task: PipelineTask, + tokenizer: Type[Union[TextTokenizer, TextAndVisionTokenizer]], + default_weights_format: WeightsFormat, + rope_type: RopeType = RopeType.none, + weight_adapters: dict[WeightsFormat, WeightsAdapter] | None = None, + ): + """Initializes a model architecture supported by MAX pipelines. + + New architectures should be registered into the `PipelineRegistry`. + + args: + name: Architecture name. + example_repo_ids: HuggingFace repo_id which runs this architecture. + default_encoding: Default encoding for the model. + supported_encodings: Alternate encodings supported. + pipeline_model: PipelineModel class that defines the model graph + and execution. + task: Which pipeline task should the model run with. + tokenizer: Tokenizer used to preprocess model inputs. + default_weights_format: The weights format used in `pipeline_model`. + weight_converters: A dictionary of weight loaders to use if the + input checkpoint has a different format than the default. + """ + self.name = name + self.example_repo_ids = example_repo_ids + self.default_encoding = default_encoding + self.supported_encodings = supported_encodings + self.pipeline_model = pipeline_model + self.tokenizer = tokenizer + self.default_weights_format = default_weights_format + self.rope_type = rope_type + self.weight_adapters = weight_adapters or {} + self.task = task + + +class PipelineRegistry: + def __init__(self, architectures: list[SupportedArchitecture]): + self.architectures = {arch.name: arch for arch in architectures} + + def register(self, architecture: SupportedArchitecture): + """Add new architecture to registry.""" + if architecture.name in self.architectures: + msg = f"Refusing to override existing architecture for '{architecture.name}'" + raise ValueError(msg) + + self.architectures[architecture.name] = architecture + + def architecture_details( + self, pipeline_config: PipelineConfig + ) -> Optional[SupportedArchitecture]: + """Return architecture details for pipeline_config if available, None if not found.""" + + # If no architecture is provided in the pipeline_config, we have nothing to retrieve. + if not pipeline_config.architecture: + return None + + # If the engine is not provided or MAX, we should retrieve the architecture and validate it. + if ( + not pipeline_config.engine + or pipeline_config.engine == PipelineEngine.MAX + ): + if pipeline_config.architecture in self.architectures: + return self.architectures[pipeline_config.architecture] + else: + return None + else: + return None + + def validate_pipeline_config( + self, pipeline_config: PipelineConfig + ) -> PipelineConfig: + """Update pipeline config with appropriate values if not provided. + If invalid config is provided, error out with detailed reason.""" + + # This will update the architecture, and engine if no architecture is available. + pipeline_config.update_architecture() + + # This will retrieve the architecture, if we support it. + arch = self.architecture_details(pipeline_config) + + # If nothing is provided, we should not update any more params. + # Instead, fall back to the HuggingFace engine. + if not arch and pipeline_config.engine == PipelineEngine.MAX: + msg = ( + "optimized architecture not available for" + f" '{pipeline_config.architecture}', failing as engine is provided as 'MAX'" + ) + raise ValueError(msg) + + elif not arch: + msg = ( + "optimized architecture not available for" + f" '{pipeline_config.architecture}' falling back to" + " HuggingFace." + ) + logger.warning(msg) + pipeline_config.engine = PipelineEngine.HUGGINGFACE + return pipeline_config + + # The remainder of this function, assumes we have both a valid model_path, + # and a SupportedArchitecture. We should then validate the details of the existing architecture + # and fallback to HuggingFace if needed. + + # If weight_path and quantization_encoding are provided, verify that they are consistent. + huggingface_weights_repo = pipeline_config.huggingface_weights_repo() + if ( + pipeline_config.weight_path + and pipeline_config.quantization_encoding + # Cannot validate quantization_encoding for pytorch. + and pipeline_config.weights_format != WeightsFormat.pytorch + ): + # Get the encoding of the first weight path file. + if os.path.exists(pipeline_config.weight_path[0]): + file_encoding = SupportedEncoding.parse_from_file_name( + str(pipeline_config.weight_path[0]) + ) + else: + file_encoding = huggingface_weights_repo.encoding_for_file( + pipeline_config.weight_path[0] + ) + + if file_encoding: + if file_encoding != pipeline_config.quantization_encoding: + msg = f"weight_path provided '{pipeline_config.weight_path[0]}' has an inconsistent encoding '{file_encoding}' than quantization_encoding provided '{pipeline_config.quantization_encoding}'. Please update one." + raise ValueError(msg) + # If weight path is not None, infer the quantization_encoding from the weight_path. + elif ( + pipeline_config.weight_path + and not pipeline_config.quantization_encoding + and pipeline_config.weights_format != WeightsFormat.pytorch + ): + if os.path.exists(pipeline_config.weight_path[0]): + # Not currently supported. Infer encoding from local path. + if pipeline_config.weight_path[0].suffix == ".safetensors": + msg = "If a local safetensors file is provided, please provide a quantization_encoding." + raise ValueError(msg) + + if encoding := SupportedEncoding.parse_from_file_name( + str(pipeline_config.weight_path[0]) + ): + msg = f"encoding inferred from weights file: {encoding}" + logger.debug(msg) + pipeline_config.quantization_encoding = encoding + + else: + if encoding := huggingface_weights_repo.encoding_for_file( + pipeline_config.weight_path[0] + ): + msg = f"encoding inferred from weights file: {encoding}" + logger.debug(msg) + pipeline_config.quantization_encoding = encoding + else: + msg = f"encoding cannot be inferred from weights file: {pipeline_config.weight_path[0]}, please pass a quantization_encoding explictly." + raise ValueError(msg) + elif not pipeline_config.quantization_encoding: + # Check if the repo only has one quantization_encoding. + supported_encodings = huggingface_weights_repo.supported_encodings + if len(supported_encodings) == 1: + msg = f"huggingface repo only has '{supported_encodings[0]}' weights, using '{supported_encodings[0]}'" + logger.debug(msg) + pipeline_config.quantization_encoding = supported_encodings[0] + elif ( + not pipeline_config.devices[0].is_host + ) and SupportedEncoding.bfloat16 in arch.supported_encodings: + # TODO(AITLIB-137): replace this with more full featured logic. + # If we are running on an accelerator and the quantiziation encoding is not set, override to bfloat16. + pipeline_config.quantization_encoding = ( + SupportedEncoding.bfloat16 + ) + else: + msg = f"encoding not provided, using default encoding of {arch.default_encoding}" + logger.debug(msg) + pipeline_config.quantization_encoding = arch.default_encoding + # by this point, the quantization_encoding must be provided. verify it is supported. + if ( + pipeline_config.quantization_encoding + not in arch.supported_encodings + ): + if pipeline_config.engine == PipelineEngine.MAX: + msg = f"quantization_encoding of '{pipeline_config.quantization_encoding}' not supported by MAX engine, unable to run with engine = 'max'." + raise ValueError(msg) + + else: + msg = f"quantization_encoding of '{pipeline_config.quantization_encoding}' not supported by MAX engine, falling back to HuggingFace." + logger.warning(msg) + pipeline_config.engine = PipelineEngine.HUGGINGFACE + return pipeline_config + + # Check that the quantization encoding is supported on the specified + # devices. + for device_spec in pipeline_config.device_specs: + if not pipeline_config.quantization_encoding.supported_on( + device_spec + ): + raise ValueError( + f"{pipeline_config.quantization_encoding} is not supported on {device_spec.device_type}. " + "Please use the flag --devices=cpu or --devices=gpu to configure the device." + ) + + pipeline_config.finalize_encoding_config() + + # Pass weight adapters to the PipelineConfig. + pipeline_config._weight_adapters = arch.weight_adapters + + # We should now have a valid quantization_encoding, and possibly a weight_path. + # If no weight_path is provided, we should grab the default. + if not pipeline_config.weight_path: + # Retrieve the default files for each weights format. + + # Get alternate encoding (e.g. if float32 is requested and there are + # only bfloat16 weights, allow retrieving the bfloat16 weights + # because they can be cast to float32). + alternate_encoding = _ALTERNATE_ENCODINGS.get( + pipeline_config.quantization_encoding + ) + + weight_files = huggingface_weights_repo.files_for_encoding( + encoding=pipeline_config.quantization_encoding, + alternate_encoding=alternate_encoding, + ) + + if default_weight_files := weight_files.get( + arch.default_weights_format, [] + ): + pipeline_config.weight_path = default_weight_files + elif weight_files: + # Load any available weight file. + pipeline_config.weight_path = next(iter(weight_files.values())) + + if not pipeline_config.weight_path: + if pipeline_config.quantization_encoding not in [ + SupportedEncoding.bfloat16, + SupportedEncoding.float32, + ]: + msg = f"compatible weights cannot be found for '{pipeline_config.quantization_encoding}' in 'gguf' format, in the provided repo: '{huggingface_weights_repo.repo_id}'" + raise ValueError(msg) + else: + msg = f"compatible weights cannot be found for '{pipeline_config.quantization_encoding}'" + raise ValueError(msg) + + # Check supported_cache_strategy + supported_cache_strategies = arch.supported_encodings.get( + pipeline_config.quantization_encoding, [] + ) + if ( + pipeline_config.cache_strategy == KVCacheStrategy.MODEL_DEFAULT + and supported_cache_strategies + ): + default_strategy = supported_cache_strategies[0] + msg = f"default cache_strategy of '{default_strategy}' enabled" + logger.debug(msg) + + pipeline_config.cache_strategy = default_strategy + elif ( + supported_cache_strategies + and pipeline_config.cache_strategy not in supported_cache_strategies + ): + supported_strategy = supported_cache_strategies[0] + + msg = f"cache_strategy = '{pipeline_config.cache_strategy}' not supported for '{pipeline_config.quantization_encoding}', using '{supported_strategy}' cache strategy." + logger.warning(msg) + + pipeline_config.cache_strategy = supported_strategy + + # Assume at this point, an architecture, + # a model_path and weight_paths are available. + assert pipeline_config.weight_path, "weight_path must be provided." + for path in pipeline_config.weight_path: + # Check if file exists locally. + if not os.path.exists(path): + # If does not exist locally, verify that it exists on Huggingface. + if not huggingface_weights_repo.file_exists(str(path)): + msg = ( + f"weight_path: '{path}' does not exist locally, and" + f" '{pipeline_config.model_path}/{path}' does" + " not exist on HuggingFace." + ) + raise ValueError(msg) + + if pipeline_config.rope_type is None: + pipeline_config.rope_type = arch.rope_type + + self._estimate_memory_footprint(pipeline_config, arch) + + # If we pass validation ensure, the engine is set as MAX. + pipeline_config.engine = PipelineEngine.MAX + return pipeline_config + + def _estimate_memory_footprint( + self, + pipeline_config: PipelineConfig, + arch: SupportedArchitecture, + ): + model_cls = arch.pipeline_model + + try: + free_memory = int( + sum(d.stats["free_memory"] for d in pipeline_config.devices) + ) + except Exception as e: + logger.warning( + "Unable to estimate memory footprint of model, can't query device stats: " + + str(e) + ) + if not pipeline_config.max_batch_size: + pipeline_config.max_batch_size = 1 + if not pipeline_config.max_length: + pipeline_config.max_length = model_cls.calculate_max_seq_len( + pipeline_config + ) + return + + model_weights_size = model_cls.estimate_weights_size(pipeline_config) + + total_size = model_weights_size + available_kv_cache_memory = max(0, free_memory - model_weights_size) + available_kv_cache_memory = int( + available_kv_cache_memory + * pipeline_config.device_memory_utilization + ) + + user_provided_max_length = pipeline_config.max_length is not None + user_provided_max_batch_size = ( + pipeline_config.max_batch_size is not None + ) + if not user_provided_max_length: + pipeline_config.max_length = model_cls.calculate_max_seq_len( + pipeline_config + ) + + if not user_provided_max_batch_size: + pipeline_config.max_batch_size = self._infer_optimal_batch_size( + pipeline_config, model_cls, available_kv_cache_memory + ) + + actual_kv_cache_size = self._calculate_kv_cache_size( + model_cls, + pipeline_config, + available_kv_cache_memory, + ) + + pipeline_config._available_cache_memory = actual_kv_cache_size + + total_size += actual_kv_cache_size + + # If the model is too large to fit in memory, and the user did not + # specify a max_length, try to infer a value that would fit. + if total_size > free_memory and not user_provided_max_length: + original_max_length = pipeline_config.max_length + ( + found_valid_max_length, + inferred_max_length, + _, + ) = self._find_valid_max_length( + pipeline_config, + model_cls, + available_kv_cache_memory, + user_provided_max_batch_size, + ) + + if found_valid_max_length: + logger.warning( + f"Truncated model's default max_length from {original_max_length} to {inferred_max_length} to fit in memory." + ) + pipeline_config.max_length = inferred_max_length + actual_kv_cache_size = self._calculate_kv_cache_size( + model_cls, + pipeline_config, + available_kv_cache_memory, + ) + total_size = model_weights_size + actual_kv_cache_size + + if free_memory: + free_memory_str = f" / {_to_human_memory_size(free_memory)} free" + + weights_str = "" + if model_weights_size: + weights_str = f"\n\t Weights: {_to_human_memory_size(model_weights_size)}" + + if not user_provided_max_length: + max_length_str = f"Auto-inferred max sequence length: {pipeline_config.max_length}" + else: + max_length_str = ( + f"Current max sequence length: {pipeline_config.max_length}" + ) + + if not user_provided_max_batch_size: + max_batch_size_str = f"Auto-inferred max batch size: {pipeline_config.max_batch_size}" + else: + max_batch_size_str = ( + f"Current max batch size: {pipeline_config.max_batch_size}" + ) + + logging_str = ( + "\n" + f"\n\tEstimated memory consumption:" + f"{weights_str}" + f"\n\t KVCache allocation: {_to_human_memory_size(actual_kv_cache_size)}" + f"\n\t Total estimated: {_to_human_memory_size(model_weights_size + actual_kv_cache_size)} used{free_memory_str}" + f"\n\t{max_length_str}" + f"\n\t{max_batch_size_str}\n" + ) + logger.info(logging_str) + vram_usage_limit_scale = 0.95 + + if isinstance(free_memory, (int, float)): + if total_size > free_memory: + self._raise_oom_error( + pipeline_config, + user_provided_max_length, + user_provided_max_batch_size, + model_cls, + total_size, + free_memory, + available_kv_cache_memory, + model_weights_size, + ) + + elif total_size > vram_usage_limit_scale * free_memory: + logger.warning( + "Estimated model and kv cache memory use nears available memory. You may experience errors." + ) + + def _raise_oom_error( + self, + pipeline_config: PipelineConfig, + user_provided_max_length: bool, + user_provided_max_batch_size: bool, + model_cls: Type[PipelineModel], + total_size: int, + original_free_memory: int, + available_kv_cache_memory: int, + weights_size: int, + ) -> None: + """If we've determined the current configuration won't fit in device memory, + this method provides a friendly error message suggesting a viable configuration. + + The approach is to: + 1. Binary search max_length until we find a setting that works + 2. If user provided max_batch_size, binary search that too + 3. Generate appropriate suggestions based on this truth table: + + max_length + +----------------------+--------------------------+ + | set by user | set to default | + +----------------+======================+==========================+ + | set by user ║ Recommend both | Recommend max_batch_size | + max_batch_size +----------------+----------------------+--------------------------+ + | set to default ║ Recommend max_length | Recommend both | + +----------------+----------------------+--------------------------+ + """ + if weights_size > original_free_memory: + raise RuntimeError( + "Weights size exceeds available memory. Try running a smaller model, using a smaller precision, or using a device with more memory." + ) + + original_max_length = cast(int, pipeline_config.max_length) + original_max_batch_size = cast(int, pipeline_config.max_batch_size) + + # Find valid configurations through binary search + ( + found_valid_max_length, + inferred_max_length, + inferred_max_length_compatible_batch_size, + ) = self._find_valid_max_length( + pipeline_config, + model_cls, + available_kv_cache_memory, + user_provided_max_batch_size, + ) + + pipeline_config.max_batch_size = original_max_batch_size + + found_valid_max_batch_size, inferred_max_batch_size = ( + self._find_valid_batch_size( + pipeline_config, + model_cls, + available_kv_cache_memory, + original_max_length, + user_provided_max_batch_size, + ) + ) + + # Generate error message with suggestions + error_msg = self._generate_oom_error_message( + total_size=total_size, + original_free_memory=original_free_memory, + user_provided_max_length=user_provided_max_length, + user_provided_max_batch_size=user_provided_max_batch_size, + found_valid_max_length=found_valid_max_length, + found_valid_max_batch_size=found_valid_max_batch_size, + inferred_max_length=inferred_max_length, + inferred_max_batch_size=inferred_max_batch_size, + inferred_max_length_compatible_batch_size=inferred_max_length_compatible_batch_size, + original_max_length=original_max_length, + ) + + raise RuntimeError(error_msg) + + def _find_valid_max_length( + self, + pipeline_config: PipelineConfig, + model_cls: Type[PipelineModel], + available_kv_cache_memory: int, + user_provided_max_batch_size: bool, + ) -> tuple[bool, int, int]: + """Binary search to find a valid max_length configuration. + + Returns: + Tuple containing: + - found_valid_max_length: Whether a valid max_length was found + - inferred_max_length: The suggested max_length value + - inferred_max_length_compatible_batch_size: Compatible batch size for the max_length + """ + assert pipeline_config.max_length is not None + assert pipeline_config.max_batch_size is not None + + found_valid_max_length = False + lower = 1 + upper = pipeline_config.max_length + inferred_max_length = upper + + while not found_valid_max_length: + inferred_max_length = (lower + upper) // 2 + pipeline_config.max_length = inferred_max_length + + if not user_provided_max_batch_size: + pipeline_config.max_batch_size = self._infer_optimal_batch_size( + pipeline_config, model_cls, available_kv_cache_memory + ) + + kv_cache_size = self._calculate_kv_cache_size( + model_cls, pipeline_config, available_kv_cache_memory + ) + + if lower > upper: + break + elif upper - lower <= 1: + if kv_cache_size <= available_kv_cache_memory: + found_valid_max_length = True + break + + if kv_cache_size > available_kv_cache_memory: + upper = inferred_max_length - 1 + else: + lower = inferred_max_length + return ( + found_valid_max_length, + inferred_max_length, + pipeline_config.max_batch_size, + ) + + def _find_valid_batch_size( + self, + pipeline_config: PipelineConfig, + model_cls: Type[PipelineModel], + available_kv_cache_memory: int, + original_max_length: int, + user_provided_max_batch_size: bool, + ) -> tuple[bool, int]: + """Binary search to find a valid batch size configuration. + + Returns: + Tuple containing: + - found_valid_max_batch_size: Whether a valid batch size was found + - inferred_max_batch_size: The suggested batch size value. + If the user did not provide a batch size, this will be -1. + """ + if not user_provided_max_batch_size: + return False, -1 + + found_valid_max_batch_size = False + pipeline_config.max_length = original_max_length + inferred_max_batch_size = cast(int, pipeline_config.max_batch_size) + lower = 1 + upper = cast(int, pipeline_config.max_batch_size) + + while not found_valid_max_batch_size: + inferred_max_batch_size = (lower + upper) // 2 + pipeline_config.max_batch_size = inferred_max_batch_size + + kv_cache_size = self._calculate_kv_cache_size( + model_cls, pipeline_config, available_kv_cache_memory + ) + + if lower > upper: + break + elif upper - lower <= 1: + if kv_cache_size <= available_kv_cache_memory: + found_valid_max_batch_size = True + break + + if kv_cache_size > available_kv_cache_memory: + upper = inferred_max_batch_size - 1 + else: + lower = inferred_max_batch_size + + return found_valid_max_batch_size, inferred_max_batch_size + + def _calculate_kv_cache_size( + self, + model_cls: Type[PipelineModel], + pipeline_config: PipelineConfig, + available_kv_cache_memory: int, + ) -> int: + """Calculate the KV cache size for the current configuration.""" + if issubclass(model_cls, KVCacheMixin): + return model_cls.estimate_kv_cache_size( + pipeline_config=pipeline_config, + available_cache_memory=available_kv_cache_memory, + devices=pipeline_config.devices, + ) + return 0 + + def _generate_oom_error_message( + self, + total_size: int, + original_free_memory: int, + user_provided_max_length: bool, + user_provided_max_batch_size: bool, + found_valid_max_length: bool, + found_valid_max_batch_size: bool, + inferred_max_length: int, + inferred_max_batch_size: int, + inferred_max_length_compatible_batch_size: int, + original_max_length: int, + ) -> str: + """Generate an appropriate error message based on the configuration state.""" + free_memory_str = ( + f" / {_to_human_memory_size(original_free_memory)} free" + if original_free_memory + else "" + ) + + msg = StringIO() + msg.write( + f"Estimated model and kv cache memory use exceeds available memory ({_to_human_memory_size(total_size)} {free_memory_str}). Try " + ) + + if not found_valid_max_length and not found_valid_max_batch_size: + msg.write( + "reducing --max-length or --max-batch-size, finding a smaller model, or using a device with more memory." + ) + + elif user_provided_max_length: + self._add_user_provided_max_length_suggestions( + msg, + user_provided_max_batch_size, + found_valid_max_length, + found_valid_max_batch_size, + inferred_max_length, + inferred_max_batch_size, + inferred_max_length_compatible_batch_size, + ) + else: + self._add_default_max_length_suggestions( + msg, + user_provided_max_batch_size, + found_valid_max_length, + found_valid_max_batch_size, + inferred_max_length, + inferred_max_batch_size, + inferred_max_length_compatible_batch_size, + original_max_length, + ) + + msg.write(".") + return msg.getvalue() + + def _add_user_provided_max_length_suggestions( + self, + msg: StringIO, + user_provided_max_batch_size: bool, + found_valid_max_length: bool, + found_valid_max_batch_size: bool, + inferred_max_length: int, + inferred_max_batch_size: int, + inferred_max_length_compatible_batch_size: int, + ) -> None: + """Add error message suggestions when user provided max_length. + + This handles the top row of the truth table from the _raise_oom_error docstring. + + Args: + msg: StringIO buffer to write message to + user_provided_max_batch_size: Whether user provided batch size + found_valid_max_length: Whether valid max_length was found + found_valid_max_batch_size: Whether valid batch size was found + inferred_max_length: Suggested max_length value + inferred_max_batch_size: Suggested batch size value + inferred_max_length_compatible_batch_size: Compatible batch size for max_length + """ + if not user_provided_max_batch_size: + if found_valid_max_length: + msg.write( + f"reducing --max-length to {inferred_max_length} " + f"(supports batch size of {inferred_max_length_compatible_batch_size})" + ) + else: + msg.write("reducing --max-length or --max-batch-size") + else: + if found_valid_max_length: + msg.write( + f"reducing --max-length to {inferred_max_length} and " + f"--max-batch-size to {inferred_max_length_compatible_batch_size})" + ) + + if found_valid_max_batch_size: + if found_valid_max_length: + msg.write(" or ") + msg.write( + f"reducing --max-batch-size to {inferred_max_batch_size}" + ) + + def _add_default_max_length_suggestions( + self, + msg: StringIO, + user_provided_max_batch_size: bool, + found_valid_max_length: bool, + found_valid_max_batch_size: bool, + inferred_max_length: int, + inferred_max_batch_size: int, + inferred_max_length_compatible_batch_size: int, + original_max_length: int, + ) -> None: + """Add error message suggestions when max_length was set to default. + + This handles the bottom row of the truth table from the _raise_oom_error docstring. + + Args: + msg: StringIO buffer to write message to + user_provided_max_batch_size: Whether user provided batch size + found_valid_max_length: Whether valid max_length was found + found_valid_max_batch_size: Whether valid batch size was found + inferred_max_length: Suggested max_length value + inferred_max_batch_size: Suggested batch size value + inferred_max_length_compatible_batch_size: Compatible batch size for max_length + original_max_length: Original max_length value before modifications + """ + if not user_provided_max_batch_size: + if found_valid_max_length: + msg.write( + f"setting --max-length to {inferred_max_length} and " + f"--max-batch-size to {inferred_max_length_compatible_batch_size})" + ) + + if found_valid_max_batch_size: + if found_valid_max_length: + msg.write(" or ") + msg.write( + f"setting --max-batch-size to {inferred_max_batch_size}" + ) + + else: + if found_valid_max_batch_size: + msg.write( + f"reducing --max-batch-size to {inferred_max_batch_size}" + ) + if found_valid_max_length: + if found_valid_max_batch_size: + msg.write(" or ") + msg.write( + f"setting --max-length to {inferred_max_length} " + f"(currently defaulted to {original_max_length})" + ) + + def _infer_optimal_batch_size( + self, + pipeline_config: PipelineConfig, + model_cls: Type[PipelineModel], + available_kv_cache_memory: int, + ) -> int: + return model_cls.infer_optimal_batch_size( + pipeline_config, + available_kv_cache_memory, + ) + + def _load_logging_message( + self, + pipeline_config: PipelineConfig, + tokenizer_type: Type[PipelineTokenizer], + pipeline_name: str, + pipeline_model: str, + factory: bool, + ): + weight_path = ",\n ".join( + [ + f" {path}" + for path in pipeline_config.weight_path + ] + ) + factory_str = "factory" if factory else "" + + weights_repo_str = ( + f"\n weights_repo_id: {pipeline_config._weights_repo_id}" + if pipeline_config._weights_repo_id + else "" + ) + + devices_str = ", ".join( + f"{d.label}[{d.id}]" for d in pipeline_config.devices + ) + message = f""" + + Loading {tokenizer_type.__name__} and {pipeline_name}({pipeline_model}) {factory_str} for: + engine: {pipeline_config.engine} + architecture: {pipeline_config.architecture} + devices: {devices_str} + model_path: {pipeline_config.model_path}{weights_repo_str} + huggingface_revision: {pipeline_config.huggingface_revision} + quantization_encoding: {pipeline_config.quantization_encoding} + cache_strategy: {pipeline_config.cache_strategy} + weight_path: [ + {weight_path} + ] + """ + + return message + + def _set_hf_pipeline_defaults( + self, pipeline_config: PipelineConfig + ) -> PipelineConfig: + if pipeline_config.max_batch_size is None: + pipeline_config.max_batch_size = 1 + # HF pipelines always use custom continuous cache + pipeline_config.cache_strategy = KVCacheStrategy.CONTINUOUS + return pipeline_config + + def retrieve_factory( + self, + pipeline_config: PipelineConfig, + task: PipelineTask = PipelineTask.TEXT_GENERATION, + ) -> tuple[ + PipelineTokenizer, + Callable[[], TokenGenerator | EmbeddingsGenerator], + ]: + tokenizer: PipelineTokenizer + pipeline_factory: Callable[[], TokenGenerator | EmbeddingsGenerator] + + # Validate pipeline_config, and update missing values. + pipeline_config = self.validate_pipeline_config(pipeline_config) + if pipeline_config.engine == PipelineEngine.MAX: + # Keep MyPy happy. + assert pipeline_config.architecture is not None + + pipeline_class = _PIPELINE_TASK_MAP[task] + + # MAX pipeline + arch = self.architectures[pipeline_config.architecture] + logger.info( + self._load_logging_message( + pipeline_config=pipeline_config, + tokenizer_type=arch.tokenizer, + pipeline_model=arch.pipeline_model.__name__, + pipeline_name=pipeline_class.__name__, + factory=True, + ) + ) + + max_length = arch.pipeline_model.calculate_max_seq_len( + pipeline_config + ) + + # Old Mistral model like Mistral-7B-Instruct-v0.3 uses LlamaTokenizer + # and suffers from the whitespace decoding bug. So, we enable the fix + # for only MistralModel in order to avoid any issues with performance + # for rest of the models. This can be applied more generically once + # we have more time verifying this for all the models. + # More information: + # https://linear.app/modularml/issue/AIPIPE-197/add-support-for-mistral-7b-instruct-v03 + # TODO: remove this pipeline_model.__name__ check + if ( + arch.pipeline_model.__name__ in ("MistralModel", "Phi3Model") + and arch.tokenizer is TextTokenizer + ): + text_tokenizer = cast(Type[TextTokenizer], arch.tokenizer) + tokenizer = text_tokenizer( + pipeline_config.model_path, + revision=pipeline_config.huggingface_revision, + max_length=max_length, + max_new_tokens=pipeline_config.max_new_tokens, + trust_remote_code=pipeline_config.trust_remote_code, + enable_llama_whitespace_fix=True, + ) + else: + tokenizer = arch.tokenizer( + pipeline_config.model_path, + revision=pipeline_config.huggingface_revision, + max_length=max_length, + max_new_tokens=pipeline_config.max_new_tokens, + trust_remote_code=pipeline_config.trust_remote_code, + ) + + pipeline_factory = functools.partial( + pipeline_class, + pipeline_config=pipeline_config, + pipeline_model=arch.pipeline_model, + eos_token_id=tokenizer.eos, + ) + else: + pipeline_config = self._set_hf_pipeline_defaults(pipeline_config) + hf_pipeline_class = _HF_PIPELINE_TASK_MAP[task] + + torch_device_type = str(pipeline_config.device_specs[0].device_type) + if pipeline_config.device_specs[0].device_type == "gpu": + torch_device_type = "cuda" + torch.multiprocessing.set_start_method("spawn", force=True) + + # Generalized pipeline + tokenizer = TextTokenizer( + pipeline_config.model_path, + revision=pipeline_config.huggingface_revision, + max_length=pipeline_config.max_length, + max_new_tokens=pipeline_config.max_new_tokens, + trust_remote_code=pipeline_config.trust_remote_code, + enable_llama_whitespace_fix=True, + ) + logger.info( + self._load_logging_message( + pipeline_config=pipeline_config, + tokenizer_type=TextTokenizer, + pipeline_model="", + pipeline_name=hf_pipeline_class.__name__, + factory=True, + ) + ) + pipeline_factory = functools.partial( + hf_pipeline_class, + pipeline_config=pipeline_config, + torch_device_type=torch_device_type, + ) + + if tokenizer.eos is None: + msg = "tokenizer.eos value is None, tokenizer configuration is incomplete." + raise ValueError(msg) + + return tokenizer, pipeline_factory + + def retrieve( + self, + pipeline_config: PipelineConfig, + task: PipelineTask = PipelineTask.TEXT_GENERATION, + ) -> tuple[PipelineTokenizer, TokenGenerator | EmbeddingsGenerator]: + tokenizer, pipeline_factory = self.retrieve_factory( + pipeline_config, task + ) + return tokenizer, pipeline_factory() + + def reset(self) -> None: + self.architectures.clear() + + +PIPELINE_REGISTRY = PipelineRegistry([]) diff --git a/src/max/pipelines/requirements.txt b/src/max/pipelines/requirements.txt new file mode 100644 index 0000000000..708e101b5b --- /dev/null +++ b/src/max/pipelines/requirements.txt @@ -0,0 +1,38 @@ +# This was deleted as part of pipeline refactor +# https://github.com/modularml/modular/commit/d7e54f4a11b8f9a29e883d204dcacea90513db82#diff-b47636dfb4ba8723a713bfc288fdb324fa6e048067c7bbad0195795583edb21e +# But this is needed by benchmarking to setup the environment +# Adding this back for now to unblock. +click >= 8.1.7 +fastapi >= 0.111.0 +gguf >= 0.10.0 +requests >= 2.32.3 +sentencepiece >= 0.2.0 +tokenizers >= 0.19.1 +# PyTorch 2.5.1 with cuda support +torch == 2.5.1 +torchvision == 0.20.1 +torchaudio == 2.5.1 +transformers >= 4.44.2 +safetensors >= 0.4.5 +psutil + +# serve +hf-transfer>=0.1.9 +httpx>=0.28.1,<0.29 +huggingface-hub>=0.24.0 +opentelemetry-api>=1.29.0 +opentelemetry-exporter-otlp-proto-http>=1.27.0 +opentelemetry-exporter-prometheus>=0.48b0 +opentelemetry-sdk>=1.29.0 +pillow>=10.3.0 +prometheus-async>=22.2.0 +prometheus-client>=0.21.0 +pydantic-settings>=2.7.1 +pydantic +pyinstrument>=5.0.1 +python-json-logger>=2.0.7 +sentinel>=0.3.0 +sse-starlette>=2.1.2 +tokenizers>=0.19.0 +uvicorn>=0.34.0 +uvloop>=0.21.0 \ No newline at end of file diff --git a/src/max/pipelines/response.py b/src/max/pipelines/response.py new file mode 100644 index 0000000000..6154570afc --- /dev/null +++ b/src/max/pipelines/response.py @@ -0,0 +1,102 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Standardized response object for Pipeline Inference.""" + +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np + + +class LogProbabilities: + """Log probabilities for an individual output token. + + Attributes: + token_log_probabilities (list[float]): Probabilities of each token. + top_log_probabilities (list[dict[int, float]]): Top tokens and their corresponding probabilities. + + """ + + def __init__( + self, + token_log_probabilities: list[float], + top_log_probabilities: list[dict[int, float]], + ) -> None: + self.token_log_probabilities = token_log_probabilities + self.top_log_probabilities = top_log_probabilities + + def __eq__(self, other: object) -> bool: + if not isinstance(other, LogProbabilities): + return False + + if len(self.token_log_probabilities) != len( + other.token_log_probabilities + ): + return False + + if not all( + a == b + for a, b in zip( + self.token_log_probabilities, other.token_log_probabilities + ) + ): + return False + + if len(self.top_log_probabilities) != len(other.top_log_probabilities): + return False + + if not all( + a == b + for a, b in zip( + self.top_log_probabilities, other.top_log_probabilities + ) + ): + return False + + return True + + +class TextResponse: + """A base class for model response, specifically for Text model variants. + + Attributes: + next_token (int | str): Encoded predicted next token. + log_probabilities (LogProbabilities | None): Log probabilities of each output token. + + """ + + def __init__( + self, + next_token: int | str, + log_probabilities: LogProbabilities | None = None, + ) -> None: + self.next_token = next_token + self.log_probabilities = log_probabilities + + def __eq__(self, value: object) -> bool: + if not isinstance(value, TextResponse): + return False + + return ( + self.next_token == value.next_token + and self.log_probabilities == value.log_probabilities + ) + + +@dataclass +class EmbeddingsResponse: + """Container for the response from embeddings pipeline.""" + + embeddings: np.ndarray diff --git a/src/max/pipelines/sampling.py b/src/max/pipelines/sampling.py new file mode 100644 index 0000000000..eda8e6e895 --- /dev/null +++ b/src/max/pipelines/sampling.py @@ -0,0 +1,95 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Token sampling algorithms.""" + +from max.dtype import DType +from max.graph import Dim, Graph, Shape, TensorType, TensorValue, ops +from max.pipelines import SamplingParams + + +def _bitmask_sampler(sampling_params: SamplingParams) -> Graph: + logits_in_type = TensorType( + sampling_params.in_dtype, ["batch", "vocab_size"] + ) + prev_tokens_type = TensorType(DType.int64, ["batch", "num_prev_steps"]) + bitmask_type = TensorType(DType.bool, ["batch", "vocab_size"]) + + with Graph( + "bitmask_sampler", + input_types=[logits_in_type, prev_tokens_type, bitmask_type], + ) as graph: + # Deconstruct inputs and cast. + logits, prev_tokens, bitmask = (val.tensor for val in graph.inputs) + logits = ops.cast(logits, sampling_params.out_dtype) + + # Mask the logits out. + logits = ops.select( + bitmask, logits, ops.constant(-10000, dtype=DType.float32) + ) + + # Apply top_k or argmax sampling. + shape = Shape(logits.shape) + shape[-1] = Dim(1) + tokens = ops.custom( + "topk_fused_sampling", + [ + ops.constant(sampling_params.top_k, dtype=DType.int64), + logits, + ], + [TensorType(DType.int64, shape)], + )[0] + assert isinstance(tokens, TensorValue) + + all_tokens = ops.concat([prev_tokens, tokens], -1) + tokens = ops.squeeze(tokens, -1) + graph.output(tokens, all_tokens) + + return graph + + +def _vanilla_sampler(sampling_params: SamplingParams) -> Graph: + logits_in_type = TensorType( + sampling_params.in_dtype, ["batch", "vocab_size"] + ) + prev_tokens_type = TensorType(DType.int64, ["batch", "num_prev_steps"]) + with Graph( + "token_sampler", input_types=[logits_in_type, prev_tokens_type] + ) as graph: + logits, prev_tokens = (val.tensor for val in graph.inputs) + logits = ops.cast(logits, sampling_params.out_dtype) + + shape = Shape(logits.shape) + shape[-1] = Dim(1) + tokens = ops.custom( + "topk_fused_sampling", + [ + ops.constant(sampling_params.top_k, dtype=DType.int64), + logits, + ], + [TensorType(DType.int64, shape)], + )[0] + assert isinstance(tokens, TensorValue) + + all_tokens = ops.concat([prev_tokens, tokens], -1) + tokens = ops.squeeze(tokens, -1) + graph.output(tokens, all_tokens) + + return graph + + +def token_sampler(sampling_params: SamplingParams) -> Graph: + if sampling_params.enable_structured_output: + return _bitmask_sampler(sampling_params) + else: + return _vanilla_sampler(sampling_params) diff --git a/src/max/pipelines/tokenizer.py b/src/max/pipelines/tokenizer.py new file mode 100644 index 0000000000..03f4b73ae7 --- /dev/null +++ b/src/max/pipelines/tokenizer.py @@ -0,0 +1,518 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# mypy: disable-error-code="import-not-found" +"""Implementations of provided tokenizers.""" + +from __future__ import annotations + +import asyncio +import io +import json +import logging +from typing import Optional, Sequence, Union, cast + +import numpy as np +import torch +from PIL import Image +from transformers import ( + AutoProcessor, + AutoTokenizer, + CodeLlamaTokenizer, + CodeLlamaTokenizerFast, + LlamaTokenizer, + LlamaTokenizerFast, + PreTrainedTokenizer, + PreTrainedTokenizerFast, +) + +from .context import TextAndVisionContext, TextContext +from .interfaces import ( + PipelineTokenizer, + TokenGeneratorContext, + TokenGeneratorRequest, + TokenGeneratorRequestMessage, + TokenGeneratorRequestTool, +) + +logger = logging.getLogger("max.pipelines") + + +class IdentityPipelineTokenizer( + PipelineTokenizer[TokenGeneratorContext, str], +): + @property + def eos(self) -> int: + return 0 + + @property + def expects_content_wrapping(self) -> bool: + return False + + async def encode(self, prompt: str) -> str: + return prompt + + async def decode( + self, + context: TokenGeneratorContext, + encoded: str, + **kwargs, + ) -> str: + if isinstance(encoded, str): + return encoded + return "" + + +class PreTrainedPipelineTokenizer( + PipelineTokenizer[TokenGeneratorContext, np.ndarray] +): + def __init__( + self, + delegate: Union[PreTrainedTokenizer, PreTrainedTokenizerFast], + ) -> None: + assert isinstance( + delegate, (PreTrainedTokenizer, PreTrainedTokenizerFast) + ) + self.delegate = delegate + + def apply_chat_template( + self, messages: list[TokenGeneratorRequestMessage] + ) -> str: + try: + templated_message = self.delegate.apply_chat_template( + messages, tokenize=False, add_generation_prompt=True + ) + return cast(str, templated_message) + except Exception: + msg = ( + "apply_chat_template failed for" + " PreTrainedTokenGeneratorTokenizer" + ) + logger.warning(msg) + return "\n".join([str(message["content"]) for message in messages]) + + @property + def eos(self) -> int: + return self.delegate.eos_token_id + + @property + def expects_content_wrapping(self) -> bool: + return False + + async def encode(self, prompt: str) -> np.ndarray: + return np.array(self.delegate.encode(prompt)) + + async def decode( + self, + context: TokenGeneratorContext, + encoded: np.ndarray, + **kwargs, + ) -> str: + return self.delegate.decode(encoded, **kwargs) + + +def max_tokens_to_generate( + prompt_size: int, + max_length: int | None, + max_new_tokens: int | None = None, +) -> int | None: + """Returns the max number of new tokens to generate.""" + if max_length is None: + return max_new_tokens + _difference_between_max_and_prompt = max(max_length - prompt_size, 0) + if max_new_tokens is None: + return _difference_between_max_and_prompt + return min(max_new_tokens, _difference_between_max_and_prompt) + + +async def run_with_default_executor(fn, *args): + loop = asyncio.get_running_loop() + return await loop.run_in_executor(None, fn, *args) + + +class TextTokenizer(PipelineTokenizer[TextContext, np.ndarray]): + """Encapsulates creation of TextContext and specific token encode/decode logic.""" + + def __init__( + self, + model_path: str, + *, + revision: str | None = None, + max_length: int | None = None, + max_new_tokens: int | None = None, + trust_remote_code: bool = False, + enable_llama_whitespace_fix: bool = False, + ) -> None: + self.model_path = model_path + self.max_length = max_length + self.max_new_tokens = max_new_tokens + + self.delegate = AutoTokenizer.from_pretrained( + model_path, + revision=revision, + trust_remote_code=trust_remote_code, + # If `max_length` is None, the max length will be taken + # from the HuggingFace tokenizer_config. + model_max_length=max_length, + ) + + # configure Llama whitespace fix if needed + self._enable_llama_whitespace_fix = ( + enable_llama_whitespace_fix and self._is_llama_tokenizer + ) + ( + self._llama_whitespace_fix_dummy_token_id, + self._llama_whitespace_fix_dummy_token_len, + ) = self._llama_whitespace_fix_dummy_token + + def apply_chat_template( + self, + messages: list[TokenGeneratorRequestMessage], + tools: Optional[list[TokenGeneratorRequestTool]], + ) -> str: + try: + templated_message = self.delegate.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + tools=tools, + ) + return cast(str, templated_message) + except Exception: + msg = ( + "apply_chat_template failed for" + f" TextTokenizer({self.model_path})" + ) + logger.warning(msg) + return "\n".join([str(message["content"]) for message in messages]) + + @property + def eos(self) -> int: + return self.delegate.eos_token_id + + @property + def expects_content_wrapping(self) -> bool: + return False + + async def encode(self, prompt: Union[str, Sequence[int]]) -> np.ndarray: + """Transform the provided prompt into a token array.""" + + encoded_prompt: np.ndarray + if isinstance(prompt, str): + # Note: the underlying tokenizer may not be thread safe in some cases, see https://github.com/huggingface/tokenizers/issues/537 + # Add a standard (non-async) lock in the executor thread if needed. + encoded_prompt = await run_with_default_executor( + self.delegate.encode, prompt + ) + max_length = self.max_length or self.delegate.model_max_length + if max_length and len(encoded_prompt) > max_length: + raise ValueError( + f"Input string is larger than tokenizer's max length ({len(encoded_prompt)} > {max_length})." + ) + else: + encoded_prompt = np.array(list(prompt)) + + return encoded_prompt + + async def decode( + self, context: TextContext, encoded: np.ndarray, **kwargs + ) -> str: + """Transformer a provided encoded token array, back into readable text.""" + # Sometimes, encoded comes in as an int so, make it np array + if isinstance(encoded, int): + encoded = np.array(encoded) + + # There is an issue where Llama tokenizer strips leading spaces + # if a single token is decoded at a time. This is a temporary + # fix until the issue resolved on the Tokenizers side. + # More information: + # https://github.com/huggingface/transformers/issues/31643 + # https://github.com/Lightning-AI/litgpt/pull/1559 + if self._enable_llama_whitespace_fix and encoded.size == 1: + return self._decode_with_llama_whitespace_fix(encoded, **kwargs) + + return self.delegate.decode(encoded, **kwargs) + + async def new_context(self, request: TokenGeneratorRequest) -> TextContext: + """Create a new TextContext object, leveraging necessary information like + cache_seq_id and prompt from TokenGeneratorRequest.""" + + prompt: Union[str, list[int]] + if request.prompt is not None: + if isinstance(request.prompt, str): + prompt = str(request.prompt) + else: + prompt = [int(t) for t in request.prompt] + elif request.messages is not None: + prompt = self.apply_chat_template(request.messages, request.tools) + else: + raise ValueError(f"{request} does not provide messages or prompt.") + + encoded_prompt = await self.encode(prompt) + + # TODO(zheng): We should probably just make max_new_tokens an optional + # instead of -1. + max_new_tokens = None + if request.max_new_tokens is not None: + max_new_tokens = request.max_new_tokens + elif self.max_new_tokens != -1: + max_new_tokens = self.max_new_tokens + + max_gen_tokens = max_tokens_to_generate( + len(encoded_prompt), + self.max_length, + max_new_tokens, + ) + + json_schema = ( + json.dumps(request.response_format.get("json_schema", None)) + if request.response_format + else None + ) + context = TextContext( + prompt=prompt, + cache_seq_id=request.index, + max_length=len(encoded_prompt) + max_gen_tokens + if max_gen_tokens is not None + else None, + tokens=np.array(encoded_prompt), + log_probabilities=request.logprobs, + log_probabilities_echo=request.echo, + json_schema=json_schema, + ) + return context + + @property + def _is_llama_tokenizer(self) -> bool: + tokenizers = ( + LlamaTokenizer, + LlamaTokenizerFast, + CodeLlamaTokenizer, + CodeLlamaTokenizerFast, + ) + return isinstance(self.delegate, tokenizers) + + @property + def _llama_whitespace_fix_dummy_token(self) -> tuple[int, int]: + dummy_token_id = 33 # \x1e + dummy_token_decoded = self.delegate.decode([dummy_token_id]) + return dummy_token_id, len(dummy_token_decoded) + + def _decode_with_llama_whitespace_fix( + self, encoded: np.ndarray, **kwargs + ) -> str: + decoded = self.delegate.decode( + np.insert(encoded, 0, self._llama_whitespace_fix_dummy_token_id), + **kwargs, + ) + return decoded[self._llama_whitespace_fix_dummy_token_len :] + + +class TextAndVisionTokenizer( + PipelineTokenizer[TextAndVisionContext, np.ndarray] +): + """Encapsulates creation of TextContext and specific token encode/decode logic.""" + + def __init__( + self, + model_path: str, + *, + revision: str | None = None, + max_length: int | None = None, + max_new_tokens: int | None = None, + trust_remote_code: bool = False, + ) -> None: + self.model_path = model_path + self.max_length = max_length + self.max_new_tokens = max_new_tokens + + self.delegate = AutoTokenizer.from_pretrained( + model_path, + revision=revision, + trust_remote_code=trust_remote_code, + # If `max_length` is None, the max length will be taken + # from the HuggingFace tokenizer_config. + model_max_length=max_length, + ) + self.processor = AutoProcessor.from_pretrained( + model_path, + revision=revision, + trust_remote_code=trust_remote_code, + ) + + def _wrap_str_message_content( + self, messages: list[TokenGeneratorRequestMessage] + ) -> list[TokenGeneratorRequestMessage]: + # Wrap string type values of "content" key with "type": "text" and its + # value. For example, if the message is {"content": "Hello, world!"}, + # it will be wrapped with {"type": "text", "text": "Hello, world!"}. + # This is a workaround for LlamaVision's chat template: + # https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct/blob/main/chat_template.json + for message in messages: + if isinstance(message["content"], str): + message["content"] = [ + {"type": "text", "text": message["content"]} + ] + elif isinstance(message["content"], list): + for content in message["content"]: + if "content" in content and content["type"] == "text": + content["text"] = content.pop("content") + return messages + + def apply_chat_template( + self, messages: list[TokenGeneratorRequestMessage] + ) -> str: + # TODO: Refactor this. + if self.model_path == "meta-llama/Llama-3.2-11B-Vision-Instruct": + messages = self._wrap_str_message_content(messages) + try: + templated_message = self.processor.apply_chat_template( + messages, tokenize=False, add_generation_prompt=True + ) + return cast(str, templated_message) + except Exception as e: + msg = "apply_chat_template failed for TextAndVisionTokenizer" + logger.warning(msg) + logger.warning(str(e)) + prompt = [] + for message in messages: + if isinstance(message["content"], str): + prompt.append(message["content"]) + elif isinstance(message["content"], list): + for content in message["content"]: + if content["type"] == "text": + if "text" in content: + prompt.append(content["text"]) + else: + prompt.append(content["content"]) + return "\n".join(prompt) + + @property + def eos(self) -> int: + return self.delegate.eos_token_id + + @property + def expects_content_wrapping(self) -> bool: + return True + + async def encode(self, prompt: Union[str, Sequence[int]]) -> np.ndarray: + """Transform the provided prompt into a token array.""" + + encoded_prompt: np.ndarray + if isinstance(prompt, str): + # Note: the underlying tokenizer may not be thread safe in some cases, see https://github.com/huggingface/tokenizers/issues/537 + # Add a standard (non-async) lock in the executor thread if needed. + encoded_prompt = await run_with_default_executor( + self.delegate.encode, prompt + ) + max_length = self.max_length or self.delegate.model_max_length + if max_length and len(encoded_prompt) > max_length: + raise ValueError( + f"Input string is larger than tokenizer's max length ({len(encoded_prompt)} > {max_length})." + ) + else: + encoded_prompt = np.array(list(prompt)) + + return encoded_prompt + + async def decode( + self, context: TextAndVisionContext, encoded: np.ndarray, **kwargs + ) -> str: + """Transformer a provided encoded token array, back into readable text.""" + return self.delegate.decode(encoded, **kwargs) + + async def new_context( + self, request: TokenGeneratorRequest + ) -> TextAndVisionContext: + """Create a new TextAndVisionContext object, leveraging necessary information like + cache_seq_id and prompt from TokenGeneratorRequest.""" + prompt: Union[str, Sequence[int]] + if request.prompt is not None: + prompt = request.prompt + elif request.messages is not None: + prompt = self.apply_chat_template(request.messages) + else: + msg = f"{request} does not provide messages or prompt." + raise ValueError(msg) + + # Load images. + images = ( + [ + Image.open(io.BytesIO(image_data)) + for image_data in request.images + ] + if request.images + else None + ) + # PixtralProcessor returns a list of torch tensors. + # LlamaVision returns a np Array. + inputs = self.processor( + text=prompt, + images=images, + ) + + if "input_ids" not in inputs: + msg = "input_ids not provided in AutoProcessor output, please ensure you are using the correct processor for multi-modal inputs." + raise ValueError(msg) + encoded_prompt = np.array(inputs["input_ids"][0]) + + # TODO(zheng): We should probably just make max_new_tokens an optional + # instead of -1. + max_new_tokens = None + if request.max_new_tokens is not None: + max_new_tokens = request.max_new_tokens + elif self.max_new_tokens != -1: + max_new_tokens = self.max_new_tokens + + max_gen_tokens = max_tokens_to_generate( + encoded_prompt.shape[0], + self.max_length, + max_new_tokens, + ) + + extra_model_args = dict() + + if images is not None: + if "pixel_values" not in inputs: + msg = "pixel_values not provided in AutoProcessor output, please ensure you are using the correct processor for multi-modal inputs." + raise ValueError(msg) + pixel_values = inputs["pixel_values"][0] + if isinstance(pixel_values, list): + pixel_values = [ + tensor.numpy() if torch.is_tensor(tensor) else tensor + for tensor in pixel_values + ] + if "aspect_ratio_ids" in inputs: + extra_model_args["aspect_ratio_ids"] = inputs.aspect_ratio_ids + if "aspect_ratio_mask" in inputs: + extra_model_args["aspect_ratio_mask"] = inputs.aspect_ratio_mask + else: + pixel_values = [] + + json_schema = ( + json.dumps(request.response_format.get("json_schema", None)) + if request.response_format + else None + ) + + context = TextAndVisionContext( + prompt=prompt, + pixel_values=pixel_values, + extra_model_args=extra_model_args, + cache_seq_id=request.index, + tokens=encoded_prompt, + max_length=encoded_prompt.shape[0] + max_gen_tokens + if max_gen_tokens is not None + else None, + json_schema=json_schema, + ) + return context diff --git a/src/max/pixi.toml b/src/max/pixi.toml new file mode 100644 index 0000000000..6c2812dc86 --- /dev/null +++ b/src/max/pixi.toml @@ -0,0 +1,17 @@ +[project] +name = "max-pipelines-example" +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-aarch64", "linux-64"] +description = "MAX Pipelines" +version = "0.5.0" +authors = ["Modular Inc "] + +[dependencies] +max-pipelines = "*" + +[tasks] +llama3 = "max-pipelines llama3" +replit = "max-pipelines replit" +mistral = "max-pipelines mistral" +generate = "max-pipelines generate" +serve = "max-pipelines serve" diff --git a/tutorials/README.md b/tutorials/README.md new file mode 100644 index 0000000000..d5bca75fb9 --- /dev/null +++ b/tutorials/README.md @@ -0,0 +1,4 @@ +# MAX tutorials finished code + +This directory contains the "finished" code for tutorials you can read at +[docs.modular.com/max/tutorials](https://docs.modular.com/max/tutorials). diff --git a/tutorials/deploy-aws-kubernetes/README.md b/tutorials/deploy-aws-kubernetes/README.md new file mode 100644 index 0000000000..b319416118 --- /dev/null +++ b/tutorials/deploy-aws-kubernetes/README.md @@ -0,0 +1,6 @@ +# Tutorial: Deploy a model with Kubernetes and Helm + +This is the client code for the [Deploy a model with Kubernetes and +Helm](https://docs.modular.com/max/tutorials/deploy-aws-kubernetes) tutorial. + +Please refer to that page for more information. diff --git a/tutorials/deploy-aws-kubernetes/client.py b/tutorials/deploy-aws-kubernetes/client.py new file mode 100644 index 0000000000..076bc3c525 --- /dev/null +++ b/tutorials/deploy-aws-kubernetes/client.py @@ -0,0 +1,63 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# suppress extraneous logging +import os + +os.environ["TRANSFORMERS_VERBOSITY"] = "critical" +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +import numpy as np +import tritonclient.http as httpclient +from transformers import AutoTokenizer + +text = "Paris is the [MASK] of France." + +# Create a triton client +triton_client = httpclient.InferenceServerClient(url="127.0.0.1:8000") + +# Preprocess input statement +tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +inputs = tokenizer( + text, + return_tensors="np", + return_token_type_ids=True, + padding="max_length", + truncation=True, + max_length=128, +) + +# Set the input data +triton_inputs = [ + httpclient.InferInput("input_ids", inputs["input_ids"].shape, "INT32"), + httpclient.InferInput( + "attention_mask", inputs["attention_mask"].shape, "INT32" + ), + httpclient.InferInput( + "token_type_ids", inputs["token_type_ids"].shape, "INT32" + ), +] +triton_inputs[0].set_data_from_numpy(inputs["input_ids"].astype(np.int32)) +triton_inputs[1].set_data_from_numpy(inputs["attention_mask"].astype(np.int32)) +triton_inputs[2].set_data_from_numpy(inputs["token_type_ids"].astype(np.int32)) + +# Executing +output = triton_client.infer("bert-base-uncased", triton_inputs) + +# Post-processing +masked_index = (inputs["input_ids"] == tokenizer.mask_token_id).nonzero()[1] +logits = output.as_numpy("result0")[0, masked_index, :] +predicted_token_ids = logits.argmax(axis=-1) +predicted_text = tokenizer.decode(predicted_token_ids) +output_text = text.replace("[MASK]", predicted_text) +print(output_text) diff --git a/tutorials/deploy-cloudformation-sagemaker/README.md b/tutorials/deploy-cloudformation-sagemaker/README.md new file mode 100644 index 0000000000..9cd602e606 --- /dev/null +++ b/tutorials/deploy-cloudformation-sagemaker/README.md @@ -0,0 +1,7 @@ +# Tutorial: Deploy a model with AWS CloudFormation + +This is the client code for the [Deploy a model with with AWS +CloudFormation](https://docs.modular.com/max/tutorials/deploy-cloudformation-sagemaker) +tutorial. + +Please refer to that page for more information. diff --git a/tutorials/deploy-cloudformation-sagemaker/client.py b/tutorials/deploy-cloudformation-sagemaker/client.py new file mode 100644 index 0000000000..8e39608aa4 --- /dev/null +++ b/tutorials/deploy-cloudformation-sagemaker/client.py @@ -0,0 +1,116 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# suppress extraneous logging +import os + +os.environ["TRANSFORMERS_VERBOSITY"] = "critical" + +import json + +import boto3 +import numpy as np +import transformers +from botocore.config import Config + +config = Config(region_name="us-east-1") +client = boto3.client("sagemaker-runtime", config=config) + +# NOTE: Paste your endpoint here +endpoint_name = "YOUR-ENDPOINT-GOES-HERE" + +text = "The quick brown fox jumped over the lazy dog." + +tokenizer = transformers.BertTokenizer.from_pretrained("bert-base-uncased") +inputs = tokenizer( + text, padding="max_length", max_length=128, return_tensors="pt" +) + +# Convert tensor inputs to list for payload +input_ids = inputs["input_ids"].tolist()[0] +attention_mask = inputs["attention_mask"].tolist()[0] +token_type_ids = inputs["token_type_ids"].tolist()[0] + +payload = { + "inputs": [ + { + "name": "input_ids", + "shape": [1, 128], + "datatype": "INT32", + "data": input_ids, + }, + { + "name": "attention_mask", + "shape": [1, 128], + "datatype": "INT32", + "data": attention_mask, + }, + { + "name": "token_type_ids", + "shape": [1, 128], + "datatype": "INT32", + "data": token_type_ids, + }, + ] +} + +http_response = client.invoke_endpoint( + EndpointName=endpoint_name, + ContentType="application/octet-stream", + Body=json.dumps(payload), +) +response = json.loads(http_response["Body"].read().decode("utf8")) +outputs = response["outputs"] + + +def softmax(logits): + exp_logits = np.exp(logits - np.max(logits)) + return exp_logits / exp_logits.sum(axis=-1, keepdims=True) + + +# Process the output +for output in outputs: + logits = output["data"] + logits = np.array(logits).reshape(output["shape"]) + + print(f"Logits shape: {logits.shape}") + + if ( + len(logits.shape) == 3 + ): # Shape [batch_size, sequence_length, num_classes] + token_probabilities = softmax(logits) + predicted_classes = np.argmax(token_probabilities, axis=-1) + + print(f"Predicted classes shape: {predicted_classes.shape}") + print( + f"Predicted class indices range: {np.min(predicted_classes)}," + f" {np.max(predicted_classes)}" + ) + + # Map predicted indices to tokens + predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_classes[0]) + + # Pair each input token with its predicted token + input_tokens = tokenizer.convert_ids_to_tokens(input_ids) + token_pairs = list(zip(input_tokens, predicted_tokens)) + + print("Predicted Token Pairs:") + print("-" * 45) + print("| {:<20} | {:<18} |".format("Input Token", "Predicted Token")) + print("-" * 45) + for input_token, predicted_token in token_pairs: + if input_token != "[PAD]": # Exclude padding tokens + print( + "| {:<20} | {:<18} |".format(input_token, predicted_token) + ) + print("-" * 45) diff --git a/tutorials/hello-magic/.gitattributes b/tutorials/hello-magic/.gitattributes new file mode 100644 index 0000000000..07fe41c52c --- /dev/null +++ b/tutorials/hello-magic/.gitattributes @@ -0,0 +1,2 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/tutorials/hello-magic/.gitignore b/tutorials/hello-magic/.gitignore new file mode 100644 index 0000000000..bd58f98a84 --- /dev/null +++ b/tutorials/hello-magic/.gitignore @@ -0,0 +1,5 @@ +# pixi environments +.pixi +*.egg-info +# magic environments +.magic diff --git a/tutorials/hello-magic/hello.mojo b/tutorials/hello-magic/hello.mojo new file mode 100644 index 0000000000..7630652a0d --- /dev/null +++ b/tutorials/hello-magic/hello.mojo @@ -0,0 +1,16 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + + +def main(): + print("hello, magic!") diff --git a/tutorials/hello-magic/local/.gitattributes b/tutorials/hello-magic/local/.gitattributes new file mode 100644 index 0000000000..07fe41c52c --- /dev/null +++ b/tutorials/hello-magic/local/.gitattributes @@ -0,0 +1,2 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/tutorials/hello-magic/local/.gitignore b/tutorials/hello-magic/local/.gitignore new file mode 100644 index 0000000000..bd58f98a84 --- /dev/null +++ b/tutorials/hello-magic/local/.gitignore @@ -0,0 +1,5 @@ +# pixi environments +.pixi +*.egg-info +# magic environments +.magic diff --git a/tutorials/hello-magic/local/__init__.mojo b/tutorials/hello-magic/local/__init__.mojo new file mode 100644 index 0000000000..ccf277134c --- /dev/null +++ b/tutorials/hello-magic/local/__init__.mojo @@ -0,0 +1,14 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from .zero import zero diff --git a/tutorials/hello-magic/local/mojoproject.toml b/tutorials/hello-magic/local/mojoproject.toml new file mode 100644 index 0000000000..27267f0813 --- /dev/null +++ b/tutorials/hello-magic/local/mojoproject.toml @@ -0,0 +1,13 @@ +[project] +platforms = ["osx-arm64", "linux-64"] +version = "0.0.0" +authors = ["Modular "] +channels = ["pytorch", "conda-forge", "https://conda.modular.com/max-nightly/"] +description = "Add a short description here" +name = "local" + +[tasks] + +[dependencies] +max = ">=24.4.0,<25" +pytorch = ">=2.5.1,<3" diff --git a/tutorials/hello-magic/local/zero.mojo b/tutorials/hello-magic/local/zero.mojo new file mode 100644 index 0000000000..83cbaecd3c --- /dev/null +++ b/tutorials/hello-magic/local/zero.mojo @@ -0,0 +1,23 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from python import Python, PythonObject + + +def zero() -> PythonObject: + torch = Python.import_module("torch") + return torch.zeros(1) + + +def main(): + print(zero()) diff --git a/tutorials/hello-magic/main.py b/tutorials/hello-magic/main.py new file mode 100644 index 0000000000..d6f77a6dbe --- /dev/null +++ b/tutorials/hello-magic/main.py @@ -0,0 +1,47 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import subprocess + +from fastapi import FastAPI, HTTPException + +app = FastAPI() + + +@app.get("/") +def root(): + return {"message": "Hello, magic!"} + + +@app.get("/zero") +def zero(): + try: + p = subprocess.Popen( + ["magic", "run", "mojo", "local/zero.mojo"], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + while True: + output = p.stdout.readline() + if output == "" and p.poll() is not None: + raise HTTPException( + status_code=500, detail="Failed to produce zero" + ) + + return {"message": f"answer is {output}"} + + except subprocess.SubprocessError: + raise HTTPException( + status_code=500, detail="Failed to execute subprocess" + ) diff --git a/tutorials/hello-magic/mojoproject.toml b/tutorials/hello-magic/mojoproject.toml new file mode 100644 index 0000000000..201ce3b96e --- /dev/null +++ b/tutorials/hello-magic/mojoproject.toml @@ -0,0 +1,30 @@ +[project] +authors = ["Modular "] +channels = ["pytorch", "conda-forge", "https://conda.modular.com/max-nightly/"] +description = "Add a short description here" +name = "hello-magic" +platforms = ["osx-arm64", "linux-64"] +version = "0.1.0" + +[tasks] +hello = "mojo hello.mojo" +dev-server = "fastapi dev main.py" +format = "mojo format ." + +[dependencies] +max = ">=24.4.0,<25" +python = ">=3.8,<3.12" +pytorch = ">=2.5.1,<3" + +[pypi-dependencies] +fastapi = ">=0.115.0" + +[feature.test.tasks] +test = "pytest" + +[feature.test.pypi-dependencies] +pytest = ">=8.3.2, <9" + +[environments] +default = { solve-group = "default" } +test = { features = ["test"], solve-group = "default" } diff --git a/tutorials/helm/max-openai-api/.helmignore b/tutorials/helm/max-openai-api/.helmignore new file mode 100644 index 0000000000..7c4ce2fca1 --- /dev/null +++ b/tutorials/helm/max-openai-api/.helmignore @@ -0,0 +1,19 @@ +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +bin \ No newline at end of file diff --git a/tutorials/helm/max-openai-api/Chart.yaml b/tutorials/helm/max-openai-api/Chart.yaml new file mode 100644 index 0000000000..c930088dd6 --- /dev/null +++ b/tutorials/helm/max-openai-api/Chart.yaml @@ -0,0 +1,28 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +git apiVersion: v2 +appVersion: "0.1.0" +description: The MAX platform unifies the leading AI development frameworks (TensorFlow, PyTorch, ONNX) and hardware backends in order to simplify deployment for AI production teams and accelerate innovation for AI developers. +name: max-openai-api-chart +home: https://www.modular.com/ +keywords: + - machine learning + - inference +sources: + - https://github.com/modular/max +maintainers: + - name: Modular team + email: max-feedback@modular.com + url: https://github.com/modular/max +version: 0.1.0 diff --git a/tutorials/helm/max-openai-api/README.md b/tutorials/helm/max-openai-api/README.md new file mode 100644 index 0000000000..5af9a9380c --- /dev/null +++ b/tutorials/helm/max-openai-api/README.md @@ -0,0 +1,193 @@ + + + +# MAX OpenAI API Helm chart + +The MAX platform unifies the leading AI development frameworks (TensorFlow, PyTorch, ONNX) and hardware backends in order to simplify deployment for AI production teams and accelerate innovation for AI developers. + +**Homepage:** + +## Source Code + +* + +## Usage + +### Installing the chart + +To install this chart using Helm 3, run the following command: + +```console +helm install max-openai-api oci://registry-1.docker.io/modular/max-openai-api-chart \ + --version \ + --set huggingfaceRepoId= + --set maxServe.maxLength=512 \ + --set maxServe.maxBatchSize=16 \ + --set envSecret.HF_TOKEN= \ + --set env.HF_HUB_ENABLE_HF_TRANSFER=1 \ + --wait +``` + +The command deploys MAX OpenAI API on the Kubernetes cluster in the default configuration. The Values reference section below lists the parameters that can be configured during installation. + +### Upgrading the chart + +To upgrade the chart with the release name `max-openai-api`: + +```console +helm upgrade max-openai-api oci://registry-1.docker.io/modular/max-openai-api-chart +``` + +### Uninstalling the chart + +To uninstall/delete the `max-openai-api` deployment: + +```console +helm delete max-openai-api +``` + +### End-to-end example that provisions an K8s cluster and installs MAX OpenAI API + +To provision a k8s cluster via `eksctl` and then install MAX OpenAI API, run the following commands: + +```console +# provision a k8s cluster (takes 10-15 minutes) +eksctl create cluster \ + --name max-openai-api-demo \ + --region us-east-1 \ + --node-type g5.4xlarge \ + --nodes 1 + +# create a k8s namespace +kubectl create namespace max-openai-api-demo + +# deploy MAX OpenAI API via helm chart (takes 10 minutes) +helm install max-openai-api oci://registry-1.docker.io/modular/max-openai-api-chart \ + --version \ + --namespace max-openai-api-demo \ + --set huggingfaceRepoId=modularai/Llama-3.1-8B-Instruct-GGUF + --set maxServe.maxLength=512 \ + --set maxServe.maxBatchSize=16 \ + --set envSecret.HF_TOKEN= \ + --set env.HF_HUB_ENABLE_HF_TRANSFER=1 \ + --timeout 10m0s \ + --wait + +# forward the remote k8s port to the local network to access the service locally +# the command is blocking and takes the terminal +# user another terminal for subsequent curl and ctrl-c to stop the port forwarding +POD_NAME=$(kubectl get pods --namespace max-openai-api-demo -l "app.kubernetes.io/name=max-openai-api-chart,app.kubernetes.io/instance=max-openai-api" -o jsonpath="{.items[0].metadata.name}") +CONTAINER_PORT=$(kubectl get pod --namespace max-openai-api-demo $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") +kubectl port-forward $POD_NAME 8000:$CONTAINER_PORT --namespace max-openai-api-demo & + +# test the service +curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "modularai/Llama-3.1-8B-Instruct-GGUF", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"} + ] + }' + +# uninstall MAX OpenAI API +helm uninstall max-openai-api --namespace max-openai-api-demo + +# Delete the namespace +kubectl delete namespace max-openai-api-demo + +# delete the k8s cluster +eksctl delete cluster \ + --name max-openai-api-demo \ + --region us-east-1 +``` + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | Affinity to be added to all deployments | +| env | object | `{}` | Environment variables that will be passed into pods | +| envFromSecret | string | `"{{ template \"max.fullname\" . }}-env"` | The name of the secret which we will use to populate env vars in deployed pods This can be useful for secret keys, etc. | +| envFromSecrets | list | `[]` | This can be a list of templated strings | +| envRaw | list | `[]` | Environment variables in RAW format that will be passed into pods | +| envSecret | object | `{}` | Environment variables to pass as secrets | +| fullnameOverride | string | `nil` | Provide a name to override the full names of resources | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"modular/max-openai-api"` | | +| image.tag | string | `"latest"` | | +| imagePullSecrets | list | `[]` | | +| inferenceServer.affinity | object | `{}` | Affinity to be added to inferenceServer deployment | +| inferenceServer.args | list | See `values.yaml` | Arguments to pass to the node entrypoint. If defined it overwrites the default args value set by .Values.max-serve | +| inferenceServer.autoscaling.enabled | bool | `false` | | +| inferenceServer.autoscaling.maxReplicas | int | `2` | | +| inferenceServer.autoscaling.minReplicas | int | `1` | | +| inferenceServer.autoscaling.targetCPUUtilizationPercentage | int | `80` | | +| inferenceServer.containerSecurityContext | object | `{}` | | +| inferenceServer.deploymentAnnotations | object | `{}` | Annotations to be added to inferenceServer deployment | +| inferenceServer.deploymentLabels | object | `{}` | Labels to be added to inferenceServer deployment | +| inferenceServer.env | object | `{}` | | +| inferenceServer.extraContainers | list | `[]` | Launch additional containers into inferenceServer pod | +| inferenceServer.livenessProbe.failureThreshold | int | `3` | | +| inferenceServer.livenessProbe.httpGet.path | string | `"/v1/health"` | | +| inferenceServer.livenessProbe.httpGet.port | string | `"http"` | | +| inferenceServer.livenessProbe.initialDelaySeconds | int | `1` | | +| inferenceServer.livenessProbe.periodSeconds | int | `15` | | +| inferenceServer.livenessProbe.successThreshold | int | `1` | | +| inferenceServer.livenessProbe.timeoutSeconds | int | `1` | | +| inferenceServer.nodeSelector | object | `{}` | NodeSelector to be added to inferenceServer deployment | +| inferenceServer.podAnnotations | object | `{}` | Annotations to be added to inferenceServer pods | +| inferenceServer.podLabels | object | `{}` | Labels to be added to inferenceServer pods | +| inferenceServer.podSecurityContext | object | `{}` | | +| inferenceServer.readinessProbe.failureThreshold | int | `3` | | +| inferenceServer.readinessProbe.httpGet.path | string | `"/v1/health"` | | +| inferenceServer.readinessProbe.httpGet.port | string | `"http"` | | +| inferenceServer.readinessProbe.initialDelaySeconds | int | `1` | | +| inferenceServer.readinessProbe.periodSeconds | int | `15` | | +| inferenceServer.readinessProbe.successThreshold | int | `1` | | +| inferenceServer.readinessProbe.timeoutSeconds | int | `1` | | +| inferenceServer.replicaCount | int | `1` | | +| inferenceServer.resources | object | `{}` | Resource settings for the inferenceServer pods - these settings overwrite existing values from the global resources object defined above. | +| inferenceServer.startupProbe.failureThreshold | int | `60` | | +| inferenceServer.startupProbe.httpGet.path | string | `"/v1/health"` | | +| inferenceServer.startupProbe.httpGet.port | string | `"http"` | | +| inferenceServer.startupProbe.initialDelaySeconds | int | `1` | | +| inferenceServer.startupProbe.periodSeconds | int | `5` | | +| inferenceServer.startupProbe.successThreshold | int | `1` | | +| inferenceServer.startupProbe.timeoutSeconds | int | `1` | | +| inferenceServer.strategy | object | `{}` | | +| inferenceServer.tolerations | list | `[]` | Tolerations to be added to inferenceServer deployment | +| inferenceServer.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to inferenceServer deployments | +| inferenceServer.volumeMounts | list | `[]` | Volumes to mount into inferenceServer pod | +| inferenceServer.volumes | list | `[]` | Volumes to mount into inferenceServer pod | +| ingress.annotations | object | `{}` | | +| ingress.enabled | bool | `false` | | +| ingress.extraHostsRaw | list | `[]` | | +| ingress.hosts | list | `[]` | | +| ingress.ingressClassName | string | `nil` | | +| ingress.path | string | `"/"` | | +| ingress.pathType | string | `"ImplementationSpecific"` | | +| ingress.tls | list | `[]` | | +| maxServe | object | `{"cacheStrategy":"continuous","huggingfaceRepoId":"modularai/Llama-3.1-8B-Instruct-GGUF","maxBatchSize":"250","maxLength":"2048","maxNumSteps":"10"}` | MAX Serve arguments | +| nameOverride | string | `nil` | Provide a name to override the name of the chart | +| nodeSelector | object | `{}` | NodeSelector to be added to all deployments | +| resources | object | `{}` | | +| runAsUser | int | `0` | User ID directive. This user must have enough permissions to run the bootstrap script Running containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure | +| service.annotations | object | `{}` | | +| service.loadBalancerIP | string | `nil` | | +| service.ports[0].name | string | `"http"` | | +| service.ports[0].port | int | `8000` | | +| service.ports[0].protocol | string | `"TCP"` | | +| service.ports[0].targetPort | int | `8000` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.create | bool | `false` | Create custom service account for MAX Serving. If create: true and serviceAccountName is not provided, `max.fullname` will be used. | +| serviceAccountName | string | `nil` | Specify service account name to be used | +| tolerations | list | `[]` | Tolerations to be added to all deployments | +| topologySpreadConstraints | list | `[]` | TopologySpreadConstraints to be added to all deployments | +| volumeMounts | list | `[]` | | +| volumes | list | `[]` | | diff --git a/tutorials/helm/max-openai-api/README.md.gotmpl b/tutorials/helm/max-openai-api/README.md.gotmpl new file mode 100644 index 0000000000..f64ee8a86c --- /dev/null +++ b/tutorials/helm/max-openai-api/README.md.gotmpl @@ -0,0 +1,112 @@ + + + +# MAX OpenAI API Helm chart + +{{ template "chart.deprecationWarning" . }} + +{{ template "chart.description" . }} + +{{ template "chart.homepageLine" . }} + +{{ template "chart.sourcesSection" . }} + +## Usage + +### Installing the chart + +To install this chart using Helm 3, run the following command: + +```console +helm install max-openai-api oci://registry-1.docker.io/modular/max-openai-api-chart \ + --version \ + --set huggingfaceRepoId= + --set maxServe.maxLength=512 \ + --set maxServe.maxBatchSize=16 \ + --set envSecret.HF_TOKEN= \ + --set env.HF_HUB_ENABLE_HF_TRANSFER=1 \ + --wait +``` + +The command deploys MAX OpenAI API on the Kubernetes cluster in the default configuration. The Values reference section below lists the parameters that can be configured during installation. + +### Upgrading the chart + +To upgrade the chart with the release name `max-openai-api`: + +```console +helm upgrade max-openai-api oci://registry-1.docker.io/modular/max-openai-api-chart +``` + +### Uninstalling the chart + +To uninstall/delete the `max-openai-api` deployment: + +```console +helm delete max-openai-api +``` + +### End-to-end example that provisions an K8s cluster and installs MAX OpenAI API + +To provision a k8s cluster via `eksctl` and then install MAX OpenAI API, run the following commands: + +```console +# provision a k8s cluster (takes 10-15 minutes) +eksctl create cluster \ + --name max-openai-api-demo \ + --region us-east-1 \ + --node-type g5.4xlarge \ + --nodes 1 + +# create a k8s namespace +kubectl create namespace max-openai-api-demo + +# deploy MAX OpenAI API via helm chart (takes 10 minutes) +helm install max-openai-api oci://registry-1.docker.io/modular/max-openai-api-chart \ + --version \ + --namespace max-openai-api-demo \ + --set huggingfaceRepoId=modularai/Llama-3.1-8B-Instruct-GGUF + --set maxServe.maxLength=512 \ + --set maxServe.maxBatchSize=16 \ + --set envSecret.HF_TOKEN= \ + --set env.HF_HUB_ENABLE_HF_TRANSFER=1 \ + --timeout 10m0s \ + --wait + +# forward the remote k8s port to the local network to access the service locally +# the command is blocking and takes the terminal +# user another terminal for subsequent curl and ctrl-c to stop the port forwarding +POD_NAME=$(kubectl get pods --namespace max-openai-api-demo -l "app.kubernetes.io/name=max-openai-api-chart,app.kubernetes.io/instance=max-openai-api" -o jsonpath="{.items[0].metadata.name}") +CONTAINER_PORT=$(kubectl get pod --namespace max-openai-api-demo $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") +kubectl port-forward $POD_NAME 8000:$CONTAINER_PORT --namespace max-openai-api-demo & + +# test the service +curl -N http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "modularai/Llama-3.1-8B-Instruct-GGUF", + "stream": true, + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"} + ] + }' + +# uninstall MAX OpenAI API +helm uninstall max-openai-api --namespace max-openai-api-demo + +# Delete the namespace +kubectl delete namespace max-openai-api-demo + +# delete the k8s cluster +eksctl delete cluster \ + --name max-openai-api-demo \ + --region us-east-1 +``` + + +{{ template "chart.requirementsSection" . }} + +{{ template "chart.valuesSection" . }} diff --git a/tutorials/helm/max-openai-api/templates/NOTES.txt b/tutorials/helm/max-openai-api/templates/NOTES.txt new file mode 100644 index 0000000000..b6ed1cdc8d --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} + {{- range .Values.ingress.hosts }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} + {{- end }} +{{- else if contains "NodePort" .Values.service.type }} + NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "max.fullname" . }}) + NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get svc -w {{ template "max.fullname" . }}' + SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "max.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ template "max.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "The application is available at the following DNS name from within your cluster:" + echo "{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local:$CONTAINER_PORT" + echo "Or use the following command to forward ports and visit it locally at http://127.0.0.1:8000" + echo "kubectl port-forward $POD_NAME 8000:$CONTAINER_PORT --namespace {{ .Release.Namespace }}" +{{- end }} diff --git a/tutorials/helm/max-openai-api/templates/_helpers.tpl b/tutorials/helm/max-openai-api/templates/_helpers.tpl new file mode 100644 index 0000000000..47a043060a --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/_helpers.tpl @@ -0,0 +1,43 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "max.name" -}} + {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "max.fullname" -}} + {{- if .Values.fullnameOverride -}} + {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} + {{- else -}} + {{- $name := default .Chart.Name .Values.nameOverride -}} + {{- if contains $name .Release.Name -}} + {{- .Release.Name | trunc 63 | trimSuffix "-" -}} + {{- else -}} + {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "max.serviceAccountName" -}} + {{- if .Values.serviceAccount.create -}} + {{- default (include "max.fullname" .) .Values.serviceAccountName -}} + {{- else -}} + {{- default "default" .Values.serviceAccountName -}} + {{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "max.chart" -}} + {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/tutorials/helm/max-openai-api/templates/deployment.yaml b/tutorials/helm/max-openai-api/templates/deployment.yaml new file mode 100644 index 0000000000..9ce59c5c55 --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/deployment.yaml @@ -0,0 +1,181 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "max.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + helm.sh/chart: {{ template "max.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + {{- if .Values.inferenceServer.deploymentLabels }} + {{- toYaml .Values.inferenceServer.deploymentLabels | nindent 4 }} + {{- end }} + {{- if .Values.inferenceServer.deploymentAnnotations }} + annotations: {{- toYaml .Values.inferenceServer.deploymentAnnotations | nindent 4 }} + {{- end }} +spec: + {{- if not .Values.inferenceServer.autoscaling.enabled }} + replicas: {{ .Values.inferenceServer.replicaCount }} + {{- end }} + {{- if .Values.inferenceServer.strategy }} + strategy: {{- toYaml .Values.inferenceServer.strategy | nindent 4 }} + {{- end }} + selector: + matchLabels: + app.kubernetes.io/name: {{ template "max.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + annotations: + # Force reload on changes + checksum/envSecret: {{ .Values.envSecret | toYaml | sha256sum }} + {{- if .Values.inferenceServer.podAnnotations }} + {{- toYaml .Values.inferenceServer.podAnnotations | nindent 8 }} + {{- end }} + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + {{- if .Values.inferenceServer.podLabels }} + {{- toYaml .Values.inferenceServer.podLabels | nindent 8 }} + {{- end }} + spec: + {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} + serviceAccountName: {{ template "max.serviceAccountName" . }} + {{- end }} + securityContext: + runAsUser: {{ .Values.runAsUser }} + {{- if .Values.inferenceServer.podSecurityContext }} + {{- toYaml .Values.inferenceServer.podSecurityContext | nindent 8 }} + {{- end }} + {{- if .Values.inferenceServer.initContainers }} + initContainers: {{- tpl (toYaml .Values.inferenceServer.initContainers) . | nindent 6 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.inferenceServer.containerSecurityContext }} + securityContext: {{- toYaml .Values.inferenceServer.containerSecurityContext | nindent 12 }} + {{- end }} + {{- if .Values.inferenceServer.args }} + args: {{- toYaml .Values.inferenceServer.args | nindent 12 }} + {{- else }} + args: [ + "--model-path={{ .Values.maxServe.huggingfaceRepoId }}", + "--max-length={{ .Values.maxServe.maxLength }}", + "--max-batch-size={{ .Values.maxServe.maxBatchSize }}", + "--cache-strategy={{ .Values.maxServe.cacheStrategy }}", + "--max-num-steps={{ .Values.maxServe.maxNumSteps }}"] + {{- end }} + env: + {{- range $key, $value := .Values.env }} + - name: {{ $key | quote}} + value: {{ $value | quote }} + {{- end }} + {{- range $key, $value := .Values.inferenceServer.env }} + - name: {{ $key | quote}} + value: {{ $value | quote }} + {{- end }} + {{- if .Values.envRaw }} + {{- toYaml .Values.envRaw | nindent 12 }} + {{- end }} + envFrom: + - secretRef: + name: {{ tpl .Values.envFromSecret . | quote }} + {{- range .Values.envFromSecrets }} + - secretRef: + name: {{ tpl . $ | quote }} + {{- end }} + {{- if or .Values.volumeMounts .Values.inferenceServer.volumeMounts }} + volumeMounts: + {{- with .Values.volumeMounts }} + {{- tpl (toYaml .) $ | nindent 12 -}} + {{- end }} + {{- with .Values.inferenceServer.volumeMounts }} + {{- tpl (toYaml .) $ | nindent 12 -}} + {{- end }} + {{- end }} + ports: + {{- range .Values.service.ports }} + - name: {{ .name }} + containerPort: {{ .targetPort }} + {{- end }} + {{- if .Values.inferenceServer.startupProbe }} + startupProbe: {{- .Values.inferenceServer.startupProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.inferenceServer.readinessProbe }} + readinessProbe: {{- .Values.inferenceServer.readinessProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.inferenceServer.livenessProbe }} + livenessProbe: {{- .Values.inferenceServer.livenessProbe | toYaml | nindent 12 }} + {{- end }} + resources: + {{- if .Values.inferenceServer.resources }} + {{- toYaml .Values.inferenceServer.resources | nindent 12 }} + {{- else }} + {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + {{- if .Values.inferenceServer.extraContainers }} + {{- toYaml .Values.inferenceServer.extraContainers | nindent 8 }} + {{- end }} + {{- if or .Values.nodeSelector .Values.inferenceServer.nodeSelector }} + nodeSelector: + {{- with .Values.nodeSelector }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.inferenceServer.nodeSelector }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.affinity .Values.inferenceServer.affinity }} + affinity: + {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.inferenceServer.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.topologySpreadConstraints .Values.inferenceServer.topologySpreadConstraints }} + topologySpreadConstraints: + {{- with .Values.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.inferenceServer.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.tolerations .Values.inferenceServer.tolerations }} + tolerations: + {{- with .Values.tolerations }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.inferenceServer.tolerations }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + {{- if or .Values.volumes .Values.inferenceServer.volumes }} + volumes: + {{- with .Values.volumes }} + {{- tpl (toYaml .) $ | nindent 8 -}} + {{- end }} + {{- with .Values.inferenceServer.volumes }} + {{- tpl (toYaml .) $ | nindent 8 -}} + {{- end }} + {{- end }} diff --git a/tutorials/helm/max-openai-api/templates/hpa.yaml b/tutorials/helm/max-openai-api/templates/hpa.yaml new file mode 100644 index 0000000000..ab5626d79a --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/hpa.yaml @@ -0,0 +1,47 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## +{{- if .Values.inferenceServer.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "max.fullname" . }}-hpa + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + helm.sh/chart: {{ template "max.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "max.fullname" . }} + minReplicas: {{ .Values.inferenceServer.autoscaling.minReplicas }} + maxReplicas: {{ .Values.inferenceServer.autoscaling.maxReplicas }} + metrics: + {{- if .Values.inferenceServer.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.inferenceServer.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.inferenceServer.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.inferenceServer.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/tutorials/helm/max-openai-api/templates/ingress.yaml b/tutorials/helm/max-openai-api/templates/ingress.yaml new file mode 100644 index 0000000000..e02fc3f027 --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/ingress.yaml @@ -0,0 +1,57 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## +{{ if .Values.ingress.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ template "max.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + helm.sh/chart: {{ template "max.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + {{- with .Values.ingress.annotations }} + annotations: {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.ingressClassName }} + ingressClassName: {{ .Values.ingress.ingressClassName }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ . }} + http: + paths: + - path: {{ $.Values.ingress.path }} + pathType: {{ $.Values.ingress.pathType }} + backend: + service: + name: {{ template "max.fullname" . }} + port: + name: http + {{- end }} + {{- if .Values.ingress.extraHostsRaw }} + {{- toYaml .Values.ingress.extraHostsRaw | nindent 4 }} + {{- end }} +{{- end }} diff --git a/tutorials/helm/max-openai-api/templates/secret-env.yaml b/tutorials/helm/max-openai-api/templates/secret-env.yaml new file mode 100644 index 0000000000..1f4649686e --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/secret-env.yaml @@ -0,0 +1,29 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "max.fullname" . }}-env + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + helm.sh/chart: {{ template "max.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} +type: Opaque +stringData: + {{- if .Values.envSecret }} + {{- range $key, $value := .Values.envSecret }} + {{ $key }}: {{ $value | quote }} + {{- end }} + {{- end }} diff --git a/tutorials/helm/max-openai-api/templates/service.yaml b/tutorials/helm/max-openai-api/templates/service.yaml new file mode 100644 index 0000000000..3f7d148592 --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/service.yaml @@ -0,0 +1,34 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "max.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + helm.sh/chart: {{ template "max.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + {{- with .Values.service.annotations }} + annotations: {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + ports: {{- .Values.service.ports | toYaml | nindent 2 }} + selector: + app.kubernetes.io/name: {{ template "max.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + {{- if .Values.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.service.loadBalancerIP }} + {{- end }} diff --git a/tutorials/helm/max-openai-api/templates/serviceaccount.yaml b/tutorials/helm/max-openai-api/templates/serviceaccount.yaml new file mode 100644 index 0000000000..f1aee92905 --- /dev/null +++ b/tutorials/helm/max-openai-api/templates/serviceaccount.yaml @@ -0,0 +1,28 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "max.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ template "max.name" . }} + helm.sh/chart: {{ template "max.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + {{- if .Values.serviceAccount.annotations }} + annotations: {{- toYaml .Values.serviceAccount.annotations | nindent 4 }} + {{- end }} +{{- end -}} diff --git a/tutorials/helm/max-openai-api/values.yaml b/tutorials/helm/max-openai-api/values.yaml new file mode 100644 index 0000000000..d87d815cfe --- /dev/null +++ b/tutorials/helm/max-openai-api/values.yaml @@ -0,0 +1,239 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +# Default values for the MAX Serving Helm chart. + +# A README is automatically generated from this file to document it, using helm-docs (see https://github.com/norwoodj/helm-docs) +# To update it, install helm-docs and run helm-docs from the root of this chart + +# -- Provide a name to override the name of the chart +nameOverride: ~ +# -- Provide a name to override the full names of resources +fullnameOverride: ~ + +# -- User ID directive. This user must have enough permissions to run the bootstrap script +# Running containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure +runAsUser: 0 + +# -- Specify service account name to be used +serviceAccountName: ~ +serviceAccount: + # -- Create custom service account for MAX Serving. If create: true and serviceAccountName is not provided, `max.fullname` will be used. + create: false + annotations: {} + +# -- Environment variables that will be passed into pods +env: {} + +# -- Environment variables in RAW format that will be passed into pods +envRaw: [] + +# -- The name of the secret which we will use to populate env vars in deployed pods +# This can be useful for secret keys, etc. +envFromSecret: '{{ template "max.fullname" . }}-env' +# -- This can be a list of templated strings +envFromSecrets: [] + +# -- Environment variables to pass as secrets +envSecret: + {} + # # AWS security credentials: https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html + # AWS_ACCESS_KEY_ID: ... + # AWS_SECRET_ACCESS_KEY: ... + # AWS_SESSION_TOKEN: ... + # # Google API Keys + # GOOGLE_KEY: ... + # GOOGLE_SECRET: ... + +volumes: + [] + # - name: customConfig + # configMap: + # name: '{{ template "max.fullname" . }}-custom-config' + # - name: additionalSecret + # secret: + # secretName: my-secret + # defaultMode: 0600 + +volumeMounts: + [] + # - name: customConfig + # mountPath: /mnt/config + # readOnly: true + # - name: additionalSecret: + # mountPath: /mnt/secret + +image: + repository: "docker.modular.com/modular/max-openai-api" + tag: "latest" + pullPolicy: IfNotPresent + +# -- MAX Serve arguments +maxServe: + huggingfaceRepoId: modularai/Llama-3.1-8B-Instruct-GGUF + maxLength: "2048" + maxBatchSize: "250" + cacheStrategy: "continuous" + maxNumSteps: "10" + +imagePullSecrets: [] + +service: + type: ClusterIP + # you may want to have a headless service if use grpc protocol + # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services + # https://github.com/grpc/grpc/blob/57dacad8c761a12de3e5eafa45f190015c73cccb/doc/load-balancing.md + # clusterIP: None + ports: + - name: http + protocol: TCP + port: 8000 + targetPort: 8000 + annotations: + {} + # cloud.google.com/load-balancer-type: "Internal" + loadBalancerIP: ~ + +ingress: + enabled: false + ingressClassName: ~ + annotations: + {} + # kubernetes.io/tls-acme: "true" + ## Extend timeout to allow long running queries. + # nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" + # nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + # nginx.ingress.kubernetes.io/proxy-send-timeout: "300" + path: / + pathType: ImplementationSpecific + hosts: [] + tls: [] + extraHostsRaw: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: + {} + # We do not specify default resources and leave this as a conscious + # choice for the user. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # The limits below will apply to all MAX Serving components. To set individual resource limitations refer to the pod specific values below. + # The pod specific values will overwrite anything that is set here. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +# MAX Serving node configuration +inferenceServer: + replicaCount: 1 + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 2 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + + # -- Arguments to pass to the node entrypoint. If defined it overwrites the default args value set by .Values.max-serve + # @default -- See `values.yaml` + args: [] + # - "--model-path=modularai/Llama-3.1-8B-Instruct-GGUF", + # - "--max-length=2048", + # - "--max-batch-size=250", + # - "--cache-strategy=continuous", + # - "--max-num-steps=10", + + env: {} + # Limit number of CPUs that MAX Serving and its Inference Engine can use + # MODULAR_AsyncRT_CPU_MAX: 16 + # -- Volumes to mount into inferenceServer pod + volumes: [] + # -- Volumes to mount into inferenceServer pod + volumeMounts: [] + # -- Launch additional containers into inferenceServer pod + extraContainers: [] + # -- Annotations to be added to inferenceServer deployment + deploymentAnnotations: {} + # -- Labels to be added to inferenceServer deployment + deploymentLabels: {} + # -- NodeSelector to be added to inferenceServer deployment + nodeSelector: {} + # -- Tolerations to be added to inferenceServer deployment + tolerations: [] + # -- Affinity to be added to inferenceServer deployment + affinity: {} + # -- TopologySpreadConstrains to be added to inferenceServer deployments + topologySpreadConstraints: [] + # -- Annotations to be added to inferenceServer pods + podAnnotations: {} + # -- Labels to be added to inferenceServer pods + podLabels: {} + startupProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: 1 + timeoutSeconds: 1 + failureThreshold: 60 + periodSeconds: 5 + successThreshold: 1 + livenessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: 1 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 15 + successThreshold: 1 + readinessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: 1 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 15 + successThreshold: 1 + # -- Resource settings for the inferenceServer pods - these settings overwrite existing values from the global resources object defined above. + resources: + {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + podSecurityContext: {} + containerSecurityContext: {} + strategy: + {} + # type: RollingUpdate + # rollingUpdate: + # maxSurge: 25% + # maxUnavailable: 25% + +# -- NodeSelector to be added to all deployments +nodeSelector: {} + +# -- Tolerations to be added to all deployments +tolerations: [] + +# -- Affinity to be added to all deployments +affinity: {} + +# -- TopologySpreadConstraints to be added to all deployments +topologySpreadConstraints: [] diff --git a/tutorials/max-graph-api/.gitattributes b/tutorials/max-graph-api/.gitattributes new file mode 100644 index 0000000000..07fe41c52c --- /dev/null +++ b/tutorials/max-graph-api/.gitattributes @@ -0,0 +1,2 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/tutorials/max-graph-api/.gitignore b/tutorials/max-graph-api/.gitignore new file mode 100644 index 0000000000..1ef4bed3a8 --- /dev/null +++ b/tutorials/max-graph-api/.gitignore @@ -0,0 +1,7 @@ +# pixi environments +.pixi +*.egg-info +# magic environments +.magic +# MNIST data +data diff --git a/tutorials/max-graph-api/README.md b/tutorials/max-graph-api/README.md new file mode 100644 index 0000000000..a96f37787e --- /dev/null +++ b/tutorials/max-graph-api/README.md @@ -0,0 +1,7 @@ +# Tutorial: MAX Graph API + +This repository contains the code for +[Get started with MAX Graph](https://docs.modular.com/max/tutorials/get-started-with-max-graph) +tutorial. + +Please refer to that page for more information. diff --git a/tutorials/max-graph-api/add.mojo b/tutorials/max-graph-api/add.mojo new file mode 100644 index 0000000000..ffedee6d3d --- /dev/null +++ b/tutorials/max-graph-api/add.mojo @@ -0,0 +1,44 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from max import engine +from max.graph import Graph, TensorType, Type +from max.tensor import Tensor + + +def main(): + # 1. define add graph + graph = Graph( + in_types=List[Type]( + TensorType(DType.float32, 1), TensorType(DType.float32, 1) + ) + ) + out = graph[0] + graph[1] + graph.output(out) + graph.verify() + print("finall graph:", graph) + # 2. load and compile the graph + session = engine.InferenceSession() + model = session.load(graph) + print("input names are:") + for input_name in model.get_model_input_names(): + print(input_name[]) + + # 3. Execute / run the graph with some inputs + print("set some input values:") + input0 = Tensor[DType.float32](List[Float32](1.0)) + print("input0:", input0) + input1 = Tensor[DType.float32](List[Float32](1.0)) + print("input1:", input1) + ret = model.execute("input0", input0^, "input1", input1^) + print("result:", ret.get[DType.float32]("output0")) diff --git a/tutorials/max-graph-api/add.png b/tutorials/max-graph-api/add.png new file mode 100644 index 0000000000000000000000000000000000000000..46a8ad114c6a98a368acca0f3483b548d4073f9e GIT binary patch literal 16220 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 u0lQ#-w5raRX@JeLlbO7||5Cv%{&= PythonObject: + np = py.import_module("numpy") + fin = py.evaluate('open("model_weights.npy", mode="rb")') + model_weights = np.load( + fin, allow_pickle=True + ).item() # note this is of type PythonObject + fin.close() + print("python type of model_weights:", py.type(model_weights)) + for item in model_weights.items(): + print(item[0], item[1].shape, py.type(item[1])) + + return model_weights + + +@always_inline +fn numpy_data_pointer[ + type: DType +](numpy_array: PythonObject) raises -> UnsafePointer[Scalar[type]]: + return numpy_array.__array_interface__["data"][0].unsafe_get_as_pointer[ + type + ]() + + +@always_inline +fn memcpy_from_numpy(array: PythonObject, tensor: Tensor) raises: + src = numpy_data_pointer[tensor.type](array) + dst = tensor._ptr + length = tensor.num_elements() + memcpy(dst, src, length) + + +@always_inline +fn numpy_to_tensor[type: DType](array: PythonObject) raises -> Tensor[type]: + shape = List[Int]() + array_shape = array.shape + for dim in array_shape: + shape.append(dim) + + out = Tensor[type](shape) + memcpy_from_numpy(array, out) + return out^ + + +def build_mnist_graph( + fc1w: Tensor[DType.float32], + fc1b: Tensor[DType.float32], + fc2w: Tensor[DType.float32], + fc2b: Tensor[DType.float32], +) -> Graph: + # Note: "batch" is a symbolic dim which is known ahead of time vs dynamic dim + graph = Graph(TensorType(DType.float32, "batch", 28 * 28)) + # PyTorch linear is defined as: x W^T + b so we need to transpose the weights + fc1 = ( + graph[0] @ ops.transpose(graph.constant(fc1w), 1, 0) + ) + graph.constant(fc1b) + + relu = ops.relu(fc1) + + fc2 = (relu @ ops.transpose(graph.constant(fc2w), 1, 0)) + graph.constant( + fc2b + ) + out = ops.softmax(fc2) # adding explicit softmax for inference prob + graph.output(out) + graph.verify() + return graph + + +def load_mnist_test_data() -> PythonObject: + torchvision = py.import_module("torchvision") + test_dataset = torchvision.datasets.MNIST( + root="./data", train=False, transform=None, download=False + ) + return test_dataset + + +def preprocess(image: PythonObject) -> PythonObject: + transforms = py.import_module("torchvision.transforms") + image_tensor = transforms.ToTensor()(image) + image_tensor_normalized = transforms.Normalize((0.5,), (0.5,))(image_tensor) + reshaped_image = image_tensor_normalized.reshape(1, 28 * 28).numpy() + return reshaped_image + + +def argmax(t: Tensor) -> List[Int]: + var res = List[Int](capacity=t.dim(0)) + for i in range(t.dim(0)): + var max_val = Scalar[t.type].MIN + var max_idx = 0 + for j in range(t.dim(1)): + if t[i, j] > max_val: + max_val = t[i, j] + max_idx = j + res.append(max_idx) + return res + + +def main(): + weights_dict = load_model_weights() + fc1w = numpy_to_tensor[DType.float32](weights_dict["fc1.weight"]) + fc1b = numpy_to_tensor[DType.float32](weights_dict["fc1.bias"]) + fc2w = numpy_to_tensor[DType.float32](weights_dict["fc2.weight"]) + fc2b = numpy_to_tensor[DType.float32](weights_dict["fc2.bias"]) + + mnist_graph = build_mnist_graph(fc1w^, fc1b^, fc2w^, fc2b^) + session = engine.InferenceSession() + model = session.load(mnist_graph) + + for name in model.get_model_input_names(): + print("input:", name[]) + + for name in model.get_model_output_names(): + print("output:", name[]) + + correct = 0 + total = 0 + # use batch size of 1 in this example + test_dataset = load_mnist_test_data() + for i in range(len(test_dataset)): + item = test_dataset[i] + image = item[0] + label = item[1] + + preprocessed_image = preprocess(image) + + output = model.execute("input0", preprocessed_image) + probs = output.get[DType.float32]("output0") + + predicted = argmax(probs)[0] + + correct += Int(predicted == label) + total += 1 + + print( + "Accuracy of the network on the 10000 test images:", + 100 * correct / total, + "%", + ) diff --git a/tutorials/max-graph-api/mnist.png b/tutorials/max-graph-api/mnist.png new file mode 100644 index 0000000000000000000000000000000000000000..30cdec9e9678802246a03f3b12a6b597f8559f5b GIT binary patch literal 71811 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 USZ(#5HdhXwsE8P{?{sSAA5nrzTmS$7 literal 0 HcmV?d00001 diff --git a/tutorials/max-graph-api/mnist.py b/tutorials/max-graph-api/mnist.py new file mode 100644 index 0000000000..eb7f2a971e --- /dev/null +++ b/tutorials/max-graph-api/mnist.py @@ -0,0 +1,123 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import random + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import torchvision +import torchvision.transforms as transforms + + +def set_seeds(seed=42): + """Sets seed on CPU""" + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + +set_seeds() + + +class Model(nn.Module): + def __init__(self, input_size, hidden_size, num_classes): + super().__init__() + self.fc1 = nn.Linear(input_size, hidden_size) + self.relu = nn.ReLU() + self.fc2 = nn.Linear(hidden_size, num_classes) + + def forward(self, x): + x = self.fc1(x) + x = self.relu(x) + x = self.fc2(x) + return x + + +def main(): + input_size = 28 * 28 + hidden_size = 512 + num_classes = 10 + num_epochs = 5 + learning_rate = 0.001 + + preprocess = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))] + ) + + train_dataset = torchvision.datasets.MNIST( + root="./data", train=True, transform=preprocess, download=True + ) + test_dataset = torchvision.datasets.MNIST( + root="./data", train=False, transform=preprocess, download=True + ) + + train_loader = torch.utils.data.DataLoader( + dataset=train_dataset, batch_size=128, shuffle=True + ) + test_loader = torch.utils.data.DataLoader( + dataset=test_dataset, batch_size=128, shuffle=False + ) + + model = Model(input_size, hidden_size, num_classes) + + loss_fn = nn.CrossEntropyLoss() + optimizer = optim.RMSprop(model.parameters(), lr=learning_rate) + + total_steps = len(train_loader) + for epoch in range(num_epochs): + for i, (images, labels) in enumerate(train_loader): + images = images.reshape(-1, 28 * 28) + outputs = model(images) + loss = loss_fn(outputs, labels) + optimizer.zero_grad() + loss.backward() + optimizer.step() + + if (i + 1) % 100 == 0: + print( + f"Epoch [{epoch + 1}/{num_epochs}], Step" + f" [{i + 1}/{total_steps}], Loss: {loss.item():.4f}" + ) + + model.eval() + + with torch.no_grad(): + correct = 0 + total = 0 + for images, labels in test_loader: + images = images.reshape(-1, 28 * 28) + outputs = model(images) + probs = F.softmax(outputs, dim=1) + predicted = torch.argmax(probs, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + print( + "Accuracy of the network on the 10000 test images:" + f" {100 * correct / total} %" + ) + + # save weights in numpy binary format + weights = {} + for name, param in model.named_parameters(): + weights[name] = param.detach().cpu().numpy() + + np.save("model_weights.npy", weights) + return + + +if __name__ == "__main__": + main() diff --git a/tutorials/max-graph-api/mojoproject.toml b/tutorials/max-graph-api/mojoproject.toml new file mode 100644 index 0000000000..7a073dbfb4 --- /dev/null +++ b/tutorials/max-graph-api/mojoproject.toml @@ -0,0 +1,19 @@ +[project] +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/", "pytorch"] +description = "Add a short description here" +name = "max-graph-api" +platforms = ["osx-arm64", "linux-64"] +version = "0.0.0" + +[tasks] +add = "mojo add.mojo" +matmul = "mojo matmul.mojo" +mnist = "python mnist.py && mojo mnist.mojo" +test = { depends-on = ["add", "matmul", "mnist"] } + +[dependencies] +max = "~=24.6" +pytorch = { version = "==2.4.0", channel = "pytorch" } +torchvision = { version = ">=0.19.0,<0.20", channel = "pytorch" } +numpy = "<2.0" diff --git a/tutorials/max-graph-python/.mypy.ini b/tutorials/max-graph-python/.mypy.ini new file mode 100644 index 0000000000..1215375ed9 --- /dev/null +++ b/tutorials/max-graph-python/.mypy.ini @@ -0,0 +1,2 @@ +[mypy] +ignore_missing_imports = True \ No newline at end of file diff --git a/tutorials/max-graph-python/README.md b/tutorials/max-graph-python/README.md new file mode 100644 index 0000000000..4972b568c6 --- /dev/null +++ b/tutorials/max-graph-python/README.md @@ -0,0 +1,60 @@ +# Basic example for MAX Graph API in Python + +This is an example of building a model with the MAX Graph API in Python and +execute it with MAX Engine. + +## Usage + +First, install [Magic](https://docs.modular.com/magic/). + +Then run the `magic run addition` command from the terminal: + +```sh +magic run addition +``` + +You should see the following output: + +```output +input names are: +name: input0, shape: [1], dtype: DType.float32 +name: input1, shape: [1], dtype: DType.float32 +result: [2.] +``` + +## Tests + +To run tests, use the following command: + +```sh +magic run pytest +``` + +You should see the following output: + +```output +==================== test session starts ==================== +platform darwin -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0 +rootdir: /max-repo +configfile: pyproject.toml +collected 6 items + +tests/test_addition.py ...... [100%] + +===================== 6 passed in 6.94s ===================== +``` + +## Lint and format + +To lint with `mypy` run the following command: + +```sh +magic run mypy +``` + +To format the python files: + +```sh +magic run black +magic run isort +``` diff --git a/tutorials/max-graph-python/pyproject.toml b/tutorials/max-graph-python/pyproject.toml new file mode 100644 index 0000000000..c07431b62f --- /dev/null +++ b/tutorials/max-graph-python/pyproject.toml @@ -0,0 +1,33 @@ +[project] +authors = [{name = "Modular", email = "hello@modular.com"}] +dependencies = [] +description = "Add two numbers" +name = "max_ops" +requires-python = ">=3.11,<3.13" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.project] +channels = ["conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["osx-arm64", "linux-64"] + +[tool.pixi.pypi-dependencies] +max_ops = { path = ".", editable = true } + +[tool.pixi.tasks] +addition = "python3 src/max_ops/addition.py" +mypy = "mypy . --config .mypy.ini" +black = "black src/max_ops/addition.py tests/test_addition.py" +isort = "isort src/max_ops/addition.py tests/test_addition.py" +test = { depends-on = ["addition"] } + + +[tool.pixi.dependencies] +max = "~=24.6" +numpy = "<2.0" +pytest = ">=8.3.3,<9" +black = ">=24.10.0,<25" +mypy = ">=1.13.0,<2" diff --git a/tutorials/max-graph-python/src/max_ops/__init__.py b/tutorials/max-graph-python/src/max_ops/__init__.py new file mode 100644 index 0000000000..75c4f824f2 --- /dev/null +++ b/tutorials/max-graph-python/src/max_ops/__init__.py @@ -0,0 +1,12 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # diff --git a/tutorials/max-graph-python/src/max_ops/addition.py b/tutorials/max-graph-python/src/max_ops/addition.py new file mode 100644 index 0000000000..4528d4a549 --- /dev/null +++ b/tutorials/max-graph-python/src/max_ops/addition.py @@ -0,0 +1,51 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from typing import Any + +import numpy as np +from max import engine +from max.dtype import DType +from max.graph import Graph, TensorType, ops + + +def add_tensors(a: np.ndarray, b: np.ndarray) -> dict[str, Any]: + # 1. Build the graph + input_type = TensorType(dtype=DType.float32, shape=(1,)) + with Graph( + "simple_add_graph", input_types=(input_type, input_type) + ) as graph: + lhs, rhs = graph.inputs + out = ops.add(lhs, rhs) + graph.output(out) + print("final graph:", graph) + + # 2. Create an inference session + session = engine.InferenceSession() + model = session.load(graph) + + for tensor in model.input_metadata: + print( + f"name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}" + ) + + # 3. Execute the graph + ret = model.execute(a, b)[0] + print("result:", ret) + return ret + + +if __name__ == "__main__": + input0 = np.array([1.0], dtype=np.float32) + input1 = np.array([1.0], dtype=np.float32) + add_tensors(input0, input1) diff --git a/tutorials/max-graph-python/tests/__init__.py b/tutorials/max-graph-python/tests/__init__.py new file mode 100644 index 0000000000..75c4f824f2 --- /dev/null +++ b/tutorials/max-graph-python/tests/__init__.py @@ -0,0 +1,12 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # diff --git a/tutorials/max-serve-cloud-configs/aws/max-serve-aws.yaml b/tutorials/max-serve-cloud-configs/aws/max-serve-aws.yaml new file mode 100644 index 0000000000..cf63426766 --- /dev/null +++ b/tutorials/max-serve-cloud-configs/aws/max-serve-aws.yaml @@ -0,0 +1,250 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +AWSTemplateFormatVersion: '2010-09-09' +Description: CloudFormation template to deploy MAX Serve on an EC2 instance. + +Parameters: + InstanceType: + Type: String + Default: g5.4xlarge + AllowedValues: + - g5.4xlarge + Description: EC2 instance type for the MAX Serve deployment. + + AmiId: + Type: AWS::EC2::Image::Id + Default: ami-02769e6d1f6a88067 + Description: AMI ID for Deep Learning Base OSS Nvidia Driver AMI (Amazon Linux 2) in us-east-1. + + HuggingFaceHubToken: + Type: String + NoEcho: true + Description: HuggingFace Hub API Token for accessing models. + + HuggingFaceRepoId: + Type: String + Default: modularai/Llama-3.1-8B-Instruct-GGUF + Description: Hugging Face Repository ID for the Model. + +Resources: + MaxServeInstanceProfile: + Type: AWS::IAM::InstanceProfile + Properties: + Roles: + - !Ref MaxServeInstanceRole + + MaxServeInstanceRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + Service: + - ec2.amazonaws.com + Action: + - sts:AssumeRole + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly + - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore + - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy + Policies: + - PolicyName: CloudWatchLogsAccess + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - logs:CreateLogStream + - logs:PutLogEvents + - logs:DescribeLogStreams + Resource: !Sub 'arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/ec2/${AWS::StackName}-logs:*' + + MaxServeLogGroup: + Type: AWS::Logs::LogGroup + DeletionPolicy: Delete + UpdateReplacePolicy: Delete + Properties: + LogGroupName: !Sub '/aws/ec2/${AWS::StackName}-logs' + RetentionInDays: 1 + + MaxServeSecurityGroup: + Type: AWS::EC2::SecurityGroup + Properties: + GroupDescription: Enable HTTP access on port 80 and SSH on port 22 + SecurityGroupIngress: + - IpProtocol: tcp + FromPort: 80 + ToPort: 80 + CidrIp: 0.0.0.0/0 + - IpProtocol: tcp + FromPort: 22 + ToPort: 22 + CidrIp: 0.0.0.0/0 + + MaxServeInstance: + Type: AWS::EC2::Instance + Properties: + InstanceType: !Ref InstanceType + ImageId: !Ref AmiId + SecurityGroupIds: + - !Ref MaxServeSecurityGroup + IamInstanceProfile: !Ref MaxServeInstanceProfile + BlockDeviceMappings: + - DeviceName: /dev/xvda + Ebs: + VolumeSize: 100 + VolumeType: gp3 + DeleteOnTermination: true + UserData: + 'Fn::Base64': !Sub | + #!/bin/bash + set -xe # Enable detailed logging + # Redirect all output to a log file for debugging + exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 + + echo "Starting user data script execution..." + + # Install CloudWatch agent first + echo "Installing CloudWatch agent..." + sudo yum install -y amazon-cloudwatch-agent + + # Create log files and directory with proper permissions + sudo mkdir -p /var/log/max-serve + sudo touch /var/log/max-serve/container.log + sudo chmod 644 /var/log/max-serve/container.log + sudo chown root:root /var/log/max-serve/container.log + + # Configure CloudWatch agent early + cat < /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json + { + "agent": { + "metrics_collection_interval": 60, + "run_as_user": "root" + }, + "logs": { + "logs_collected": { + "files": { + "collect_list": [ + { + "file_path": "/var/log/messages", + "log_group_name": "/aws/ec2/${AWS::StackName}-logs", + "log_stream_name": "instance-logs", + "timestamp_format": "%b %d %H:%M:%S", + "timezone": "UTC" + }, + { + "file_path": "/var/log/max-serve/container.log", + "log_group_name": "/aws/ec2/${AWS::StackName}-logs", + "log_stream_name": "instance-logs", + "timestamp_format": "%Y-%m-%d %H:%M:%S", + "timezone": "UTC" + }, + { + "file_path": "/var/log/user-data.log", + "log_group_name": "/aws/ec2/${AWS::StackName}-logs", + "log_stream_name": "instance-logs", + "timestamp_format": "%Y-%m-%d %H:%M:%S", + "timezone": "UTC" + } + ] + } + }, + "force_flush_interval": 15 + } + } + EOF + + # Start the CloudWatch agent + sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s + sudo systemctl enable amazon-cloudwatch-agent + sudo systemctl start amazon-cloudwatch-agent + + # Verify CloudWatch agent is running + sudo systemctl status amazon-cloudwatch-agent + + # Continue with Docker installation and rest of the setup + echo "Installing docker..." + sudo yum update -y + sudo yum install -y docker aws-cfn-bootstrap + sudo systemctl enable docker + sudo systemctl start docker + sudo usermod -a -G docker ec2-user + + # Verify docker is running + echo "Checking docker status..." + sudo systemctl status docker + docker --version + + # Install NVIDIA Container Toolkit + echo "Installing NVIDIA Container Toolkit..." + distribution=$(. /etc/os-release;echo $ID$VERSION_ID) + curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo + sudo yum clean expire-cache + sudo yum install -y nvidia-docker2 + sudo systemctl restart docker + + # Verify NVIDIA docker installation + echo "Checking NVIDIA docker installation..." + nvidia-smi + docker info | grep -i nvidia + + # Pull and run the MAX Serve container + echo "Pulling and running MAX Serve container..." + # Add error checking for docker pull + if ! sudo docker pull docker.modular.com/modular/max-openai-api:latest; then + echo "Failed to pull container image" + /opt/aws/bin/cfn-signal -e 1 --stack ${AWS::StackName} --resource MaxServeInstance --region ${AWS::Region} + exit 1 + fi + + sudo docker images + + # Start the container and capture logs + CONTAINER_ID=$(sudo docker run -d \ + --env "HF_TOKEN=${HuggingFaceHubToken}" \ + --env "HF_HUB_ENABLE_HF_TRANSFER=1" \ + -v /home/ec2-user/.cache/huggingface:/root/.cache/huggingface \ + --gpus 1 \ + -p 80:8000 \ + --ipc=host \ + docker.modular.com/modular/max-openai-api:latest \ + --model-path ${HuggingFaceRepoId}) + + if [ $? -ne 0 ]; then + echo "Failed to start container" + /opt/aws/bin/cfn-signal -e 1 --stack ${AWS::StackName} --resource MaxServeInstance --region ${AWS::Region} + exit 1 + fi + + # Start following container logs in the background + sudo docker logs -f $CONTAINER_ID > /var/log/max-serve/container.log 2>&1 & + + # Verify container is running + echo "Checking container status..." + if ! sudo docker ps | grep max-openai-api; then + echo "Container is not running" + /opt/aws/bin/cfn-signal -e 1 --stack ${AWS::StackName} --resource MaxServeInstance --region ${AWS::Region} + exit 1 + fi + +Outputs: + InstanceId: + Description: Instance ID of the EC2 instance + Value: !Ref MaxServeInstance + + PublicDNS: + Description: Public DNS of the EC2 instance + Value: !GetAtt MaxServeInstance.PublicDnsName diff --git a/tutorials/max-serve-cloud-configs/aws/notify.sh b/tutorials/max-serve-cloud-configs/aws/notify.sh new file mode 100644 index 0000000000..4d4b241536 --- /dev/null +++ b/tutorials/max-serve-cloud-configs/aws/notify.sh @@ -0,0 +1,106 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +REGION=$1 +STACK_NAME=$2 +PUBLIC_IP=$3 +MAX_WAIT_MINUTES=30 +START_TIME=$(date +%s) +LOG_GROUP="/aws/ec2/$STACK_NAME-logs" + +fetch_logs() { + local stream_name=$1 + local stream_type=$2 + local limit=$3 + echo "=== $stream_type Logs ===" + + if [ -n "$limit" ]; then + aws logs get-log-events \ + --log-group-name "$LOG_GROUP" \ + --log-stream-name "$stream_name" \ + --limit $limit \ + --region $REGION \ + --query 'events[*].[timestamp,message]' \ + --output text + else + aws logs get-log-events \ + --log-group-name "$LOG_GROUP" \ + --log-stream-name "$stream_name" \ + --start-time $(($(date +%s) - 60))000 \ + --region $REGION \ + --query 'events[*].[timestamp,message]' \ + --output text + fi + echo "====================" +} + +check_server_status() { + echo "🔍 Checking server health..." + + if echo "$EC2_LOGS" | grep -q "Pulling from docker.modular.com/modular/max-openai-api"; then + echo "⏳ Docker image is still being pulled..." + return 1 + fi + + if curl -s -f "http://$PUBLIC_IP/v1/health" >/dev/null; then + echo "✅ Server health check passed!" + return 0 + fi + + if echo "$EC2_LOGS" | grep -q "Building\|Compiling\|Starting download of model"; then + echo "⏳ Server is initializing (compiling model)..." + return 1 + fi + + echo "⏳ Server still starting up..." + return 1 +} + +echo "🔍 Starting monitoring for MAX server (max wait: ${MAX_WAIT_MINUTES} minutes)..." + +while true; do + current_time=$(date +%s) + elapsed_minutes=$(((current_time - START_TIME) / 60)) + + if [ $elapsed_minutes -ge $MAX_WAIT_MINUTES ]; then + echo "❌ Timeout after ${MAX_WAIT_MINUTES} minutes. Server might still be starting up." + exit 1 + fi + + EC2_LOG_STREAM=$(aws logs describe-log-streams \ + --log-group-name "$LOG_GROUP" \ + --log-stream-name-prefix "instance-logs" \ + --region $REGION \ + --query "logStreams[0].logStreamName" \ + --output text) + + echo "⏳ Checking logs... (${elapsed_minutes}/${MAX_WAIT_MINUTES} minutes)" + + if [ "$EC2_LOG_STREAM" != "None" ]; then + echo "📜 Instance Logs:" + EC2_LOGS=$(fetch_logs "$EC2_LOG_STREAM" "Instance" 50) + if check_server_status "$EC2_LOGS"; then + echo "✅ Server is ready! (took ${elapsed_minutes} minutes)" + echo "📋 Latest logs:" + echo "$EC2_LOGS" + exit 0 + fi + else + echo "⏳ Logs not yet available..." + fi + + echo "⏳ Server still starting up... checking again in 60 seconds" + echo "-------------------------------------------" + sleep 60 +done diff --git a/tutorials/max-serve-cloud-configs/azure/max-serve-azure.json b/tutorials/max-serve-cloud-configs/azure/max-serve-azure.json new file mode 100644 index 0000000000..554d50d8f0 --- /dev/null +++ b/tutorials/max-serve-cloud-configs/azure/max-serve-azure.json @@ -0,0 +1,252 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "Modular Inc.", + "copyright": "Copyright (c) 2025, Modular Inc. All rights reserved.", + "license": "Licensed under the Apache License v2.0 with LLVM Exceptions: https://llvm.org/LICENSE.txt", + "disclaimer": "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." + } + }, + "parameters": { + "adminUsername": { + "type": "string", + "metadata": { + "description": "Admin username for the virtual machine." + } + }, + "adminPassword": { + "type": "securestring", + "metadata": { + "description": "Admin password for the virtual machine." + } + }, + "vmSize": { + "type": "string", + "defaultValue": "Standard_NV36ads_A10_v5", + "metadata": { + "description": "Size of the virtual machine." + } + }, + "osDiskSizeGB": { + "type": "int", + "defaultValue": 128, + "metadata": { + "description": "OS disk size in GB." + } + }, + "vnetAddressPrefix": { + "type": "string", + "defaultValue": "10.0.0.0/16", + "metadata": { + "description": "Address space for the virtual network." + } + }, + "subnetAddressPrefix": { + "type": "string", + "defaultValue": "10.0.0.0/24", + "metadata": { + "description": "Subnet address space." + } + }, + "startupScript": { + "type": "string", + "metadata": { + "description": "Base64-encoded startup script." + } + }, + "location": { + "type": "string", + "defaultValue": "westus3", + "metadata": { + "description": "Location for all resources." + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2021-03-01", + "name": "maxServeVNet", + "location": "[parameters('location')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "[parameters('vnetAddressPrefix')]" + ] + }, + "subnets": [ + { + "name": "maxServeSubnet", + "properties": { + "addressPrefix": "[parameters('subnetAddressPrefix')]" + } + } + ] + } + }, + { + "type": "Microsoft.Network/publicIPAddresses", + "apiVersion": "2021-03-01", + "name": "maxServePublicIP", + "location": "[parameters('location')]", + "properties": { + "publicIPAllocationMethod": "Dynamic" + } + }, + { + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2021-02-01", + "name": "maxServeNSG", + "location": "[parameters('location')]", + "properties": { + "securityRules": [ + { + "name": "allowHTTP", + "properties": { + "priority": 100, + "protocol": "Tcp", + "access": "Allow", + "direction": "Inbound", + "sourceAddressPrefix": "*", + "sourcePortRange": "*", + "destinationAddressPrefix": "*", + "destinationPortRange": "80", + "description": "Allow HTTP traffic on port 80" + } + }, + { + "name": "allowSSH", + "properties": { + "priority": 200, + "protocol": "Tcp", + "access": "Allow", + "direction": "Inbound", + "sourceAddressPrefix": "*", + "sourcePortRange": "*", + "destinationAddressPrefix": "*", + "destinationPortRange": "22", + "description": "Allow SSH traffic on port 22" + } + }, + { + "name": "allowOutbound", + "properties": { + "priority": 300, + "protocol": "Tcp", + "access": "Allow", + "direction": "Outbound", + "sourceAddressPrefix": "*", + "sourcePortRange": "*", + "destinationAddressPrefix": "*", + "destinationPortRange": "*", + "description": "Allow all outbound traffic" + } + } + ] + } + }, + { + "type": "Microsoft.Network/networkInterfaces", + "apiVersion": "2021-03-01", + "name": "maxServeNIC", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Network/publicIPAddresses', 'maxServePublicIP')]", + "[resourceId('Microsoft.Network/virtualNetworks', 'maxServeVNet')]", + "[resourceId('Microsoft.Network/networkSecurityGroups', 'maxServeNSG')]" + ], + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig1", + "properties": { + "subnet": { + "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', 'maxServeVNet'), '/subnets/maxServeSubnet')]" + }, + "privateIPAllocationMethod": "Dynamic", + "publicIPAddress": { + "id": "[resourceId('Microsoft.Network/publicIPAddresses', 'maxServePublicIP')]" + } + } + } + ], + "networkSecurityGroup": { + "id": "[resourceId('Microsoft.Network/networkSecurityGroups', 'maxServeNSG')]" + } + } + }, + { + "type": "Microsoft.Compute/virtualMachines", + "apiVersion": "2021-03-01", + "name": "maxServeVM", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Network/networkInterfaces', 'maxServeNIC')]" + ], + "plan": { + "name": "nvaie_gpu_1_gen2", + "publisher": "nvidia", + "product": "nvidia-ai-enterprise" + }, + "properties": { + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "osProfile": { + "computerName": "maxServeVM", + "adminUsername": "[parameters('adminUsername')]", + "adminPassword": "[parameters('adminPassword')]" + }, + "storageProfile": { + "imageReference": { + "publisher": "nvidia", + "offer": "nvidia-ai-enterprise", + "sku": "nvaie_gpu_1_gen2", + "version": "24.07.03" + }, + "osDisk": { + "createOption": "FromImage", + "managedDisk": { + "storageAccountType": "Standard_LRS" + }, + "diskSizeGB": "[parameters('osDiskSizeGB')]" + } + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces', 'maxServeNIC')]" + } + ] + } + } + }, + { + "type": "Microsoft.Compute/virtualMachines/extensions", + "apiVersion": "2021-03-01", + "name": "maxServeVM/customScriptExtension", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[resourceId('Microsoft.Compute/virtualMachines', 'maxServeVM')]" + ], + "properties": { + "publisher": "Microsoft.Azure.Extensions", + "type": "CustomScript", + "typeHandlerVersion": "2.1", + "autoUpgradeMinorVersion": true, + "settings": { + "fileUris": [], + "script": "[parameters('startupScript')]" + } + } + } + ], + "outputs": { + "vmName": { + "type": "string", + "value": "[reference('maxServeVM').osProfile.computerName]" + } + } +} diff --git a/tutorials/max-serve-cloud-configs/azure/notify.sh b/tutorials/max-serve-cloud-configs/azure/notify.sh new file mode 100644 index 0000000000..c038b8b10a --- /dev/null +++ b/tutorials/max-serve-cloud-configs/azure/notify.sh @@ -0,0 +1,113 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +RESOURCE_GROUP=$1 +VM_PASSWORD=$2 +PUBLIC_IP=$3 +VM_NAME=maxServeVM +MAX_WAIT_MINUTES=30 +START_TIME=$(date +%s) + +fetch_logs() { + echo "=== Azure VM Logs ===" + echo "📋 Attempting to fetch logs from VM at ${PUBLIC_IP}..." + + LOGS=$(sshpass -p "$VM_PASSWORD" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=50 -v azureuser@$PUBLIC_IP " + # First check if container is running + CONTAINER_ID=\$(sudo docker ps -q -f ancestor=docker.modular.com/modular/max-openai-api:latest) + if [ -n \"\$CONTAINER_ID\" ]; then + echo '=== Docker Container Found ===' + sudo docker logs \$CONTAINER_ID + else + echo '=== Checking Deployment Logs ===' + # Check deployment logs if container isn't running yet + sudo cat /var/log/azure/custom-script/handler.log 2>/dev/null || echo 'No handler.log'; + sudo cat /var/lib/waagent/custom-script/download/0/stdout 2>/dev/null || echo 'No stdout'; + sudo cat /var/lib/waagent/custom-script/download/0/stderr 2>/dev/null || echo 'No stderr'; + fi + " 2>&1) + + if [ $? -ne 0 ]; then + echo "❌ Failed to connect to VM or fetch logs" + echo "Debug info: $LOGS" + return 1 + fi + + echo "$LOGS" + echo "====================" +} + +check_server_status() { + local logs=$1 + echo "🔍 Checking logs for server status..." + + if echo "$logs" | grep -q "Pulling from docker.modular.com/modular/max-openai-api"; then + echo "⏳ Docker image is still being pulled..." + return 1 + fi + + if curl -s -f "http://$PUBLIC_IP/v1/health" >/dev/null; then + echo "✅ Server health check passed!" + return 0 + fi + + if echo "$logs" | grep -q "Building\|Compiling\|Starting download of model"; then + echo "⏳ Server is initializing (compiling model)..." + return 1 + fi + + echo "⏳ Server still starting up..." + return 1 +} + +echo "🔍 Starting monitoring for MAX server (max wait: ${MAX_WAIT_MINUTES} minutes)..." + +if ! az vm show -g "$RESOURCE_GROUP" -n "$VM_NAME" &>/dev/null; then + echo "❌ VM not found. Please check if VM exists in resource group ${RESOURCE_GROUP}" + exit 1 +fi + +while true; do + current_time=$(date +%s) + elapsed_minutes=$(((current_time - START_TIME) / 60)) + + if [ $elapsed_minutes -ge $MAX_WAIT_MINUTES ]; then + echo "❌ Timeout after ${MAX_WAIT_MINUTES} minutes. Server might still be starting up." + echo "👉 You can manually check the logs by:" + echo " ssh azureuser@$PUBLIC_IP" + echo " sudo cat /var/log/azure/custom-script/handler.log" + echo " sudo cat /var/lib/waagent/custom-script/download/0/stdout" + echo " sudo cat /var/lib/waagent/custom-script/download/0/stderr" + exit 1 + fi + + echo "⏳ Checking logs... (${elapsed_minutes}/${MAX_WAIT_MINUTES} minutes)" + + LOGS=$(fetch_logs) + + if [ -n "$LOGS" ]; then + if check_server_status "$LOGS"; then + echo "✅ Server is ready! (took ${elapsed_minutes} minutes)" + echo "📋 Latest logs:" + echo "$LOGS" + exit 0 + fi + else + echo "⏳ Logs not yet available..." + fi + + echo "⏳ Server still starting up... checking again in 60 seconds" + echo "-------------------------------------------" + sleep 60 +done diff --git a/tutorials/max-serve-cloud-configs/gcp/max-serve-gcp.jinja b/tutorials/max-serve-cloud-configs/gcp/max-serve-gcp.jinja new file mode 100644 index 0000000000..7f5a20dfec --- /dev/null +++ b/tutorials/max-serve-cloud-configs/gcp/max-serve-gcp.jinja @@ -0,0 +1,120 @@ +{# +===----------------------------------------------------------------------=== +Copyright (c) 2025, Modular Inc. All rights reserved. + +Licensed under the Apache License v2.0 with LLVM Exceptions: +https://llvm.org/LICENSE.txt + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +===----------------------------------------------------------------------=== +#} + +resources: +# Main compute instance +- name: {{ properties['instanceName'] }} + type: compute.v1.instance + properties: + zone: {{ properties['zone'] }} + machineType: zones/{{ properties['zone'] }}/machineTypes/{{ properties['machineType'] }} + guestAccelerators: + - acceleratorType: zones/{{ properties['zone'] }}/acceleratorTypes/{{ properties['acceleratorType'] }} + acceleratorCount: {{ properties['acceleratorCount'] }} + disks: + - deviceName: boot + boot: true + autoDelete: true + initializeParams: + sourceImage: projects/deeplearning-platform-release/global/images/{{ properties['sourceImage'] }} + diskSizeGb: 100 # disk space in GB + networkInterfaces: + - network: global/networks/default + accessConfigs: + - name: External NAT + type: ONE_TO_ONE_NAT + serviceAccounts: + - email: default + scopes: + - https://www.googleapis.com/auth/cloud-platform + scheduling: + preemptible: false + onHostMaintenance: TERMINATE # Disables live migration for GPU instances + automaticRestart: true + metadata: + items: + - key: startup-script + value: | + #!/bin/bash + set -xe # Enable detailed logging + curl -sSO https://dl.google.com/cloudagents/add-logging-agent-repo.sh + sudo bash add-logging-agent-repo.sh + + # Update and install dependencies + sudo apt-get update + sudo apt-get install -y google-fluentd curl apt-transport-https ca-certificates gnupg lsb-release software-properties-common + + # Configure Stackdriver logging + sudo service google-fluentd start + sudo systemctl enable google-fluentd + + # Install the NVIDIA drivers if not installed + if [ ! -f /opt/google/cuda-installer ]; then + sudo /opt/deeplearning/install-driver.sh + fi + + # Add Docker GPG key and Docker repository + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + + # Install Docker + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + + # Add NVIDIA Docker repository + distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ + && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ + && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list + + # Install NVIDIA container runtime + sudo apt-get update + sudo apt-get install -y nvidia-container-toolkit + sudo systemctl restart docker + + # Add user to docker group + sudo usermod -aG docker $(whoami) + + docker run \ + --env "HF_TOKEN={{ properties['huggingFaceHubToken'] }}" \ + --env "HF_HUB_ENABLE_HF_TRANSFER=1" \ + -v $HOME/.cache/huggingface:/root/.cache/huggingface \ + --gpus 1 \ + -p 80:8000 \ + --ipc host \ + docker.modular.com/modular/max-openai-api:latest \ + --model-path {{ properties['huggingFaceRepoId'] }} + +# Add firewall rule directly in template +- name: allow-http + type: compute.v1.firewall + properties: + network: global/networks/default + sourceRanges: ["0.0.0.0/0"] + targetTags: ["http-server"] + allowed: + - IPProtocol: tcp + ports: ["80"] + +# Outputs section to output public IP and instance details +outputs: +- name: instanceName + value: $(ref.{{ properties['instanceName'] }}.name) + description: Name of the GCP Compute instance. + +- name: instancePublicIP + value: $(ref.{{ properties['instanceName'] }}.networkInterfaces[0].accessConfigs[0].natIP) + description: Public IP address of the GCP Compute instance. diff --git a/tutorials/max-serve-cloud-configs/gcp/notify.sh b/tutorials/max-serve-cloud-configs/gcp/notify.sh new file mode 100644 index 0000000000..89e7262f62 --- /dev/null +++ b/tutorials/max-serve-cloud-configs/gcp/notify.sh @@ -0,0 +1,103 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +PROJECT_ID=$1 +INSTANCE_NAME=$2 +ZONE=$3 +PUBLIC_IP=$4 +MAX_WAIT_MINUTES=30 +START_TIME=$(date +%s) + +fetch_logs() { + local instance_id=$1 + local limit=${2:-50} + echo "=== GCP Instance Logs ===" + + echo "Querying logs for instance_id: ${instance_id}" + + gcloud logging read \ + "resource.type=gce_instance AND \ + resource.labels.instance_id=${instance_id} AND \ + jsonPayload.message:*" \ + --project="${PROJECT_ID}" \ + --format="table(timestamp,jsonPayload.message)" \ + --limit=10 + + echo "====================" +} + +check_server_status() { + local logs=$1 + echo "🔍 Checking server health..." + + if echo "$logs" | grep -q "Pulling from docker.modular.com/modular/max-openai-api"; then + echo "⏳ Docker image is still being pulled..." + return 1 + fi + + if curl -s -f "http://${PUBLIC_IP}/v1/health" >/dev/null; then + echo "✅ Server health check passed!" + return 0 + fi + + if echo "$logs" | grep -q "Building\|Compiling\|Starting download of model"; then + echo "⏳ Server is initializing (compiling model)..." + return 1 + fi + + echo "⏳ Server still starting up..." + return 1 +} + +echo "🔍 Starting monitoring for MAX server (max wait: ${MAX_WAIT_MINUTES} minutes)..." + +# Get instance ID +INSTANCE_ID=$(gcloud compute instances describe "${INSTANCE_NAME}" \ + --zone="${ZONE}" \ + --project="${PROJECT_ID}" \ + --format="value(id)") + +if [ -z "$INSTANCE_ID" ]; then + echo "❌ Failed to get instance ID. Please check if instance exists." + exit 1 +fi + +while true; do + current_time=$(date +%s) + elapsed_minutes=$(((current_time - START_TIME) / 60)) + + if [ $elapsed_minutes -ge $MAX_WAIT_MINUTES ]; then + echo "❌ Timeout after ${MAX_WAIT_MINUTES} minutes. Server might still be starting up." + exit 1 + fi + + echo "⏳ Checking logs... (${elapsed_minutes}/${MAX_WAIT_MINUTES} minutes)" + + LOGS=$(fetch_logs "$INSTANCE_ID") + + if [ -n "$LOGS" ]; then + if check_server_status "$LOGS"; then + echo "✅ Server is ready! (took ${elapsed_minutes} minutes)" + echo "📋 Latest logs:" + echo "$LOGS" + exit 0 + fi + else + echo "⏳ Logs not yet available..." + fi + + echo "⏳ Server still starting up... checking again in 60 seconds" + echo "-------------------------------------------" + sleep 60 +done diff --git a/tutorials/run-embeddings-with-max-serve/.gitattributes b/tutorials/run-embeddings-with-max-serve/.gitattributes new file mode 100644 index 0000000000..8f61a8e774 --- /dev/null +++ b/tutorials/run-embeddings-with-max-serve/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/tutorials/run-embeddings-with-max-serve/.gitignore b/tutorials/run-embeddings-with-max-serve/.gitignore new file mode 100644 index 0000000000..9279c11d44 --- /dev/null +++ b/tutorials/run-embeddings-with-max-serve/.gitignore @@ -0,0 +1,6 @@ + +# pixi environments +.pixi +*.egg-info +# magic environments +.magic diff --git a/tutorials/run-embeddings-with-max-serve/README.md b/tutorials/run-embeddings-with-max-serve/README.md new file mode 100644 index 0000000000..4fc60548b3 --- /dev/null +++ b/tutorials/run-embeddings-with-max-serve/README.md @@ -0,0 +1,16 @@ +# Embeddings endpoint + +A document management system that uses embeddings and clustering to organize and +search through documents semantically. + +1. Start the embeddings endpoint: + + ```bash + max-pipelines serve --model-path=sentence-transformers/all-mpnet-base-v2 + ``` + +1. Run the system: + + ```bash + python -m embeddings.kb_system + ``` diff --git a/tutorials/run-embeddings-with-max-serve/pyproject.toml b/tutorials/run-embeddings-with-max-serve/pyproject.toml new file mode 100644 index 0000000000..ff683e51a7 --- /dev/null +++ b/tutorials/run-embeddings-with-max-serve/pyproject.toml @@ -0,0 +1,25 @@ +[project] +authors = [{name = "Modular", email = "hello@modular.com"}] +dependencies = [] +description = "Run an embeddings model using the all-mpnet-base-v2 model" +name = "embeddings" +requires-python = ">= 3.11" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.project] +channels = ["https://conda.modular.com/max-nightly", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "conda-forge"] +platforms = ["osx-arm64"] + +[tool.pixi.pypi-dependencies] +embeddings = { path = ".", editable = true } + +[tool.pixi.tasks] + +[tool.pixi.dependencies] +numpy = ">=2.2.2,<3" +scikit-learn = ">=1.6.1,<2" +requests = ">=2.32.3,<3" diff --git a/tutorials/run-embeddings-with-max-serve/src/embeddings/__init__.py b/tutorials/run-embeddings-with-max-serve/src/embeddings/__init__.py new file mode 100644 index 0000000000..75c4f824f2 --- /dev/null +++ b/tutorials/run-embeddings-with-max-serve/src/embeddings/__init__.py @@ -0,0 +1,12 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # diff --git a/tutorials/run-embeddings-with-max-serve/src/embeddings/kb_system.py b/tutorials/run-embeddings-with-max-serve/src/embeddings/kb_system.py new file mode 100644 index 0000000000..5363aec1d1 --- /dev/null +++ b/tutorials/run-embeddings-with-max-serve/src/embeddings/kb_system.py @@ -0,0 +1,196 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import logging +from functools import lru_cache +from typing import Dict, List, Tuple + +import numpy as np +import requests +from sklearn.cluster import KMeans +from sklearn.metrics.pairwise import cosine_similarity + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class SmartKnowledgeBase: + def __init__(self, endpoint: str = "http://localhost:8000/v1/embeddings"): + self.endpoint = endpoint + self.documents: List[str] = [] + self.doc_titles: List[str] = [] + self.embeddings: np.ndarray = None + self.clusters: Dict[int, List[int]] = {} + + def _get_embedding( + self, texts: List[str], max_retries: int = 3 + ) -> np.ndarray: + """Get embeddings with retry logic.""" + for attempt in range(max_retries): + try: + response = requests.post( + self.endpoint, + headers={"Content-Type": "application/json"}, + json={ + "input": texts, + "model": "sentence-transformers/all-mpnet-base-v2", + }, + timeout=5, + ).json() + return np.array( + [item["embedding"] for item in response["data"]] + ) + except Exception as e: + if attempt == max_retries - 1: + raise Exception( + f"Failed to get embeddings after {max_retries} attempts: {e}" + ) + logger.warning(f"Attempt {attempt + 1} failed, retrying...") + + @lru_cache(maxsize=1000) + def _get_embedding_cached(self, text: str) -> np.ndarray: + """Cached version for single text embedding.""" + return self._get_embedding([text])[0] + + def add_document(self, title: str, content: str): + """Add a single document with title.""" + self.doc_titles.append(title) + self.documents.append(content) + + # Update embeddings + if len(self.documents) == 1: + self.embeddings = self._get_embedding([content]) + else: + self.embeddings = np.vstack( + [self.embeddings, self._get_embedding([content])] + ) + + # Recluster if we have enough documents + if len(self.documents) >= 3: + self._cluster_documents() + + def _cluster_documents(self, n_clusters: int = None): + """Cluster documents into topics.""" + if n_clusters is None: + n_clusters = max(2, len(self.documents) // 5) + + n_clusters = min(n_clusters, len(self.documents)) + kmeans = KMeans(n_clusters=n_clusters, random_state=42).fit( + self.embeddings + ) + + self.clusters = {} + for i in range(n_clusters): + self.clusters[i] = np.where(kmeans.labels_ == i)[0].tolist() + + def search( + self, query: str, top_k: int = 3 + ) -> List[Tuple[str, str, float]]: + """Find documents most similar to the query.""" + query_embedding = self._get_embedding_cached(query) + similarities = cosine_similarity([query_embedding], self.embeddings)[0] + top_indices = np.argsort(similarities)[-top_k:][::-1] + return [ + (self.doc_titles[i], self.documents[i], similarities[i]) + for i in top_indices + ] + + def get_topic_documents(self, topic_id: int) -> List[Tuple[str, str]]: + """Get all documents in a topic cluster.""" + return [ + (self.doc_titles[i], self.documents[i]) + for i in self.clusters.get(topic_id, []) + ] + + def suggest_topics( + self, query: str, top_k: int = 2 + ) -> List[Tuple[int, float]]: + query_embedding = self._get_embedding_cached(query) + topic_similarities = [] + + for topic_id, doc_indices in self.clusters.items(): + topic_embeddings = self.embeddings[doc_indices] + similarity = cosine_similarity( + [query_embedding], topic_embeddings + ).max() + topic_similarities.append((topic_id, similarity)) # Remove [0] + + return sorted(topic_similarities, key=lambda x: x[1], reverse=True)[ + :top_k + ] + + +# Example usage +if __name__ == "__main__": + # Initialize knowledge base + kb = SmartKnowledgeBase() + + # Add technical documentation + kb.add_document( + "Password Reset Guide", + "To reset your password: 1. Click 'Forgot Password' 2. Enter your email " + "3. Follow the reset link 4. Create a new password meeting security requirements", + ) + + kb.add_document( + "Account Security", + "Secure your account by enabling 2FA, using a strong password, and regularly " + "monitoring account activity. Enable login notifications for suspicious activity.", + ) + + kb.add_document( + "Billing Overview", + "Your billing cycle starts on the 1st of each month. View charges, update " + "payment methods, and download invoices from the Billing Dashboard.", + ) + + kb.add_document( + "Payment Methods", + "We accept credit cards, PayPal, and bank transfers. Update payment methods " + "in Billing Settings. New payment methods are verified with a $1 hold.", + ) + + kb.add_document( + "Installation Guide", + "Install by downloading the appropriate package for your OS. Run with admin " + "privileges. Follow prompts to select installation directory and components.", + ) + + kb.add_document( + "System Requirements", + "Minimum: 8GB RAM, 2GB storage, Windows 10/macOS 11+. Recommended: 16GB RAM, " + "4GB storage, SSD, modern multi-core processor for optimal performance.", + ) + + # Example 1: Search for password-related help + print("\nSearching for password help:") + results = kb.search("How do I change my password?") + for title, content, score in results: + print(f"\nTitle: {title}") + print(f"Relevance: {score:.2f}") + print(f"Content: {content[:100]}...") + + # Example 2: Get topic suggestions + print("\nGetting topics for billing query:") + query = "Where can I update my credit card?" + topics = kb.suggest_topics(query) + for topic_id, relevance in topics: + print(f"\nTopic {topic_id} (Relevance: {relevance:.2f}):") + for title, content in kb.get_topic_documents(topic_id): + print(f"- {title}: {content[:50]}...") + + # Example 3: Get all documents in a topic + print("\nAll documents in Topic 0:") + for title, content in kb.get_topic_documents(0): + print(f"\nTitle: {title}") + print(f"Content: {content[:100]}...") diff --git a/tutorials/run-onnx-with-python/.gitignore b/tutorials/run-onnx-with-python/.gitignore new file mode 100644 index 0000000000..bf7158d955 --- /dev/null +++ b/tutorials/run-onnx-with-python/.gitignore @@ -0,0 +1,2 @@ +.magic +resnet50.onnx diff --git a/tutorials/run-onnx-with-python/README.md b/tutorials/run-onnx-with-python/README.md new file mode 100644 index 0000000000..a4503b0232 --- /dev/null +++ b/tutorials/run-onnx-with-python/README.md @@ -0,0 +1,21 @@ +# Tutorial: Run an ONNX model with Python + +This is the finished project for the [Run an ONNX model with +Python](https://docs.modular.com/max/tutorials/run-onnx-with-python) tutorial. + +Please refer to that page for more information. + +If you just want to run this code, use these commands (first [install +magic](https://docs.modular.com/magic/#install-magic)): + +```sh +git clone https://github.com/modular/max.git + +cd max/tutorials/run-onnx-with-python + +magic shell + +python3 download-model.py + +python3 run.py +``` diff --git a/tutorials/run-onnx-with-python/download-model.py b/tutorials/run-onnx-with-python/download-model.py new file mode 100644 index 0000000000..286369fc46 --- /dev/null +++ b/tutorials/run-onnx-with-python/download-model.py @@ -0,0 +1,47 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import torch +from torch.onnx import export +from transformers import ResNetForImageClassification + +# The HuggingFace model name and exported file name +HF_MODEL_NAME = "microsoft/resnet-50" +MODEL_PATH = "resnet50.onnx" + + +def main(): + # Load the ResNet model from HuggingFace in evaluation mode + model = ResNetForImageClassification.from_pretrained(HF_MODEL_NAME) + model.eval() + + # Create random input for tracing, then export the model to ONNX + dummy_input = torch.randn(1, 3, 224, 224) + export( + model, + dummy_input, + MODEL_PATH, + opset_version=11, + input_names=["pixel_values"], + output_names=["output"], + dynamic_axes={ + "pixel_values": {0: "batch_size"}, + "output": {0: "batch_size"}, + }, + ) + + print(f"Model saved as {MODEL_PATH}") + + +if __name__ == "__main__": + main() diff --git a/tutorials/run-onnx-with-python/pyproject.toml b/tutorials/run-onnx-with-python/pyproject.toml new file mode 100644 index 0000000000..b754655b7f --- /dev/null +++ b/tutorials/run-onnx-with-python/pyproject.toml @@ -0,0 +1,36 @@ +[project] +dependencies = [] +description = "Tutorial: Run an ONNX model with Python" +name = "onnx-tutorial" +requires-python = ">=3.9,<3.13" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.project] +channels = ["pytorch", "conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["linux-64", "osx-arm64"] + +[tool.pixi.pypi-dependencies] +onnx_tutorial = { path = ".", editable = true } + +[tool.pixi.dependencies] +max = "~=24.6" +pytorch = "==2.4.0" +numpy = "<2.0" +onnx = "==1.16.0" +transformers = "==4.40.1" +datasets = "==2.18" +pillow = "==10.3.0" +libjpeg-turbo = { version = "==3.0.0", channel = "conda-forge" } + +[tool.pixi.feature.test.tasks] +test = "python3 download-model.py && python3 run.py" + +[tool.pixi.environments] +test = { features = ["test"] } + +[tool.pixi.feature.test.dependencies] +python-dateutil = "==2.9.0" diff --git a/tutorials/run-onnx-with-python/run.py b/tutorials/run-onnx-with-python/run.py new file mode 100644 index 0000000000..ef84a1b096 --- /dev/null +++ b/tutorials/run-onnx-with-python/run.py @@ -0,0 +1,50 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import numpy as np +from datasets import load_dataset +from max import engine +from transformers import AutoImageProcessor, AutoModelForImageClassification + +# The HuggingFace model name and exported file name +HF_MODEL_NAME = "microsoft/resnet-50" +MODEL_PATH = "resnet50.onnx" + + +def main(): + dataset = load_dataset("huggingface/cats-image", trust_remote_code=True) + image = dataset["test"]["image"][0] + # optionally, save the image to see it yourself: + # image.save("cat.png") + + image_processor = AutoImageProcessor.from_pretrained(HF_MODEL_NAME) + inputs = image_processor(image, return_tensors="np") + + print("Keys:", inputs.keys()) + print("Shape:", inputs["pixel_values"].shape) + + session = engine.InferenceSession() + model = session.load(MODEL_PATH) + outputs = model.execute_legacy(**inputs) + + print("Output shape:", outputs["output"].shape) + + predicted_label = np.argmax(outputs["output"], axis=-1)[0] + hf_model = AutoModelForImageClassification.from_pretrained(HF_MODEL_NAME) + predicted_class = hf_model.config.id2label[predicted_label] + + print(f"Prediction: {predicted_class}") + + +if __name__ == "__main__": + main() diff --git a/tutorials/run-onnx-with-python/src/onnx_tutorial/__init__.py b/tutorials/run-onnx-with-python/src/onnx_tutorial/__init__.py new file mode 100644 index 0000000000..1d49ac09ac --- /dev/null +++ b/tutorials/run-onnx-with-python/src/onnx_tutorial/__init__.py @@ -0,0 +1,12 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # diff --git a/tutorials/run-torchscript-with-python/.gitignore b/tutorials/run-torchscript-with-python/.gitignore new file mode 100644 index 0000000000..5254ad982c --- /dev/null +++ b/tutorials/run-torchscript-with-python/.gitignore @@ -0,0 +1,2 @@ +.magic +roberta.torchscript diff --git a/tutorials/run-torchscript-with-python/README.md b/tutorials/run-torchscript-with-python/README.md new file mode 100644 index 0000000000..639dc85912 --- /dev/null +++ b/tutorials/run-torchscript-with-python/README.md @@ -0,0 +1,22 @@ +# Tutorial: Run a TorchScript model with Python + +This is the finished project for the [Run a TorchScript model with +Python](https://docs.modular.com/max/tutorials/run-torchscript-with-python) +tutorial. + +Please refer to that page for more information. + +If you just want to run this code, use these commands (first [install +magic](https://docs.modular.com/magic/#install-magic)): + +```sh +git clone https://github.com/modular/max.git + +cd max/tutorials/run-torchscript-with-python + +magic shell + +python3 download-model.py + +python3 run.py +``` diff --git a/tutorials/run-torchscript-with-python/download-model.py b/tutorials/run-torchscript-with-python/download-model.py new file mode 100644 index 0000000000..bcd91ba410 --- /dev/null +++ b/tutorials/run-torchscript-with-python/download-model.py @@ -0,0 +1,43 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from pathlib import Path + +import torch +from transformers import AutoModelForSequenceClassification + +# The HuggingFace model name and exported file name +HF_MODEL_NAME = "cardiffnlp/twitter-roberta-base-emotion-multilabel-latest" +MODEL_PATH = Path("roberta.torchscript") + + +def main(): + # Load the ResNet model from HuggingFace in evaluation mode + hf_model = AutoModelForSequenceClassification.from_pretrained(HF_MODEL_NAME) + + # Convert the model to TorchScript + batch = 1 + seqlen = 128 + input_spec = { + "input_ids": torch.zeros((batch, seqlen), dtype=torch.int64), + "attention_mask": torch.zeros((batch, seqlen), dtype=torch.int64), + } + with torch.no_grad(): + traced_model = torch.jit.trace( + hf_model, example_kwarg_inputs=dict(input_spec), strict=False + ) + torch.jit.save(traced_model, MODEL_PATH) + + +if __name__ == "__main__": + main() diff --git a/tutorials/run-torchscript-with-python/pyproject.toml b/tutorials/run-torchscript-with-python/pyproject.toml new file mode 100644 index 0000000000..f4b1f5772e --- /dev/null +++ b/tutorials/run-torchscript-with-python/pyproject.toml @@ -0,0 +1,31 @@ +[project] +dependencies = [] +description = "Tutorial: Run a TorchScript model with Python" +name = "torchscript-tutorial" +requires-python = ">=3.11,<3.13" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.project] +channels = ["pytorch", "conda-forge", "https://conda.modular.com/max-nightly/"] +platforms = ["linux-64", "osx-arm64"] + +[tool.pixi.pypi-dependencies] +torchscript_tutorial = { path = ".", editable = true } + +[tool.pixi.dependencies] +max = "~=24.6" +pytorch = "==2.4.0" +transformers = "==4.40.1" + +[tool.pixi.feature.test.tasks] +test = "python3 download-model.py && python3 run.py" + +[tool.pixi.environments] +test = { features = ["test"] } + +[tool.pixi.feature.test.dependencies] +python-dateutil = "==2.9.0" diff --git a/tutorials/run-torchscript-with-python/run.py b/tutorials/run-torchscript-with-python/run.py new file mode 100644 index 0000000000..0a9c75b4d3 --- /dev/null +++ b/tutorials/run-torchscript-with-python/run.py @@ -0,0 +1,76 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from pathlib import Path + +import torch +from max import engine +from max.dtype import DType +from transformers import AutoModelForSequenceClassification, AutoTokenizer + +# The HuggingFace model name and TorchScript file name +HF_MODEL_NAME = "cardiffnlp/twitter-roberta-base-emotion-multilabel-latest" +MODEL_PATH = Path("roberta.torchscript") + + +def main(): + batch = 1 + seqlen = 128 + input_spec = { + "input_ids": torch.zeros((batch, seqlen), dtype=torch.int64), + "attention_mask": torch.zeros((batch, seqlen), dtype=torch.int64), + } + + # We use the same `input_spec` that we used to trace the model (download-model.py) + input_spec_list = [ + engine.TorchInputSpec(shape=tensor.size(), dtype=DType.int64) + for tensor in input_spec.values() + ] + + session = engine.InferenceSession() + model = session.load(MODEL_PATH, input_specs=input_spec_list) + + for tensor in model.input_metadata: + print( + f"name: {tensor.name}, shape: {tensor.shape}, dtype: {tensor.dtype}" + ) + + # The model input + text_input = ( + "There are many exciting developments in the field of AI" + " Infrastructure!" + ) + + # Tokenize the input + tokenizer = AutoTokenizer.from_pretrained(HF_MODEL_NAME) + inputs = tokenizer( + text_input, + return_tensors="pt", + padding="max_length", + truncation=True, + max_length=seqlen, + ) + print(inputs) + + outputs = model.execute_legacy(**inputs) + + # Extract class prediction from output + hf_model = AutoModelForSequenceClassification.from_pretrained(HF_MODEL_NAME) + predicted_class_id = outputs["result0"]["logits"].argmax(axis=-1)[0] + classification = hf_model.config.id2label[predicted_class_id] + + print(f"The sentiment is: {classification}") + + +if __name__ == "__main__": + main() diff --git a/tutorials/run-torchscript-with-python/src/torchscript_tutorial/__init__.py b/tutorials/run-torchscript-with-python/src/torchscript_tutorial/__init__.py new file mode 100644 index 0000000000..1d49ac09ac --- /dev/null +++ b/tutorials/run-torchscript-with-python/src/torchscript_tutorial/__init__.py @@ -0,0 +1,12 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # From 44a9f7af205fe50d02fc0dd05ceb5ac4513bd26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8rstad?= Date: Wed, 26 Feb 2025 19:49:08 +0100 Subject: [PATCH 02/44] [Pipelines] Fix bug in quantized version of LinearV2 (#56733) This PR fixes an issue where quantized Llama would get NaNs at the output. This likely means that there's a difference between `self.quantization_encoding` and `self.weight. self.quantization_encoding`, perhaps the weight's encoding will change at a later time? This perhaps means that there are some deeper problems. This quick fix at least fixes the pipelines logits verification --------- Co-authored-by: Kathy Wu MODULAR_ORIG_COMMIT_REV_ID: 74f1da31cc9f3433714a025ab4a613171545d559 --- .../architectures/llama3/naive_llama3.py | 4 +++- .../nn/attention/attention_with_rope.py | 2 +- .../nn/attention/naive_attention_with_rope.py | 17 ----------------- src/max/pipelines/nn/{attention => }/clamp.py | 0 src/max/pipelines/nn/linear.py | 13 +++++++++---- 5 files changed, 13 insertions(+), 23 deletions(-) rename src/max/pipelines/nn/{attention => }/clamp.py (100%) diff --git a/src/max/pipelines/architectures/llama3/naive_llama3.py b/src/max/pipelines/architectures/llama3/naive_llama3.py index c79badcbde..d171f926cb 100644 --- a/src/max/pipelines/architectures/llama3/naive_llama3.py +++ b/src/max/pipelines/architectures/llama3/naive_llama3.py @@ -219,6 +219,7 @@ def __init__( dtype=dtype, device=device, quantization_encoding=quantization_encoding, + clip_weight=clip_qkv, ), wv=linear_cls( in_dim=hidden_size, @@ -226,6 +227,7 @@ def __init__( dtype=dtype, device=device, quantization_encoding=quantization_encoding, + clip_weight=clip_qkv, ), wq=linear_cls( in_dim=hidden_size, @@ -233,6 +235,7 @@ def __init__( dtype=dtype, device=device, quantization_encoding=quantization_encoding, + clip_weight=clip_qkv, ), wo=linear_cls( in_dim=hidden_size, @@ -243,7 +246,6 @@ def __init__( ), rope=rope, scale=scale, - clip_qkv=clip_qkv, ) diff --git a/src/max/pipelines/nn/attention/attention_with_rope.py b/src/max/pipelines/nn/attention/attention_with_rope.py index 897a14d068..a9d4c70fb8 100644 --- a/src/max/pipelines/nn/attention/attention_with_rope.py +++ b/src/max/pipelines/nn/attention/attention_with_rope.py @@ -33,6 +33,7 @@ PagedKVCacheCollection, ) +from ..clamp import clamp from ..kernels import ( MHAMaskVariant, flash_attention_ragged, @@ -43,7 +44,6 @@ from ..layer import LayerV2 from ..linear import LinearV2 from ..rotary_embedding import OptimizedRotaryEmbedding -from .clamp import clamp from .interfaces import ( AttentionImpl, AttentionImplQKV, diff --git a/src/max/pipelines/nn/attention/naive_attention_with_rope.py b/src/max/pipelines/nn/attention/naive_attention_with_rope.py index 3f136f167c..8900378460 100644 --- a/src/max/pipelines/nn/attention/naive_attention_with_rope.py +++ b/src/max/pipelines/nn/attention/naive_attention_with_rope.py @@ -23,7 +23,6 @@ from ..layer import LayerV2 from ..linear import Linear, LinearV2 from ..rotary_embedding import RotaryEmbedding -from .clamp import clamp class NaiveAttentionWithRope(LayerV2): @@ -38,7 +37,6 @@ def __init__( wo: Linear | LinearV2, rope: RotaryEmbedding, scale: float | None = None, - clip_qkv: float | None = None, ): super().__init__() self.n_heads = n_heads @@ -52,7 +50,6 @@ def __init__( self.scale = ( scale if scale else math.sqrt(1.0 / self.kv_params.head_dim) ) - self.clip_qkv = clip_qkv if self.kv_params.cache_strategy.uses_opaque(): raise ValueError( @@ -143,20 +140,6 @@ def __call__( """ x = TensorValue(x) batch, seq_len = x.shape[0], x.shape[1] - # Apply `clip_qkv` before matmuling the weights - if self.clip_qkv: - assert isinstance(self.q_proj.weight, TensorValue) - self.q_proj.weight = clamp( - self.q_proj.weight, min=-self.clip_qkv, max=self.clip_qkv - ) - assert isinstance(self.k_proj.weight, TensorValue) - self.k_proj.weight = clamp( - self.k_proj.weight, min=-self.clip_qkv, max=self.clip_qkv - ) - assert isinstance(self.v_proj.weight, TensorValue) - self.v_proj.weight = clamp( - self.v_proj.weight, min=-self.clip_qkv, max=self.clip_qkv - ) xq = self.q_proj(x) xk = self.k_proj(x) diff --git a/src/max/pipelines/nn/attention/clamp.py b/src/max/pipelines/nn/clamp.py similarity index 100% rename from src/max/pipelines/nn/attention/clamp.py rename to src/max/pipelines/nn/clamp.py diff --git a/src/max/pipelines/nn/linear.py b/src/max/pipelines/nn/linear.py index dd6a625af0..c09c5e8d74 100644 --- a/src/max/pipelines/nn/linear.py +++ b/src/max/pipelines/nn/linear.py @@ -31,6 +31,7 @@ from max.graph.quantization import QuantizationConfig, QuantizationEncoding from max.graph.weights import Weights +from .clamp import clamp from .kernels import swish_glu from .layer import Layer, LayerV2 @@ -62,7 +63,7 @@ class LinearV2(LayerV2): output = linear_layer(input_tensor) """ - weight: Weight | TensorValue + weight: Weight """The weight matrix stored on CPU with shape (out_dim, in_dim). Model init transposes the weight and moves it to :obj:`device`.""" @@ -82,6 +83,7 @@ def __init__( has_bias: bool = False, quantization_encoding: Optional[QuantizationEncoding] = None, name: Optional[str] = None, + clip_weight: Optional[float] = None, ) -> None: """Initializes the linear layer with weights and optional bias. @@ -99,6 +101,7 @@ def __init__( super().__init__() self.device = device + self.clip_weight = clip_weight self.weight = Weight( name=f"{name}.weight" if name else "weight", @@ -107,7 +110,6 @@ def __init__( device=DeviceRef.CPU() if self.device else None, quantization_encoding=quantization_encoding, ) - self.quantization_encoding = quantization_encoding if has_bias: self.bias = Weight( @@ -137,9 +139,12 @@ def __call__(self, x: TensorValue) -> TensorValue: if self.device: weight = weight.to(self.device) - if self.quantization_encoding: + if self.clip_weight: + weight = clamp(weight, -self.clip_weight, self.clip_weight) + + if self.weight.quantization_encoding: res = ops.qmatmul( - self.quantization_encoding, + self.weight.quantization_encoding, None, x, weight, From bdd80f93d705e29766bee4c0e503338e132efa99 Mon Sep 17 00:00:00 2001 From: kcaverly Date: Wed, 26 Feb 2025 15:44:13 -0500 Subject: [PATCH 03/44] [Pipelines] Harden TextResponse and next_token interface This puts explicit types on next token TextResponse objects, strengthening the interface for downstream changes. MODULAR_ORIG_COMMIT_REV_ID: 7cd459270f39d0813e421ed9387674901a7b2a69 --- src/max/pipelines/__init__.py | 4 +++- src/max/pipelines/embeddings_pipeline.py | 3 +-- src/max/pipelines/hf_pipeline.py | 14 +++++++++----- src/max/pipelines/interfaces/__init__.py | 4 ++++ src/max/pipelines/{ => interfaces}/response.py | 0 src/max/pipelines/interfaces/text_generation.py | 6 ++++-- src/max/pipelines/pipeline.py | 8 +++----- 7 files changed, 24 insertions(+), 15 deletions(-) rename src/max/pipelines/{ => interfaces}/response.py (100%) diff --git a/src/max/pipelines/__init__.py b/src/max/pipelines/__init__.py index 3020fb1d21..33c02c405a 100644 --- a/src/max/pipelines/__init__.py +++ b/src/max/pipelines/__init__.py @@ -29,8 +29,11 @@ from .hf_utils import HuggingFaceFile from .interfaces import ( EmbeddingsGenerator, + EmbeddingsResponse, + LogProbabilities, PipelineTask, PipelineTokenizer, + TextResponse, TokenGenerator, TokenGeneratorContext, TokenGeneratorRequest, @@ -47,7 +50,6 @@ upper_bounded_default, ) from .registry import PIPELINE_REGISTRY, SupportedArchitecture -from .response import EmbeddingsResponse, LogProbabilities, TextResponse from .tokenizer import ( IdentityPipelineTokenizer, PreTrainedPipelineTokenizer, diff --git a/src/max/pipelines/embeddings_pipeline.py b/src/max/pipelines/embeddings_pipeline.py index 85ed8932ec..fa609ef7f1 100644 --- a/src/max/pipelines/embeddings_pipeline.py +++ b/src/max/pipelines/embeddings_pipeline.py @@ -22,9 +22,8 @@ from .config import PipelineConfig from .context import InputContext -from .interfaces import EmbeddingsGenerator +from .interfaces import EmbeddingsGenerator, EmbeddingsResponse from .pipeline import PipelineModel -from .response import EmbeddingsResponse T = TypeVar("T", bound=InputContext) diff --git a/src/max/pipelines/hf_pipeline.py b/src/max/pipelines/hf_pipeline.py index 0d03506701..52f25f6985 100644 --- a/src/max/pipelines/hf_pipeline.py +++ b/src/max/pipelines/hf_pipeline.py @@ -17,7 +17,7 @@ import logging import warnings -from typing import Any, Optional, cast +from typing import Optional, cast import numpy as np import torch @@ -31,9 +31,13 @@ from .config import PipelineConfig from .context import TextContext -from .interfaces import EmbeddingsGenerator, TokenGenerator +from .interfaces import ( + EmbeddingsGenerator, + EmbeddingsResponse, + TextResponse, + TokenGenerator, +) from .kv_cache import ContinuousHFStaticCache -from .response import EmbeddingsResponse, TextResponse logger = logging.getLogger("max.pipelines") @@ -179,7 +183,7 @@ def next_token( generated_tokens = generated_tokens.cpu() # Prepare the response, pruning away completed requests as we go. - res: list[dict[str, Any]] = [{} for i in range(num_steps)] + res: list[dict[str, TextResponse]] = [{} for i in range(num_steps)] for batch_idx, (request_id, context) in enumerate(batch.items()): for step in range(num_steps): next_token_id = generated_tokens[batch_idx, step].item() @@ -362,7 +366,7 @@ def encode( ) # Prepare the response. - res: dict[str, Any] = {} + res: dict[str, EmbeddingsResponse] = {} for batch_index, request_id in enumerate(batch.keys()): request_embeddings = batch_embeddings[batch_index] res[request_id] = EmbeddingsResponse(request_embeddings) diff --git a/src/max/pipelines/interfaces/__init__.py b/src/max/pipelines/interfaces/__init__.py index 9233e609e6..5e0b009eea 100644 --- a/src/max/pipelines/interfaces/__init__.py +++ b/src/max/pipelines/interfaces/__init__.py @@ -16,6 +16,7 @@ from .embeddings_generation import ( EmbeddingsGenerator, ) +from .response import EmbeddingsResponse, LogProbabilities, TextResponse from .tasks import PipelineTask from .text_generation import ( PipelineTokenizer, @@ -29,8 +30,11 @@ ) __all__ = [ + "EmbeddingsResponse", + "LogProbabilities", "PipelineTask", "PipelineTokenizer", + "TextResponse", "TokenGenerator", "TokenGeneratorContext", "TokenGeneratorRequest", diff --git a/src/max/pipelines/response.py b/src/max/pipelines/interfaces/response.py similarity index 100% rename from src/max/pipelines/response.py rename to src/max/pipelines/interfaces/response.py diff --git a/src/max/pipelines/interfaces/text_generation.py b/src/max/pipelines/interfaces/text_generation.py index c2a250a208..ac7b64d1c7 100644 --- a/src/max/pipelines/interfaces/text_generation.py +++ b/src/max/pipelines/interfaces/text_generation.py @@ -28,6 +28,8 @@ runtime_checkable, ) +from .response import TextResponse + class TokenGeneratorRequestFunction(TypedDict): name: str @@ -256,7 +258,7 @@ class TokenGenerator(Generic[TokenGeneratorContext], Protocol): def next_token( self, batch: dict[str, TokenGeneratorContext], num_steps: int - ) -> list[dict[str, Any]]: + ) -> list[dict[str, TextResponse]]: """Computes the next token response for a single batch. Args: @@ -264,7 +266,7 @@ def next_token( num_steps int: Number of tokens to generate. Returns: - list[dict[str, Any]]: List of encoded responses (indexed by req. ID) + list[dict[str, TextResponse]]: List of encoded responses (indexed by req. ID) """ ... diff --git a/src/max/pipelines/pipeline.py b/src/max/pipelines/pipeline.py index 822602fb07..054d6f66c8 100644 --- a/src/max/pipelines/pipeline.py +++ b/src/max/pipelines/pipeline.py @@ -19,7 +19,6 @@ from abc import ABC, abstractmethod from dataclasses import dataclass from typing import ( - Any, Generic, List, Optional, @@ -44,9 +43,8 @@ from .config import PipelineConfig from .context import InputContext -from .interfaces import TokenGenerator +from .interfaces import LogProbabilities, TextResponse, TokenGenerator from .kv_cache import KVCacheManager, KVCacheParams -from .response import LogProbabilities, TextResponse from .sampling import token_sampler try: @@ -563,7 +561,7 @@ def next_token( self, batch: dict[str, T], num_steps: int, - ) -> list[dict[str, Any]]: + ) -> list[dict[str, TextResponse]]: """Provided a batch, process batch inputs, execute the graph for num_steps in a multi-step scenario, then decode the tokens holistically and return the list of decoded tokens. """ @@ -687,7 +685,7 @@ def next_token( tracer.pop() # pops kv_manager.step # Prepare the response, pruning away completed requests as we go. - res: list[dict[str, Any]] = [{} for _ in range(num_steps)] + res: list[dict[str, TextResponse]] = [{} for _ in range(num_steps)] tracer.push("prepare_response") for batch_index, (request_id, context) in enumerate(batch.items()): step = 0 From 39857d9afab81ff481b63e0b5d7615e824bc34e2 Mon Sep 17 00:00:00 2001 From: kcaverly Date: Wed, 26 Feb 2025 16:27:12 -0500 Subject: [PATCH 04/44] [Pipelines] Introduce TextGenerationResponse and TextGenerationStatus These objects will be used in the following PR to harden completion tracking and enable variable length token outputs. MODULAR_ORIG_COMMIT_REV_ID: c8691328e36643a38b43217b338f062bbf1400d0 --- src/max/pipelines/interfaces/__init__.py | 10 +++++++++- src/max/pipelines/interfaces/response.py | 25 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/max/pipelines/interfaces/__init__.py b/src/max/pipelines/interfaces/__init__.py index 5e0b009eea..804d0d8d6c 100644 --- a/src/max/pipelines/interfaces/__init__.py +++ b/src/max/pipelines/interfaces/__init__.py @@ -16,7 +16,13 @@ from .embeddings_generation import ( EmbeddingsGenerator, ) -from .response import EmbeddingsResponse, LogProbabilities, TextResponse +from .response import ( + EmbeddingsResponse, + LogProbabilities, + TextGenerationResponse, + TextGenerationStatus, + TextResponse, +) from .tasks import PipelineTask from .text_generation import ( PipelineTokenizer, @@ -43,4 +49,6 @@ "TokenGeneratorRequestTool", "TokenGeneratorResponseFormat", "EmbeddingsGenerator", + "TextGenerationResponse", + "TextGenerationStatus", ] diff --git a/src/max/pipelines/interfaces/response.py b/src/max/pipelines/interfaces/response.py index 6154570afc..45808c9d72 100644 --- a/src/max/pipelines/interfaces/response.py +++ b/src/max/pipelines/interfaces/response.py @@ -16,6 +16,7 @@ from __future__ import annotations from dataclasses import dataclass +from enum import Enum import numpy as np @@ -100,3 +101,27 @@ class EmbeddingsResponse: """Container for the response from embeddings pipeline.""" embeddings: np.ndarray + + +class TextGenerationStatus(str, Enum): + ACTIVE = "active" + END_OF_SEQUENCE = "end_of_sequence" + MAXIMUM_LENGTH = "maximum_length" + + @property + def is_done(self) -> bool: + return self is not TextGenerationStatus.ACTIVE + + +class TextGenerationResponse: + def __init__( + self, tokens: list[TextResponse], final_status: TextGenerationStatus + ) -> None: + self.tokens = tokens + self.final_status = final_status + + def is_done(self) -> bool: + return self.final_status.is_done + + def append_token(self, token: TextResponse) -> None: + self.tokens.append(token) From 5f1d2d298b13ddd347c7da39aa9d498597e409f9 Mon Sep 17 00:00:00 2001 From: Frank <139076616+frspokan@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:52:29 -0800 Subject: [PATCH 05/44] [Serve] Prevent busted version of OTEL prometheus pkg from installing (#56291) They accidentally published a broken package 1.12.0rc1 which is getting installed in the serving container (but not Bazel). The latest good version is 0.51b0. MODULAR_ORIG_COMMIT_REV_ID: 412ae88ccea58f10c4fe0648484ccc4a8f84882b --- src/max/pipelines/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/max/pipelines/requirements.txt b/src/max/pipelines/requirements.txt index 708e101b5b..dc050dddf6 100644 --- a/src/max/pipelines/requirements.txt +++ b/src/max/pipelines/requirements.txt @@ -22,7 +22,7 @@ httpx>=0.28.1,<0.29 huggingface-hub>=0.24.0 opentelemetry-api>=1.29.0 opentelemetry-exporter-otlp-proto-http>=1.27.0 -opentelemetry-exporter-prometheus>=0.48b0 +opentelemetry-exporter-prometheus<1.0.0 opentelemetry-sdk>=1.29.0 pillow>=10.3.0 prometheus-async>=22.2.0 From efe686e8a1d587352dda1ac93e5bcc08f825c2dd Mon Sep 17 00:00:00 2001 From: Brendan Duke Date: Wed, 26 Feb 2025 18:51:38 -0500 Subject: [PATCH 06/44] [SDK] Add a Signals.buffers method Add a `Signals.buffers` method as a convenient way of passing runtime signal buffers (as driver tensors). MODULAR_ORIG_COMMIT_REV_ID: 2c6f6fcf46a31b40a0de921781ae1db2a3ecf3c1 --- src/max/pipelines/nn/comm/allreduce.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/max/pipelines/nn/comm/allreduce.py b/src/max/pipelines/nn/comm/allreduce.py index 3ab64efaa0..40d7838049 100644 --- a/src/max/pipelines/nn/comm/allreduce.py +++ b/src/max/pipelines/nn/comm/allreduce.py @@ -14,8 +14,9 @@ from collections.abc import Iterable +from max.driver import Accelerator, Tensor from max.dtype import DType -from max.graph import BufferType, DeviceRef +from max.graph import BufferType, DeviceKind, DeviceRef class Signals: @@ -32,14 +33,31 @@ class Signals: # Mojo struct + the size of the intermediate buffer for communication. devices: list[DeviceRef] - """List of devices that these signals communicate between.""" + """List of graph devices that these signals communicate between.""" def __init__(self, devices: Iterable[DeviceRef]) -> None: """ Args: - devices: Devices between which these signals communicate. + num_gpus: Number of GPUs involved in the allreduce. """ - self.devices = list(devices) + # Convert the iterable to a list since we iterate over it twice. + devices = list(devices) + if not all(dev.device_type == DeviceKind.GPU for dev in devices): + msg = "peer-to-peer signals should be constructed for accelerators" + raise TypeError(msg) + + self.devices = devices + + def buffers(self) -> list[Tensor]: + """Allocates and returns buffers used for communication in allreduce.""" + return [ + Tensor.zeros( + shape=(Signals.NUM_BYTES,), + dtype=DType.uint8, + device=Accelerator(id=dev.id), + ) + for dev in self.devices + ] def input_types(self) -> list[BufferType]: """Gets graph input types corresponding to these signal buffers.""" From f004ee3153e0276c4c216be8f2426eedb25c6886 Mon Sep 17 00:00:00 2001 From: Zheng Hao Tan Date: Wed, 26 Feb 2025 16:42:03 -0800 Subject: [PATCH 07/44] [Pipelines][KV Cache] Wrap KVCacheInputs under ModelInputs This tucks all `ModelInputs` into one coherent object and can be passed into an `.execute()` function like `model_outputs = execute(model_inputs)` MODULAR_ORIG_COMMIT_REV_ID: bea806b8c14c77d5548d1e9df2002d03138829a3 --- .../pipelines/architectures/llama3/model.py | 31 +++++++++---- .../llama_vision/llama_vision.py | 36 +++++++++++---- .../pipelines/architectures/mistral/model.py | 15 +++--- .../pipelines/architectures/mpnet/model.py | 10 ++-- .../architectures/pixtral/pixtral.py | 12 +++-- .../pipelines/architectures/qwen2/model.py | 29 ++++++++---- .../pipelines/architectures/replit/model.py | 17 +++++-- src/max/pipelines/embeddings_pipeline.py | 8 ++-- src/max/pipelines/pipeline.py | 46 +++++++++++-------- 9 files changed, 136 insertions(+), 68 deletions(-) diff --git a/src/max/pipelines/architectures/llama3/model.py b/src/max/pipelines/architectures/llama3/model.py index eeff3afa16..deb5de0c32 100644 --- a/src/max/pipelines/architectures/llama3/model.py +++ b/src/max/pipelines/architectures/llama3/model.py @@ -77,6 +77,7 @@ def __init__( tokens: np.ndarray | Tensor, input_row_offsets_or_attn_mask: np.ndarray | Tensor, signal_buffers: list[Tensor], + kv_cache_inputs: KVCacheInputs | None = None, ) -> None: """ Args: @@ -89,6 +90,7 @@ def __init__( self.tokens = tokens self.input_row_offsets_or_attn_mask = input_row_offsets_or_attn_mask self.signal_buffers = signal_buffers + self.kv_cache_inputs = kv_cache_inputs @property def input_row_offsets(self) -> np.ndarray | Tensor: @@ -164,16 +166,14 @@ def get_num_layers(cls, pipeline_config: PipelineConfig) -> int: def execute( self, model_inputs: ModelInputs, - kv_cache_inputs: KVCacheInputs | None = None, ) -> ModelOutputs: model_inputs = cast(Llama3Inputs, model_inputs) - if kv_cache_inputs is None: - kv_cache_inputs = () # type: ignore + curr_kv_cache_inputs = model_inputs.kv_cache_inputs or () model_outputs = self.model.execute( model_inputs.tokens, model_inputs.input_row_offsets_or_attn_mask, *model_inputs.signal_buffers, - *kv_cache_inputs, # type: ignore + *curr_kv_cache_inputs, copy_inputs_to_device=( not self.pipeline_config.cache_strategy.uses_opaque() ), @@ -190,7 +190,9 @@ def execute( ) def _prepare_ragged_initial_token_inputs( - self, context_batch: Sequence[TextContext] + self, + context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> Llama3Inputs: # Get input_row_offsets: start and end position of each batch in the # combined total_seq_len dimension. @@ -210,10 +212,13 @@ def _prepare_ragged_initial_token_inputs( input_row_offsets ).to(self.pipeline_config.devices[0]), signal_buffers=self.signal_buffers, + kv_cache_inputs=kv_cache_inputs, ) def _prepare_padded_initial_token_inputs( - self, context_batch: Sequence[TextContext] + self, + context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> Llama3Inputs: # Get tokens and seq_ids tokens = [ctx.next_tokens for ctx in context_batch] @@ -231,16 +236,23 @@ def _prepare_padded_initial_token_inputs( tokens=next_tokens_batch, input_row_offsets_or_attn_mask=attn_mask, signal_buffers=self.signal_buffers, + kv_cache_inputs=kv_cache_inputs, ) def prepare_initial_token_inputs( - self, context_batch: Sequence[TextContext] + self, + context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> Llama3Inputs: """Prepare the inputs for the first pass in multistep execution.""" if self.pipeline_config.cache_strategy.uses_opaque(): - return self._prepare_ragged_initial_token_inputs(context_batch) + return self._prepare_ragged_initial_token_inputs( + context_batch, kv_cache_inputs + ) else: - return self._prepare_padded_initial_token_inputs(context_batch) + return self._prepare_padded_initial_token_inputs( + context_batch, kv_cache_inputs + ) def _prepare_ragged_next_token_inputs( self, @@ -256,6 +268,7 @@ def _prepare_ragged_next_token_inputs( tokens=next_tokens, input_row_offsets_or_attn_mask=next_row_offsets, signal_buffers=self.signal_buffers, + kv_cache_inputs=prev_model_inputs.kv_cache_inputs, ) def prepare_next_token_inputs( diff --git a/src/max/pipelines/architectures/llama_vision/llama_vision.py b/src/max/pipelines/architectures/llama_vision/llama_vision.py index 3dc23904eb..accd5f919a 100644 --- a/src/max/pipelines/architectures/llama_vision/llama_vision.py +++ b/src/max/pipelines/architectures/llama_vision/llama_vision.py @@ -433,6 +433,7 @@ def __init__( pixel_values: Tensor | None = None, aspect_ratio_ids: Tensor | None = None, aspect_ratio_mask: Tensor | None = None, + kv_cache_inputs: KVCacheInputs | None = None, ): self.input_id_values = input_id_values self.input_row_offsets = input_row_offsets @@ -441,6 +442,7 @@ def __init__( self._pixel_values = pixel_values self._aspect_ratio_ids = aspect_ratio_ids self._aspect_ratio_mask = aspect_ratio_mask + self.kv_cache_inputs = kv_cache_inputs def __post_init__(self) -> None: """Validate consistency between vision fields. @@ -486,7 +488,10 @@ def aspect_ratio_mask(self) -> Tensor: return self._aspect_ratio_mask def update_for_next_token( - self, next_tokens: Tensor, next_row_offsets: Tensor + self, + next_tokens: Tensor, + next_row_offsets: Tensor, + kv_cache_inputs: KVCacheInputs | None = None, ) -> LlamaVisionInputs: """Updates next_tokens and row_offsets after an initial step.""" return LlamaVisionInputs( @@ -498,6 +503,7 @@ def update_for_next_token( pixel_values=None, aspect_ratio_ids=None, aspect_ratio_mask=None, + kv_cache_inputs=kv_cache_inputs, ) @@ -879,6 +885,7 @@ def _prepare_vision_inputs( def prepare_initial_token_inputs( self, context_batch: Sequence[TextAndVisionContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> LlamaVisionInputs: """Creates tensors of token and image inputs, if applicable.""" if self.pipeline_config.cache_strategy != KVCacheStrategy.CONTINUOUS: @@ -963,6 +970,7 @@ def initial_prompt_missing_image(ctx: TextAndVisionContext) -> bool: pixel_values=pixel_values, aspect_ratio_ids=aspect_ratio_ids, aspect_ratio_mask=aspect_ratio_mask, + kv_cache_inputs=kv_cache_inputs, ) def prepare_next_token_inputs( @@ -980,15 +988,17 @@ def prepare_next_token_inputs( : prev_inputs.input_row_offsets.shape[0] ] - return prev_inputs.update_for_next_token(next_tokens, next_row_offsets) + return prev_inputs.update_for_next_token( + next_tokens, next_row_offsets, prev_inputs.kv_cache_inputs + ) def execute( self, model_inputs: ModelInputs, - # TODO(zheng): This should be folded as KVCacheInputs into ModelInputs. - kv_cache_inputs: Optional[KVCacheInputs] = None, ) -> ModelOutputs: - assert kv_cache_inputs is not None + assert model_inputs.kv_cache_inputs is not None, ( + "Llama Vision has KV cache inputs" + ) # batch_size * num_concurrent_media * max_num_tiles * num_patches # are set to 0 here to imitate a dummy tensor (used in text-only mode). cross_attention_states = Tensor.zeros( @@ -1009,11 +1019,19 @@ def execute( cross_attention_states = exec_result all_kv_cache_inputs: list[Tensor] = [] - if isinstance(kv_cache_inputs, MultimodalKVCacheInputs): - all_kv_cache_inputs.extend(kv_cache_inputs.text_kv_cache_inputs) - all_kv_cache_inputs.extend(kv_cache_inputs.vision_kv_cache_inputs) + if isinstance(model_inputs.kv_cache_inputs, MultimodalKVCacheInputs): + all_kv_cache_inputs.extend( + model_inputs.kv_cache_inputs.text_kv_cache_inputs + ) + all_kv_cache_inputs.extend( + model_inputs.kv_cache_inputs.vision_kv_cache_inputs + ) + elif isinstance(model_inputs.kv_cache_inputs, KVCacheInputs): + all_kv_cache_inputs = list(model_inputs.kv_cache_inputs) else: - all_kv_cache_inputs = list(kv_cache_inputs) + raise ValueError( + f"Unsupported kv_cache_inputs type: {type(model_inputs.kv_cache_inputs)}" + ) model_outputs = self.language_model.execute( cross_attention_states, diff --git a/src/max/pipelines/architectures/mistral/model.py b/src/max/pipelines/architectures/mistral/model.py index 69ba410ffa..357cd5b132 100644 --- a/src/max/pipelines/architectures/mistral/model.py +++ b/src/max/pipelines/architectures/mistral/model.py @@ -57,9 +57,11 @@ def __init__( self, input_tokens: Tensor, input_row_offsets: Tensor, + kv_cache_inputs: KVCacheInputs | None = None, ) -> None: self.input_tokens = input_tokens self.input_row_offsets = input_row_offsets + self.kv_cache_inputs = kv_cache_inputs class MistralModel(PipelineModel[TextContext]): @@ -69,20 +71,16 @@ def __init__( super().__init__(pipeline_config, session) self.model = self.load_model(session) - def execute( - self, - model_inputs: ModelInputs, - kv_cache_inputs: KVCacheInputs | None = None, - ) -> ModelOutputs: + def execute(self, model_inputs: ModelInputs) -> ModelOutputs: """Runs the graph.""" model_inputs = cast(MistralInputs, model_inputs) - assert kv_cache_inputs is not None, ( + assert model_inputs.kv_cache_inputs is not None, ( "Mistral has KV cache inputs, but none were provided" ) model_outputs = self.model.execute( model_inputs.input_tokens, model_inputs.input_row_offsets, - *kv_cache_inputs, + *model_inputs.kv_cache_inputs, copy_inputs_to_device=False, ) assert isinstance(model_outputs[0], Tensor) @@ -91,6 +89,7 @@ def execute( def prepare_initial_token_inputs( self, context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> MistralInputs: # Get tokens and seq ids tokens = [ctx.next_tokens for ctx in context_batch] @@ -113,6 +112,7 @@ def prepare_initial_token_inputs( return MistralInputs( input_tokens=next_tokens_batch, input_row_offsets=input_row_offsets, + kv_cache_inputs=kv_cache_inputs, ) def prepare_next_token_inputs( @@ -126,6 +126,7 @@ def prepare_next_token_inputs( return MistralInputs( input_tokens=next_tokens, input_row_offsets=next_row_offsets, + kv_cache_inputs=prev_model_inputs.kv_cache_inputs, ) @classmethod diff --git a/src/max/pipelines/architectures/mpnet/model.py b/src/max/pipelines/architectures/mpnet/model.py index 72180fe367..7a1df30d8f 100644 --- a/src/max/pipelines/architectures/mpnet/model.py +++ b/src/max/pipelines/architectures/mpnet/model.py @@ -61,6 +61,8 @@ def __init__( ) -> None: self.next_tokens_batch = next_tokens_batch self.attention_mask = attention_mask + # MPNet does not have KV cache inputs. + self.kv_cache_inputs = None class MPNetPipelineModel(PipelineModel[TextContext]): @@ -103,13 +105,8 @@ def calculate_max_seq_len(cls, pipeline_config: PipelineConfig) -> int: ) raise ValueError(msg) from e - def execute( - self, - model_inputs: ModelInputs, - kv_cache_inputs: KVCacheInputs | None = None, - ) -> ModelOutputs: + def execute(self, model_inputs: ModelInputs) -> ModelOutputs: model_inputs = cast(MPNetInputs, model_inputs) - assert kv_cache_inputs is None, "MPNet does not have KV cache inputs" model_outputs = self.model.execute( model_inputs.next_tokens_batch, model_inputs.attention_mask, @@ -121,6 +118,7 @@ def execute( def prepare_initial_token_inputs( self, context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> MPNetInputs: # Get tokens and seq_ids. tokens = [ctx.next_tokens for ctx in context_batch] diff --git a/src/max/pipelines/architectures/pixtral/pixtral.py b/src/max/pipelines/architectures/pixtral/pixtral.py index 31f4e13682..95102c3d89 100644 --- a/src/max/pipelines/architectures/pixtral/pixtral.py +++ b/src/max/pipelines/architectures/pixtral/pixtral.py @@ -61,11 +61,13 @@ def __init__( input_row_offsets: Tensor, pixel_values: Tensor | None = None, attention_mask: Tensor | None = None, + kv_cache_inputs: KVCacheInputs | None = None, ): self.input_ids = input_ids self.input_row_offsets = input_row_offsets self._pixel_values = pixel_values self._attention_mask = attention_mask + self.kv_cache_inputs = kv_cache_inputs @property def has_vision_inputs(self) -> bool: @@ -99,8 +101,6 @@ def __init__( def execute( self, model_inputs: ModelInputs, - # TODO(zheng): This should be folded as KVCacheInputs into ModelInputs. - kv_cache_inputs: KVCacheInputs | None = None, ) -> ModelOutputs: model_inputs = cast(PixtralInputs, model_inputs) if model_inputs.has_vision_inputs: @@ -119,14 +119,14 @@ def execute( ], dtype=self.pipeline_config.dtype, ).to(self.pipeline_config.devices[0]) - assert kv_cache_inputs is not None, ( + assert model_inputs.kv_cache_inputs is not None, ( "Pixtral has KV cache inputs, but none were provided" ) model_outputs = self.language_model.execute( model_inputs.input_ids, image_embeds, model_inputs.input_row_offsets, - *kv_cache_inputs, + *model_inputs.kv_cache_inputs, copy_inputs_to_device=False, ) assert not self.pipeline_config.enable_echo @@ -136,6 +136,7 @@ def execute( def prepare_initial_token_inputs( self, context_batch: Sequence[TextAndVisionContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> PixtralInputs: # Input row offset type: ["input_row_offsets_len"], UInt32 input_row_offsets = Tensor.from_numpy( @@ -182,11 +183,13 @@ def prepare_initial_token_inputs( input_row_offsets=input_row_offsets, pixel_values=pixel_values, attention_mask=attention_mask, + kv_cache_inputs=kv_cache_inputs, ) return PixtralInputs( input_ids=input_ids, input_row_offsets=input_row_offsets, + kv_cache_inputs=kv_cache_inputs, ) def prepare_next_token_inputs( @@ -204,6 +207,7 @@ def prepare_next_token_inputs( return PixtralInputs( input_ids=next_tokens, input_row_offsets=next_row_offsets, + kv_cache_inputs=prev_model_inputs.kv_cache_inputs, ) @classmethod diff --git a/src/max/pipelines/architectures/qwen2/model.py b/src/max/pipelines/architectures/qwen2/model.py index 526234d031..3d26a468d1 100644 --- a/src/max/pipelines/architectures/qwen2/model.py +++ b/src/max/pipelines/architectures/qwen2/model.py @@ -62,9 +62,11 @@ def __init__( self, tokens: Tensor, input_row_offsets_or_attn_mask: Tensor, + kv_cache_inputs: KVCacheInputs | None = None, ) -> None: self.tokens = tokens self.input_row_offsets_or_attn_mask = input_row_offsets_or_attn_mask + self.kv_cache_inputs = kv_cache_inputs @property def input_row_offsets(self) -> Tensor: @@ -83,15 +85,13 @@ def __init__( def execute( self, model_inputs: ModelInputs, - kv_cache_inputs: KVCacheInputs | None = None, ) -> ModelOutputs: - assert kv_cache_inputs is not None - model_inputs = cast(Qwen2Inputs, model_inputs) + assert model_inputs.kv_cache_inputs is not None model_outputs = self.model.execute( model_inputs.tokens, model_inputs.input_row_offsets_or_attn_mask, - *kv_cache_inputs, + *model_inputs.kv_cache_inputs, copy_inputs_to_device=( not self.pipeline_config.cache_strategy.uses_opaque() ), @@ -113,7 +113,9 @@ def execute( return ModelOutputs(next_token_logits=model_outputs[0]) def _prepare_ragged_initial_token_inputs( - self, context_batch: Sequence[TextContext] + self, + context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> Qwen2Inputs: # Get input_row_offsets: start and end position of each batch in the # combined total_seq_len dimension. @@ -132,10 +134,13 @@ def _prepare_ragged_initial_token_inputs( input_row_offsets_or_attn_mask=Tensor.from_numpy( input_row_offsets ).to(self.pipeline_config.devices[0]), + kv_cache_inputs=kv_cache_inputs, ) def _prepare_padded_initial_token_inputs( - self, context_batch: Sequence[TextContext] + self, + context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> Qwen2Inputs: # Get tokens and seq_ids tokens = [ctx.next_tokens for ctx in context_batch] @@ -156,18 +161,24 @@ def _prepare_padded_initial_token_inputs( input_row_offsets_or_attn_mask=Tensor.from_numpy(attn_mask).to( self.pipeline_config.devices[0] ), + kv_cache_inputs=kv_cache_inputs, ) # Ignored type due to challenge with Interface implementation and mypy rules. def prepare_initial_token_inputs( self, context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> Qwen2Inputs: """Prepare the inputs for the first pass in multistep execution.""" if self.pipeline_config.cache_strategy.uses_opaque(): - return self._prepare_ragged_initial_token_inputs(context_batch) + return self._prepare_ragged_initial_token_inputs( + context_batch, kv_cache_inputs + ) else: - return self._prepare_padded_initial_token_inputs(context_batch) + return self._prepare_padded_initial_token_inputs( + context_batch, kv_cache_inputs + ) def _prepare_ragged_next_token_inputs( self, @@ -182,6 +193,7 @@ def _prepare_ragged_next_token_inputs( return Qwen2Inputs( tokens=next_tokens, input_row_offsets_or_attn_mask=next_row_offsets, + kv_cache_inputs=prev_model_inputs.kv_cache_inputs, ) def _prepare_padded_next_token_inputs( @@ -206,6 +218,7 @@ def _prepare_padded_next_token_inputs( input_row_offsets_or_attn_mask=Tensor.from_numpy(attn_mask).to( self.pipeline_config.devices[0] ), + kv_cache_inputs=prev_model_inputs.kv_cache_inputs, ) def prepare_next_token_inputs( diff --git a/src/max/pipelines/architectures/replit/model.py b/src/max/pipelines/architectures/replit/model.py index 211d63a840..3c2a42a208 100644 --- a/src/max/pipelines/architectures/replit/model.py +++ b/src/max/pipelines/architectures/replit/model.py @@ -61,9 +61,11 @@ def __init__( self, tokens: Tensor, input_row_offsets: Tensor, + kv_cache_inputs: KVCacheInputs | None = None, ) -> None: self.tokens = tokens self.input_row_offsets = input_row_offsets + self.kv_cache_inputs = kv_cache_inputs class ReplitModel(PipelineModel[TextContext]): @@ -80,14 +82,16 @@ def __init__( def execute( self, model_inputs: ModelInputs, - kv_cache_inputs: KVCacheInputs | None = None, ) -> ModelOutputs: model_inputs = cast(ReplitInputs, model_inputs) - assert kv_cache_inputs is not None, "Replit has KV cache inputs" + # keep mypy happy. + assert model_inputs.kv_cache_inputs is not None, ( + "Replit has KV cache inputs" + ) model_outputs = self.model.execute( model_inputs.tokens, model_inputs.input_row_offsets, - *kv_cache_inputs, + *model_inputs.kv_cache_inputs, copy_inputs_to_device=False, ) if self.pipeline_config.enable_echo: @@ -105,6 +109,7 @@ def execute( def prepare_initial_token_inputs( self, context_batch: Sequence[TextContext], + kv_cache_inputs: KVCacheInputs | None = None, ) -> ReplitInputs: # Get input_row_offsets: start and end position of each batch in the # combined total_seq_len dimension. @@ -116,6 +121,10 @@ def prepare_initial_token_inputs( # Create a ragged token vector of length: sum(len(t) for t in tokens). tokens = np.concatenate([ctx.next_tokens for ctx in context_batch]) + if kv_cache_inputs is None: + raise ValueError( + "Replit has KV cache inputs, but got None instead." + ) return ReplitInputs( tokens=Tensor.from_numpy(tokens).to( self.pipeline_config.devices[0] @@ -123,6 +132,7 @@ def prepare_initial_token_inputs( input_row_offsets=Tensor.from_numpy(input_row_offsets).to( self.pipeline_config.devices[0] ), + kv_cache_inputs=kv_cache_inputs, ) def prepare_next_token_inputs( @@ -136,6 +146,7 @@ def prepare_next_token_inputs( return ReplitInputs( tokens=next_tokens, input_row_offsets=next_row_offsets, + kv_cache_inputs=prev_model_inputs.kv_cache_inputs, ) @classmethod diff --git a/src/max/pipelines/embeddings_pipeline.py b/src/max/pipelines/embeddings_pipeline.py index fa609ef7f1..0c2bb35e8f 100644 --- a/src/max/pipelines/embeddings_pipeline.py +++ b/src/max/pipelines/embeddings_pipeline.py @@ -59,13 +59,13 @@ def encode(self, batch: dict[str, T]) -> dict[str, EmbeddingsResponse]: tracer.next("prepare_initial_token_inputs") # Prepare inputs for the first token in multistep execution. model_inputs = self._pipeline_model.prepare_initial_token_inputs( - context_batch + context_batch=context_batch, + kv_cache_inputs=None, ) tracer.next("execute") - model_outputs = self._pipeline_model.execute( - model_inputs=model_inputs, kv_cache_inputs=None - ) + model_outputs = self._pipeline_model.execute(model_inputs) + assert model_outputs.logits # Do the copy to host for each token generated. tracer.next("logits.to(CPU())") diff --git a/src/max/pipelines/pipeline.py b/src/max/pipelines/pipeline.py index 054d6f66c8..b42e9b7f48 100644 --- a/src/max/pipelines/pipeline.py +++ b/src/max/pipelines/pipeline.py @@ -20,7 +20,6 @@ from dataclasses import dataclass from typing import ( Generic, - List, Optional, Protocol, Sequence, @@ -119,6 +118,8 @@ class ModelInputs: True """ + kv_cache_inputs: KVCacheInputs | None = None + @dataclass(frozen=True) class ModelOutputs: @@ -240,16 +241,12 @@ def estimate_weights_size(cls, pipeline_config: PipelineConfig) -> int: def execute( self, model_inputs: ModelInputs, - # TODO(zheng): This should be tucked inside ModelInputs in the future. - kv_cache_inputs: KVCacheInputs | None = None, ) -> ModelOutputs: """Executes the graph with the given inputs. Args: model_inputs: The model inputs to execute, containing tensors and any other required data for model execution. - kv_cache_inputs: The kv cache inputs to execute, containing tensors and any other - required data for model execution. Returns: ModelOutputs containing the pipeline's output tensors. @@ -260,7 +257,9 @@ def execute( @abstractmethod def prepare_initial_token_inputs( - self, context_batch: Sequence[T] + self, + context_batch: Sequence[T], + kv_cache_inputs: KVCacheInputs | None = None, ) -> ModelInputs: """Prepares the initial inputs to be passed to `.execute()`. @@ -268,7 +267,8 @@ def prepare_initial_token_inputs( For example, the model inputs could include: - Encoded tensors - A unique IDs for each tensor if this model uses a KV Cache manager. - + - kv_cache_inputs: The kv cache inputs required for the model. This + should be None if the model does not use KV Cache. This function would batch the encoded tensors, claim a slot in the kv cache if the ID hasn't been seen before, and return the inputs and caches as a list of tensors.""" @@ -445,7 +445,7 @@ def prepare_batch( self, batch: list[T], num_steps: int, - ) -> tuple[ModelInputs, List[KVCacheInputs], int, Optional[torch.Tensor]]: + ) -> tuple[ModelInputs, int, Optional[torch.Tensor]]: tracer: Tracer = Tracer("prepare_batch") if self._pipeline_config.enable_structured_output: @@ -532,8 +532,12 @@ def prepare_batch( ) return ( - self._pipeline_model.prepare_initial_token_inputs(batch), - kv_cache_inputs, + self._pipeline_model.prepare_initial_token_inputs( + context_batch=batch, + kv_cache_inputs=KVCacheInputsSequence( + kv_cache_inputs=kv_cache_inputs + ), + ), num_steps, bitmask, ) @@ -578,8 +582,8 @@ def next_token( ] # Prepare the batch. - model_inputs, batched_kv_cache_inputs, num_steps, bitmask = ( - self.prepare_batch(context_batch, num_steps) + model_inputs, num_steps, bitmask = self.prepare_batch( + context_batch, num_steps ) # Multistep execution loop. @@ -599,9 +603,6 @@ def next_token( # Execute the model and get next tokens. model_outputs = self._pipeline_model.execute( model_inputs=curr_step_inputs, - kv_cache_inputs=KVCacheInputsSequence( - kv_cache_inputs=batched_kv_cache_inputs, - ), ) assert model_outputs.next_token_logits is not None next_token_logits = model_outputs.next_token_logits @@ -656,13 +657,22 @@ def next_token( break # Prepare inputs for the next token in multistep execution tracer.next("increment_cache_lengths") # pops sample_next_token - # Unpack model inputs for execute() call by getting all fields - batched_kv_cache_inputs = ( + + assert isinstance( + curr_step_inputs.kv_cache_inputs, KVCacheInputsSequence + ), ( + "prepare_batch instantiates and passes this as a KVCacheInputsSequence" + ) + assert isinstance( + curr_step_inputs.kv_cache_inputs.kv_cache_inputs, list + ), "increment_cache_lengths instantiates and passes this as a list" + curr_step_inputs.kv_cache_inputs.kv_cache_inputs = ( self._pipeline_model.kv_manager.increment_cache_lengths( - batched_kv_cache_inputs, # type: ignore + curr_step_inputs.kv_cache_inputs.kv_cache_inputs, curr_step_inputs, ) ) + tracer.next("prepare_next_token_inputs") # pops inc_cache_lengths curr_step_inputs = self._pipeline_model.prepare_next_token_inputs( new_tokens, curr_step_inputs From 4c20b5768e8672e512b0115d92580e45423627ed Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Wed, 26 Feb 2025 20:53:38 -0500 Subject: [PATCH 08/44] [max-examples] Add dedicated benchmark file for custom ops This moves the benchmark out of the top_k.mojo kernel and into a dedicated file, which imports the custom op, sets up ManagedTensorSlices and passes them to the `execute` function. This also enabled comparing GPU to CPU results. Added a couple of ctors to `DeviceContextPtr` to enable passing `Device` and `DeviceContext` from CPU/GPU. Working on adding matmul to the same benchmark file, and allowing the user to select specific benchmarks by passing an argument e.g. `magic run benchmark top_k`. Currently looks like: ``` ------------------------------------------------------------- | name | met (ms) | iters | GFLOPS/s | GElems/s | ------------------------------------------------------------- | top_k_custom/cpu | 2.291646 | 524 | 2.094 | 0.418 | | top_k_custom/gpu | 0.138753 | 8648 | 34.593 | 6.918 | ------------------------------------------------------------- ``` MODULAR_ORIG_COMMIT_REV_ID: bb0e346e4ff84e04830d7385ae48b75bc20a41f0 --- examples/custom_ops/README.md | 6 ++ examples/custom_ops/benchmarks.mojo | 135 ++++++++++++++++++++++++ examples/custom_ops/kernels/top_k.mojo | 137 ++++++------------------- examples/custom_ops/mojoproject.toml | 3 +- examples/custom_ops/top_k.py | 16 --- 5 files changed, 176 insertions(+), 121 deletions(-) create mode 100644 examples/custom_ops/benchmarks.mojo diff --git a/examples/custom_ops/README.md b/examples/custom_ops/README.md index 31825508ca..b3ff1d9910 100644 --- a/examples/custom_ops/README.md +++ b/examples/custom_ops/README.md @@ -53,3 +53,9 @@ The execution has two phases: first a `kernels.mojopkg` is compiled from the custom Mojo kernel, and then the graph is constructed and run in Python. The inference session is pointed to the `kernels.mojopkg` in order to load the custom operations. + +You can also run benchmarks to compare the performance of your GPU to your CPU: + +```sh +magic run benchmark +``` diff --git a/examples/custom_ops/benchmarks.mojo b/examples/custom_ops/benchmarks.mojo new file mode 100644 index 0000000000..c768958981 --- /dev/null +++ b/examples/custom_ops/benchmarks.mojo @@ -0,0 +1,135 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from kernels import TopK +from gpu.host import DeviceContext +from utils import IndexList +from max.driver.device import cpu_device +from max.tensor import ( + ManagedTensorSlice, + InputTensor, + OutputTensor, + StaticTensorSpec, +) +from random import rand +from memory import UnsafePointer +from runtime.asyncrt import DeviceContextPtr +from benchmark import ThroughputMeasure, BenchId, BenchMetric, Bench, Bencher +from bit import log2_floor +from sys import sizeof, has_nvidia_gpu_accelerator, has_amd_gpu_accelerator +from memory import AddressSpace + + +def top_k(): + alias batch_size = 30_000 + alias K = 32 + alias els = batch_size * K + alias rank = 2 + alias shape = IndexList[rank](batch_size, K) + alias val_dtype = DType.float32 + alias idx_dtype = DType.int32 + + # Slightly better performance compared to `create_unknown`. Using global + # address space doesn't improve perf for GPU. + alias val_spec = StaticTensorSpec[val_dtype, rank]( + shape=(batch_size, K), + strides=(K, 1), + alignment=sizeof[val_dtype](), + address_space=AddressSpace.GENERIC, + exclusive=True, + in_lambda=None, + out_lambda=None, + ) + alias idx_spec = StaticTensorSpec[idx_dtype, rank]( + shape=(batch_size, K), + strides=(K, 1), + alignment=sizeof[idx_dtype](), + address_space=AddressSpace.GENERIC, + exclusive=True, + in_lambda=None, + out_lambda=None, + ) + + var in_vals = UnsafePointer[Scalar[val_dtype]].alloc(els) + var out_vals = UnsafePointer[Scalar[val_dtype]].alloc(els) + var out_idxs = UnsafePointer[Scalar[idx_dtype]].alloc(els) + + rand(in_vals, els) + + @parameter + @always_inline + fn bench_cpu(mut b: Bencher) raises: + var cpu_ctx_ptr = cpu_device().unsafe_ptr() + + @parameter + @always_inline + fn run_bench() raises: + TopK.execute[K=K, target="cpu"]( + out_vals=OutputTensor[static_spec=val_spec](out_vals, shape), + out_idxs=OutputTensor[static_spec=idx_spec](out_idxs, shape), + in_vals=InputTensor[static_spec=val_spec](in_vals, shape), + ctx=cpu_ctx_ptr, + ) + + b.iter[run_bench]() + + var flops = ThroughputMeasure(BenchMetric.flops, els * log2_floor(K)) + var elements = ThroughputMeasure(BenchMetric.elements, els) + + var b = Bench() + b.bench_function[bench_cpu](BenchId("top_k_custom", "cpu"), flops, elements) + + @parameter + if has_nvidia_gpu_accelerator() or has_amd_gpu_accelerator(): + var gpu_ctx = DeviceContext() + var dev_in_vals = gpu_ctx.enqueue_create_buffer[val_dtype](els) + var dev_out_vals = gpu_ctx.enqueue_create_buffer[val_dtype](els) + var dev_out_idxs = gpu_ctx.enqueue_create_buffer[idx_dtype](els) + gpu_ctx.copy(dev_in_vals, in_vals) + + @parameter + @always_inline + fn bench_gpu(mut b: Bencher) raises: + @parameter + @always_inline + fn kernel_launch() raises: + TopK.execute[K=K, target="gpu"]( + out_vals=OutputTensor[static_spec=val_spec]( + dev_out_vals.unsafe_ptr(), shape + ), + out_idxs=OutputTensor[static_spec=idx_spec]( + dev_out_idxs.unsafe_ptr(), shape + ), + in_vals=InputTensor[static_spec=val_spec]( + dev_in_vals.unsafe_ptr(), shape + ), + ctx=gpu_ctx, + ) + + b.iter[kernel_launch]() + + b.bench_function[bench_gpu]( + BenchId("top_k_custom", "gpu"), flops, elements + ) + _ = gpu_ctx + + b.config.verbose_metric_names = False + print(b) + + in_vals.free() + out_vals.free() + out_idxs.free() + + +def main(): + top_k() diff --git a/examples/custom_ops/kernels/top_k.mojo b/examples/custom_ops/kernels/top_k.mojo index 7a03e23d18..0035212533 100644 --- a/examples/custom_ops/kernels/top_k.mojo +++ b/examples/custom_ops/kernels/top_k.mojo @@ -13,17 +13,13 @@ from math import iota from sys import alignof, sizeof, num_physical_cores - from algorithm import parallelize_over_rows from bit import log2_floor from compiler import register -from gpu import WARP_SIZE, barrier -import gpu.warp as warp +from gpu import WARP_SIZE, barrier, warp from gpu.memory import AddressSpace, external_memory from max.tensor import ManagedTensorSlice from memory import Span -from benchmark import Bench, Bencher, BenchId, BenchMetric, ThroughputMeasure - from utils.index import IndexList from utils.numerics import min_or_neg_inf @@ -63,11 +59,14 @@ struct TopK: ctx: DeviceContextPtr, ) raises: constrained[rank == 2, "rank must be 2"]() + constrained[ + not (target == "gpu" and K > WARP_SIZE), + "K can't be larger than warp size", + ]() + var shape = in_vals.shape() var batch_size = shape[0] - var dev_ctx = ctx.get_device_context() - print("Executing on device:", dev_ctx.name()) @parameter fn top_k_gpu[ @@ -124,106 +123,36 @@ struct TopK: top_k_sram[index].val = min_or_neg_inf[type]() @parameter - fn top_k_cpu(start_idx: Int, end_idx: Int): - for row_idx in range(start_idx, end_idx): - var offset = (row_idx * K) - iota(out_idxs.unsafe_ptr() + offset, K) - - @parameter - fn val_greater_than(lhs: Int32, rhs: Int32) -> Bool: - return ( - in_vals[row_idx, Int(lhs)] > in_vals[row_idx, Int(rhs)] - ) - - sort[val_greater_than](Span(out_idxs.unsafe_ptr() + offset, K)) - - for i in range(K): - var sorted_idx = Int(out_idxs[row_idx, i]) - out_vals[row_idx, i] = in_vals[row_idx, sorted_idx] - - if batch_size <= 10: - - @parameter - if target == "gpu": - # This is a simplified version that only works for K being under - # the warp size. The MAX "mo.top_k" op supports any K and does - # another reduction after each warp has reduced its values. - if K >= WARP_SIZE: - raise Error( - "[top_k_custom] K=", - K, - " but must be less than the WARP_SIZE=", - WARP_SIZE, - ) - - if K < WARP_SIZE: - dev_ctx.enqueue_function[top_k_gpu[K]]( - out_vals, - out_idxs, - in_vals, - grid_dim=batch_size, # One block per batch - block_dim=K, # One thread per K - shared_mem_bytes=K * sizeof[TopKElement[type]](), - ) - else: - # Set grain size to 1 to put each batch in a separate task - parallelize_over_rows[top_k_cpu](shape, 1, grain_size=1) - - # Everything below is for benchmarking when running a stress test + if target == "gpu": + dev_ctx.enqueue_function[top_k_gpu[K]]( + out_vals, + out_idxs, + in_vals, + grid_dim=batch_size, # One block per batch + block_dim=K, # One thread per K + shared_mem_bytes=K * sizeof[TopKElement[type]](), + ) else: - var bench = Bench() @parameter - @always_inline - fn bench_gpu(mut b: Bencher, shape: IndexList[rank]) raises: - @parameter - @always_inline - fn kernel_launch(dev_ctx: DeviceContext) raises: - dev_ctx.enqueue_function[top_k_gpu[K]]( - out_vals, - out_idxs, - in_vals, - grid_dim=batch_size, # One block per batch - block_dim=K, # One thread per K - shared_mem_bytes=K * sizeof[TopKElement[type]](), + fn top_k_cpu(start_idx: Int, end_idx: Int): + for row_idx in range(start_idx, end_idx): + var offset = (row_idx * K) + iota(out_idxs.unsafe_ptr() + offset, K) + + @parameter + fn val_greater_than(lhs: Int32, rhs: Int32) -> Bool: + return ( + in_vals[row_idx, Int(lhs)] + > in_vals[row_idx, Int(rhs)] + ) + + sort[val_greater_than]( + Span(out_idxs.unsafe_ptr() + offset, K) ) - b.iter_custom[kernel_launch](ctx.get_device_context()) + for i in range(K): + var sorted_idx = Int(out_idxs[row_idx, i]) + out_vals[row_idx, i] = in_vals[row_idx, sorted_idx] - @parameter - @always_inline - fn bench_cpu(mut b: Bencher) raises: - var grain = 1 - # Split job up evenly across physical cores on large batch - if batch_size > 1000: - grain = batch_size // num_physical_cores() - - @parameter - fn run_bench(): - parallelize_over_rows[top_k_cpu](shape, 1, grain_size=grain) - - b.iter[run_bench]() - - var els = ThroughputMeasure( - BenchMetric.elements, shape.flattened_length() - ) - var flops = ThroughputMeasure( - BenchMetric.flops, shape.flattened_length() * log2_floor(K) - ) - - # Only benchmark GPU if it's available - @parameter - if target == "gpu": - bench.bench_with_input[IndexList[rank], bench_gpu]( - BenchId("top_k_custom", "gpu"), shape, els, flops - ) - - # TODO: Always benchmark CPU to compare with GPU - else: - bench.bench_function[bench_cpu]( - BenchId("top_k_custom", "cpu"), els, flops - ) - - bench.config.verbose_metric_names = False - bench.config.verbose_timing = True - print(bench) + parallelize_over_rows[top_k_cpu](shape, axis=1, grain_size=1) diff --git a/examples/custom_ops/mojoproject.toml b/examples/custom_ops/mojoproject.toml index d110891084..f2a6f222ee 100644 --- a/examples/custom_ops/mojoproject.toml +++ b/examples/custom_ops/mojoproject.toml @@ -15,7 +15,8 @@ top_k = { cmd = "python top_k.py", depends-on = ["package"] } fused_attention = { cmd = "python fused_attention.py", depends-on = ["package"] } matrix_multiplication = { cmd = "python matrix_multiplication.py", depends-on = ["package"] } histogram = { cmd = "python histogram.py", depends-on = ["package"] } -test = { depends-on = ["addition", "mandelbrot", "vector_addition", "top_k", "fused_attention", "matrix_multiplication"] } +benchmark = { cmd = "mojo benchmarks.mojo", depends-on = ["package"] } +test = { depends-on = ["addition", "mandelbrot", "vector_addition", "top_k", "fused_attention", "matrix_multiplication", "benchmark"] } [dependencies] python = ">=3.9,<3.13" diff --git a/examples/custom_ops/top_k.py b/examples/custom_ops/top_k.py index 887fd444c0..3a77d793f7 100644 --- a/examples/custom_ops/top_k.py +++ b/examples/custom_ops/top_k.py @@ -105,15 +105,6 @@ def main(): parser = argparse.ArgumentParser( description="Top-K sampling with custom ops" ) - parser.add_argument( - "--stress-test", - type=int, - default=0, - help=( - "Number of times to repeat input for stress testing. " - "On NVIDIA A100, 250_000_000 takes less than 0.5ms and uses over 75%% of its memory." - ), - ) parser.add_argument( "--cpu", action="store_true", @@ -135,10 +126,6 @@ def main(): # Get probabilities of next word for each word in the `word_predictions` list probabilities = frequencies.next_word_probabilities(word_predictions) - # If stress testing, repeat the input the specified number of times - if args.stress_test > 0: - probabilities = np.repeat(probabilities, args.stress_test, axis=0) - batch_size = len(probabilities) K = frequencies.max_next_words @@ -183,9 +170,6 @@ def main(): values, indices = model.execute(input_tensor) - if args.stress_test > 0: - return - # Copy values and indices back to the CPU to be read. assert isinstance(values, Tensor) values = values.to(CPU()) From 390a755e7f5a440d391746e8f63f6f2b26e5e837 Mon Sep 17 00:00:00 2001 From: akirchhoff-modular Date: Wed, 26 Feb 2025 18:06:58 -0800 Subject: [PATCH 09/44] [KVCache] Clean up iterator logic of KVCacheInputs & KVCacheInputSymbols Both of these were using a deque to flatten out contained tensors and tensor types, respectively. This avoids recursion, but the structure of data they're iterating over is not very deep, so there is not much risk of stack overflow. Use "yield from" to make this more concise, and use a type guard to clean up some of the `isinstance` uses. Type annotations added where necessary or helpful. I also removed `__setitem__` since it was both broken and didn't seem to be used anywhere. MODULAR_ORIG_COMMIT_REV_ID: a0261de3f8e9aaf384c13e65119cfe5cbe0e01dc --- src/max/pipelines/kv_cache/manager.py | 89 ++++++++++++--------------- 1 file changed, 41 insertions(+), 48 deletions(-) diff --git a/src/max/pipelines/kv_cache/manager.py b/src/max/pipelines/kv_cache/manager.py index 7f124db394..1e1ad0040b 100644 --- a/src/max/pipelines/kv_cache/manager.py +++ b/src/max/pipelines/kv_cache/manager.py @@ -16,15 +16,25 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections import deque from dataclasses import dataclass -from typing import Any, List, Sequence, cast, final +from typing import ( + Any, + Iterator, + List, + Sequence, + Type, + TypeVar, + cast, + final, + overload, +) import numpy as np from max.driver import Device, Tensor from max.dtype import DType from max.engine import InferenceSession from max.graph import DeviceRef, Graph, TensorType, TensorValue +from typing_extensions import TypeGuard from .cache_params import KVCacheParams @@ -40,6 +50,13 @@ class _FetchMetadata: num_steps: int +_T = TypeVar("_T") + + +def _is_sequence_of(x: Any, ty: Type[_T]) -> TypeGuard[Sequence[_T]]: + return isinstance(x, Sequence) and all(isinstance(item, ty) for item in x) + + @dataclass class KVCacheInputs: """ @@ -56,48 +73,35 @@ class KVCacheInputs: ... max_lengths: Tensor """ - def __iter__(self): + def __iter__(self) -> Iterator[Tensor]: """Iterates through each Type in order.""" - fields = deque( - getattr(self, field) for field in self.__dataclass_fields__ - ) - while fields: - value = fields.popleft() - if isinstance(value, Sequence) and all( - isinstance(x, KVCacheInputs) for x in value - ): - # Add sequence elements in original order - fields.extendleft([x for x in reversed(value)]) - continue - elif isinstance(value, KVCacheInputs): - fields.extendleft( - reversed( - [ - getattr(value, field) - for field in value.__dataclass_fields__ - ] - ) - ) - continue + for field in self.__dataclass_fields__: + value = getattr(self, field) + if isinstance(value, KVCacheInputs): + yield from value + elif _is_sequence_of(value, KVCacheInputs): + for item in value: + yield from item else: yield cast(Tensor, value) - def __getitem__(self, index): - return list(self)[index] + @overload + def __getitem__(self, index: int) -> Tensor: ... + + @overload + def __getitem__(self, index: slice) -> Sequence[Tensor]: ... - def __setitem__(self, index, value): - list(self)[index] = value + def __getitem__(self, index: Any) -> Any: + return list(self)[index] - def __len__(self): + def __len__(self) -> int: count = 0 # Iterate over all fields in the dataclass. If we run into a sequence of # KVCacheInputs, we expand and recursively call `len` on the KVCacheInputs # elements. for field in self.__dataclass_fields__: value = getattr(self, field) - if isinstance(value, Sequence) and all( - isinstance(x, KVCacheInputs) for x in value - ): + if _is_sequence_of(value, KVCacheInputs): count += sum(len(x) for x in value) else: count += 1 @@ -158,27 +162,16 @@ class KVCacheInputSymbols: ... max_lengths: TensorType """ - def __iter__(self): + def __iter__(self) -> Iterator[Any]: """Iterates through each Type in order.""" - fields = deque( - getattr(self, field) for field in self.__dataclass_fields__ - ) - while fields: - value = fields.popleft() + for field in self.__dataclass_fields__: + value = getattr(self, field) if isinstance(value, KVCacheInputSymbols): - fields.extendleft( - reversed( - [ - getattr(value, field) - for field in value.__dataclass_fields__ - ] - ) - ) - continue + yield from value else: yield value - def __getitem__(self, index): + def __getitem__(self, index) -> Any: return list(self)[index] From 69403856b96b63a573a509972cc4f208753b899b Mon Sep 17 00:00:00 2001 From: akirchhoff-modular Date: Wed, 26 Feb 2025 18:14:37 -0800 Subject: [PATCH 10/44] [Pipelines] Qualify huggingface_hub accesses (NFC) This makes it easier to search to see where a network call may be being made. MODULAR_ORIG_COMMIT_REV_ID: f28696fda1657afd909348c577bf22f28764c000 --- src/max/pipelines/config.py | 51 ++++++++++++++----------------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/src/max/pipelines/config.py b/src/max/pipelines/config.py index d254ca7c0b..b71b604777 100644 --- a/src/max/pipelines/config.py +++ b/src/max/pipelines/config.py @@ -28,25 +28,10 @@ from pathlib import Path from typing import Any, Optional, Union, cast +import huggingface_hub import torch -from huggingface_hub import ( - HfFileSystem, - file_exists, - get_hf_file_metadata, - hf_hub_download, - hf_hub_url, - model_info, - repo_exists, -) from huggingface_hub import constants as hf_hub_constants -from huggingface_hub.hf_api import ModelInfo -from huggingface_hub.utils import ( - EntryNotFoundError, - GatedRepoError, - HfHubHTTPError, - RepositoryNotFoundError, - RevisionNotFoundError, -) +from huggingface_hub import errors as hf_hub_errors from huggingface_hub.utils import tqdm as hf_tqdm from max.driver import CPU, Accelerator, Device, DeviceSpec, accelerator_count from max.dtype import DType @@ -209,17 +194,17 @@ def _repo_exists_with_retry(repo_id: str) -> bool: for attempt, delay_in_seconds in enumerate(retry_delays_in_seconds): try: - return repo_exists(repo_id) + return huggingface_hub.repo_exists(repo_id) except ( - RepositoryNotFoundError, - GatedRepoError, - RevisionNotFoundError, - EntryNotFoundError, + hf_hub_errors.RepositoryNotFoundError, + hf_hub_errors.GatedRepoError, + hf_hub_errors.RevisionNotFoundError, + hf_hub_errors.EntryNotFoundError, ) as e: # Forward these specific errors to the user logger.error(f"Hugging Face repository error: {str(e)}") raise - except HfHubHTTPError as e: + except hf_hub_errors.HfHubHTTPError as e: if attempt == max_attempts - 1: logger.error( f"Failed to connect to Hugging Face Hub after {max_attempts} attempts: {str(e)}" @@ -265,13 +250,15 @@ def __repr__(self) -> str: return self.repo_id @cached_property - def info(self) -> ModelInfo: + def info(self) -> huggingface_hub.ModelInfo: if self.repo_type == RepoType.local: raise ValueError( "using model info, on local repos is not supported." ) elif self.repo_type == RepoType.online: - return model_info(self.repo_id, files_metadata=False) + return huggingface_hub.model_info( + self.repo_id, files_metadata=False + ) else: raise ValueError(f"Unsupported repo type: {self.repo_type}") @@ -293,7 +280,7 @@ def weight_files(self) -> dict[WeightsFormat, list[str]]: os.path.join(self.repo_id, pytorch_search_pattern) ) elif self.repo_type == RepoType.online: - fs = HfFileSystem() + fs = huggingface_hub.HfFileSystem() safetensor_paths = cast( list[str], fs.glob(f"{self.repo_id}/{safetensor_search_pattern}"), @@ -337,8 +324,8 @@ def weight_files(self) -> dict[WeightsFormat, list[str]]: def size_of(self, filename: str) -> Union[int, None]: if self.repo_type == RepoType.online: - url = hf_hub_url(self.repo_id, filename) - metadata = get_hf_file_metadata(url) + url = huggingface_hub.hf_hub_url(self.repo_id, filename) + metadata = huggingface_hub.get_hf_file_metadata(url) return metadata.size raise NotImplementedError("not implemented for non-online repos.") @@ -503,11 +490,11 @@ def files_for_encoding( return gguf_files def file_exists(self, filename: str) -> bool: - return file_exists(self.repo_id, filename) + return huggingface_hub.file_exists(self.repo_id, filename) def download(self, filename: str, force_download: bool = False) -> Path: return Path( - hf_hub_download( + huggingface_hub.hf_hub_download( self.repo_id, filename, force_download=force_download ) ) @@ -749,7 +736,7 @@ def __post_init__(self) -> None: file_name = "/".join(path_pieces[2:]) if self.model_path != "" and repo_id == self.model_path: path = Path(file_name) - elif file_exists(repo_id, file_name): + elif huggingface_hub.file_exists(repo_id, file_name): self._weights_repo_id = repo_id path = Path(file_name) elif self.model_path == "": @@ -1006,7 +993,7 @@ def download_weights(self) -> None: self.weight_path = list( thread_map( lambda filename: Path( - hf_hub_download( + huggingface_hub.hf_hub_download( weights_repo_id, str(filename), revision=self.huggingface_revision, From 82953520c45fa62f6bae540b8c41a70ee60a0e98 Mon Sep 17 00:00:00 2001 From: Brian Zhang Date: Wed, 26 Feb 2025 18:50:12 -0800 Subject: [PATCH 11/44] [MAX] Format bytes into human readable strings in kv cache err messages (#56791) Stacked PRs: * __->__#56791 --- --- --- ### [MAX] Format bytes into human readable strings in kv cache err messages Add a new support subpackage that contains these few helpers. I leave DType where it currently is context: [Internal link] Closes E2EOPT-70 MODULAR_ORIG_COMMIT_REV_ID: 5ff6caa4f2cf53bae77bf8ee3fb366c8d227f294 --- src/max/pipelines/kv_cache/paged_cache.py | 13 ++++++++--- src/max/pipelines/registry.py | 28 ++++++----------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py index 7c814828be..ab33d3335e 100644 --- a/src/max/pipelines/kv_cache/paged_cache.py +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -34,6 +34,7 @@ _OpaqueValue, ops, ) +from max.support.human_readable_formatter import to_human_readable_bytes from ._utils import build_max_lengths_tensor from .cache_params import KVCacheParams @@ -194,17 +195,23 @@ def __init__( cache_memory_per_device // single_page_size_bytes ) + single_page_size_bytes_str = to_human_readable_bytes( + single_page_size_bytes + ) + cache_memory_per_device_str = to_human_readable_bytes( + cache_memory_per_device + ) if self.total_num_pages == 0: raise RuntimeError( f"Insufficient cache memory to allocate even a single page.\n" - f"One page requires {single_page_size_bytes} bytes but only {cache_memory_per_device} bytes are available." + f"One page requires {single_page_size_bytes_str} but only {cache_memory_per_device_str} are available." ) if max_batch_size > self.total_num_pages: logger.warning( f"Insufficient cache memory to support a batch containing {max_batch_size} requests with one token per request. " f"Need to allocate at least {max_batch_size} blocks, but only have enough memory for {self.total_num_pages} blocks. " - f"One page requires {single_page_size_bytes} bytes but only {cache_memory_per_device} bytes are available." + f"One page requires {single_page_size_bytes_str} but only {cache_memory_per_device_str} are available." ) blocks_needed_for_max_seq_len = ceildiv(max_seq_len, page_size) @@ -212,7 +219,7 @@ def __init__( logger.warning( f"Insufficient cache memory to support a batch containing one request at the max sequence length of {max_seq_len} tokens. " f"Need to allocate at least {blocks_needed_for_max_seq_len} blocks, but only have enough memory for {self.total_num_pages} blocks. " - f"One page requires {single_page_size_bytes} bytes but only {cache_memory_per_device} bytes are available." + f"One page requires {single_page_size_bytes} but only {cache_memory_per_device} are available." ) # call our base class constructor diff --git a/src/max/pipelines/registry.py b/src/max/pipelines/registry.py index 312b0d1e79..2e180772f2 100644 --- a/src/max/pipelines/registry.py +++ b/src/max/pipelines/registry.py @@ -23,6 +23,7 @@ import torch from max.graph.weights import WeightsAdapter +from max.support.human_readable_formatter import to_human_readable_bytes from .config import ( PipelineConfig, @@ -67,21 +68,6 @@ } -def _to_human_memory_size(bytes: int) -> str: - """Convert bytes to human readable memory size.""" - KiB = 1024 - MiB = KiB * 1024 - GiB = MiB * 1024 - TiB = GiB * 1024 - if bytes > TiB: - return f"{bytes / TiB:.2f} TiB" - if bytes > GiB: - return f"{bytes / GiB:.2f} GiB" - if bytes > MiB: - return f"{bytes / MiB:.2f} MiB" - return f"{bytes / KiB:.2f} KiB" - - class SupportedArchitecture: def __init__( self, @@ -463,11 +449,11 @@ def _estimate_memory_footprint( total_size = model_weights_size + actual_kv_cache_size if free_memory: - free_memory_str = f" / {_to_human_memory_size(free_memory)} free" + free_memory_str = f" / {to_human_readable_bytes(free_memory)} free" weights_str = "" if model_weights_size: - weights_str = f"\n\t Weights: {_to_human_memory_size(model_weights_size)}" + weights_str = f"\n\t Weights: {to_human_readable_bytes(model_weights_size)}" if not user_provided_max_length: max_length_str = f"Auto-inferred max sequence length: {pipeline_config.max_length}" @@ -487,8 +473,8 @@ def _estimate_memory_footprint( "\n" f"\n\tEstimated memory consumption:" f"{weights_str}" - f"\n\t KVCache allocation: {_to_human_memory_size(actual_kv_cache_size)}" - f"\n\t Total estimated: {_to_human_memory_size(model_weights_size + actual_kv_cache_size)} used{free_memory_str}" + f"\n\t KVCache allocation: {to_human_readable_bytes(actual_kv_cache_size)}" + f"\n\t Total estimated: {to_human_readable_bytes(model_weights_size + actual_kv_cache_size)} used{free_memory_str}" f"\n\t{max_length_str}" f"\n\t{max_batch_size_str}\n" ) @@ -719,14 +705,14 @@ def _generate_oom_error_message( ) -> str: """Generate an appropriate error message based on the configuration state.""" free_memory_str = ( - f" / {_to_human_memory_size(original_free_memory)} free" + f" / {to_human_readable_bytes(original_free_memory)} free" if original_free_memory else "" ) msg = StringIO() msg.write( - f"Estimated model and kv cache memory use exceeds available memory ({_to_human_memory_size(total_size)} {free_memory_str}). Try " + f"Estimated model and kv cache memory use exceeds available memory ({to_human_readable_bytes(total_size)} {free_memory_str}). Try " ) if not found_valid_max_length and not found_valid_max_batch_size: From 8ae8a5c73210b9f90419755de38f74e8abb2c449 Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Wed, 26 Feb 2025 22:11:20 -0500 Subject: [PATCH 12/44] [max-examples] Add matmul benchmark to custom ops Results on A100 at 1028x1028x1028: ``` ------------------------------------------------------------------------ | name | met (ms)| iters | GFLOPS/s | GElems/s | ------------------------------------------------------------------------ | cpu/naive | 1345.17 | 2 | 1.6144302 | 0.0007856 | | gpu/naive | 2.84457 | 421 | 763.44951 | 0.3715082 | | gpu/coalescing | 0.65844 | 1822 | 3298.2149 | 1.6049707 | | gpu/tiled | 0.62589 | 1917 | 3469.7502 | 1.6884429 | | gpu/tiled_register | 0.40628 | 2953 | 5345.2100 | 2.6010754 | | gpu/block_tiled | 0.37401 | 3207 | 5806.3713 | 2.8254848 | | gpu/block_tiled_vectorized | 0.37404 | 3208 | 5805.9318 | 2.8252709 | ------------------------------------------------------------------------ ``` MODULAR_ORIG_COMMIT_REV_ID: e42b94e1862195d335533a790b6e0ed4b8d3f184 --- examples/custom_ops/benchmarks.mojo | 137 +++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/examples/custom_ops/benchmarks.mojo b/examples/custom_ops/benchmarks.mojo index c768958981..c9bdc86245 100644 --- a/examples/custom_ops/benchmarks.mojo +++ b/examples/custom_ops/benchmarks.mojo @@ -11,7 +11,8 @@ # limitations under the License. # ===----------------------------------------------------------------------=== # -from kernels import TopK +from kernels.top_k import TopK +from kernels.matrix_multiplication import MatrixMultiplication from gpu.host import DeviceContext from utils import IndexList from max.driver.device import cpu_device @@ -131,5 +132,139 @@ def top_k(): out_idxs.free() +def matmul(): + alias M = 1028 + alias K = 1028 + alias N = 1028 + alias FLOPS = M * N * (2 * K - 1) + + alias rank = 2 + alias a_shape = IndexList[rank](M, K) + alias b_shape = IndexList[rank](K, N) + alias c_shape = IndexList[rank](M, N) + + alias a_els = a_shape.flattened_length() + alias b_els = b_shape.flattened_length() + alias c_els = c_shape.flattened_length() + + alias dtype = DType.float32 + + alias a_spec = StaticTensorSpec[dtype, rank]( + shape=(M, K), + strides=(K, 1), + alignment=sizeof[dtype](), + address_space=AddressSpace.GENERIC, + exclusive=True, + in_lambda=None, + out_lambda=None, + ) + alias b_spec = StaticTensorSpec[dtype, rank]( + shape=(K, N), + strides=(N, 1), + alignment=sizeof[dtype](), + address_space=AddressSpace.GENERIC, + exclusive=True, + in_lambda=None, + out_lambda=None, + ) + alias c_spec = StaticTensorSpec[dtype, rank]( + shape=(M, N), + strides=(N, 1), + alignment=sizeof[dtype](), + address_space=AddressSpace.GENERIC, + exclusive=True, + in_lambda=None, + out_lambda=None, + ) + + var a_ptr = UnsafePointer[Scalar[dtype]].alloc(a_els) + var b_ptr = UnsafePointer[Scalar[dtype]].alloc(b_els) + var c_ptr = UnsafePointer[Scalar[dtype]].alloc(c_els) + + var a = InputTensor[static_spec=a_spec](a_ptr, a_shape) + var b = InputTensor[static_spec=b_spec](b_ptr, b_shape) + var c = OutputTensor[static_spec=c_spec](c_ptr, c_shape) + + rand(a_ptr, a_els) + rand(b_ptr, b_els) + + var cpu_ctx_ptr = cpu_device().unsafe_ptr() + var bench = Bench() + var flops = ThroughputMeasure(BenchMetric.flops, FLOPS) + var elements = ThroughputMeasure(BenchMetric.elements, M * N) + + @parameter + @always_inline + fn bench_cpu(mut bencher: Bencher) raises: + @parameter + @always_inline + fn run_bench() raises: + MatrixMultiplication["naive"].execute[target="cpu"]( + c, + a, + b, + cpu_ctx_ptr, + ) + + bencher.iter[run_bench]() + + bench.bench_function[bench_cpu](BenchId("cpu", "naive"), flops, elements) + + @parameter + if has_nvidia_gpu_accelerator() or has_amd_gpu_accelerator(): + var gpu_ctx = DeviceContext() + var a_dev = gpu_ctx.enqueue_create_buffer[dtype](a_els) + var b_dev = gpu_ctx.enqueue_create_buffer[dtype](b_els) + var c_dev = gpu_ctx.enqueue_create_buffer[dtype](c_els) + var c = InputTensor[static_spec=c_spec](c_dev.unsafe_ptr(), c_shape) + var a = OutputTensor[static_spec=a_spec](a_dev.unsafe_ptr(), a_shape) + var b = OutputTensor[static_spec=b_spec](b_dev.unsafe_ptr(), b_shape) + gpu_ctx.copy(a_dev, a_ptr) + gpu_ctx.copy(b_dev, b_ptr) + + @parameter + def bench_matmul_kernel[impl: StringLiteral](): + @parameter + @always_inline + fn bench_gpu(mut bench: Bencher) raises: + @parameter + @always_inline + fn kernel_launch(gpu_ctx: DeviceContext) raises: + MatrixMultiplication[impl].execute[target="gpu"]( + c, + a, + b, + gpu_ctx, + ) + + var gpu_ctx = DeviceContext() + bench.iter_custom[kernel_launch](gpu_ctx) + _ = gpu_ctx + + bench.bench_function[bench_gpu]( + BenchId("gpu", impl), flops, elements + ) + + bench_matmul_kernel["naive"]() + bench_matmul_kernel["coalescing"]() + bench_matmul_kernel["tiled"]() + bench_matmul_kernel["tiled_register"]() + bench_matmul_kernel["block_tiled"]() + bench_matmul_kernel["block_tiled_vectorized"]() + _ = gpu_ctx + _ = a_dev + _ = b_dev + _ = c_dev + + bench.config.verbose_metric_names = False + print(bench) + + a_ptr.free() + b_ptr.free() + c_ptr.free() + + +# TODO: arg parsing to select benchmarks def main(): top_k() + matmul() From e543f249c2c28b6adc9471019dbc202e5b312f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8rstad?= Date: Thu, 27 Feb 2025 14:42:32 +0100 Subject: [PATCH 13/44] ] [max-examples] Fix DeviceContext lifetime in top_k benchmark Moves the cpu_device() context creation outside the benchmark function and keeps it alive until the end of the scope to prevent use-after-free errors. This prevents the example from segfaulting on Mac OS [ MODULAR_ORIG_COMMIT_REV_ID: 37177ca86aa143cc4dd405dd7253e6f218ddb18e --- examples/custom_ops/benchmarks.mojo | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/custom_ops/benchmarks.mojo b/examples/custom_ops/benchmarks.mojo index c9bdc86245..f02bb8b731 100644 --- a/examples/custom_ops/benchmarks.mojo +++ b/examples/custom_ops/benchmarks.mojo @@ -67,11 +67,11 @@ def top_k(): rand(in_vals, els) + var cpu_ctx_ptr = cpu_device().unsafe_ptr() + @parameter @always_inline fn bench_cpu(mut b: Bencher) raises: - var cpu_ctx_ptr = cpu_device().unsafe_ptr() - @parameter @always_inline fn run_bench() raises: @@ -127,6 +127,7 @@ def top_k(): b.config.verbose_metric_names = False print(b) + _ = cpu_ctx_ptr in_vals.free() out_vals.free() out_idxs.free() From 5f2570fa100418dcce60108b8d9337ea1115cf89 Mon Sep 17 00:00:00 2001 From: martinvuyk <110240700+martinvuyk@users.noreply.github.com> Date: Thu, 27 Feb 2025 08:04:22 -0600 Subject: [PATCH 14/44] [External] [stdlib] Rename `List.size` to `List._len` and refactor usage of the field to use the public API (#56692) [External] [stdlib] Rename `List.size` to `List._len` Make the data member `size` of `List` private by prefixing with an `_`. Rename it to `len` while we're here. Adjust call sites to use public APIs where possible. Details: - Part of https://github.com/modular/mojo/issues/3511 - To prepare for any future implementation details than can change under the hood for `List`. Co-authored-by: martinvuyk <110240700+martinvuyk@users.noreply.github.com> Closes modularml/mojo#3814 MODULAR_ORIG_COMMIT_REV_ID: c2ac41d4c543b01619814ce0cd58fd8ba15ac9e9 --- mojo/docs/changelog.md | 36 ++++++ mojo/stdlib/src/builtin/file.mojo | 4 +- mojo/stdlib/src/builtin/string_literal.mojo | 15 +-- mojo/stdlib/src/collections/list.mojo | 111 ++++++++---------- .../src/collections/string/_unicode.mojo | 26 ++-- .../src/collections/string/codepoint.mojo | 2 +- .../stdlib/src/collections/string/format.mojo | 5 +- .../stdlib/src/collections/string/string.mojo | 81 +++++-------- .../src/collections/string/string_slice.mojo | 12 +- mojo/stdlib/src/memory/span.mojo | 2 +- mojo/stdlib/src/pathlib/path.mojo | 2 +- .../test_list_getitem_invalid_index.mojo | 2 +- 12 files changed, 141 insertions(+), 157 deletions(-) diff --git a/mojo/docs/changelog.md b/mojo/docs/changelog.md index c223bb1bd0..8f7363e0de 100644 --- a/mojo/docs/changelog.md +++ b/mojo/docs/changelog.md @@ -215,4 +215,40 @@ ctx.enqueue_function(compiled_func, grid_dim=1, block_dim=1) ### ❌ Removed +- Direct access to `List.size` has been removed. Use the public API instead. + + Examples: + + Extending a List: + + ```mojo + base_data = List[Byte](1, 2, 3) + + data_list = List[Byte](4, 5, 6) + ext_data_list = base_data.copy() + ext_data_list.extend(data_list) # [1, 2, 3, 4, 5, 6] + + data_span = Span(List[Byte](4, 5, 6)) + ext_data_span = base_data.copy() + ext_data_span.extend(data_span) # [1, 2, 3, 4, 5, 6] + + data_vec = SIMD[DType.uint8, 4](4, 5, 6, 7) + ext_data_vec_full = base_data.copy() + ext_data_vec_full.extend(data_vec) # [1, 2, 3, 4, 5, 6, 7] + + ext_data_vec_partial = base_data.copy() + ext_data_vec_partial.extend(data_vec, count=3) # [1, 2, 3, 4, 5, 6] + ``` + + Slicing and extending a list efficiently: + + ```mojo + base_data = List[Byte](1, 2, 3, 4, 5, 6) + n4_n5 = Span(base_data)[3:5] + extra_data = Span(List[Byte](8, 10)) + end_result = List[Byte](capacity=len(n4_n5) + len(extra_data)) + end_result.extend(n4_n5) + end_result.extend(extra_data) # [4, 5, 8, 10] + ``` + ### 🛠️ Fixed diff --git a/mojo/stdlib/src/builtin/file.mojo b/mojo/stdlib/src/builtin/file.mojo index 9325034705..e3ba22bf27 100644 --- a/mojo/stdlib/src/builtin/file.mojo +++ b/mojo/stdlib/src/builtin/file.mojo @@ -129,7 +129,7 @@ struct FileHandle: """Reads data from a file and sets the file handle seek position. If size is left as the default of -1, it will read to the end of the file. Setting size to a number larger than what's in the file will set - String.size to the total number of bytes, and read all the data. + the String length to the total number of bytes, and read all the data. Args: size: Requested number of bytes to read (Default: -1 = EOF). @@ -273,7 +273,7 @@ struct FileHandle: """Reads data from a file and sets the file handle seek position. If size is left as default of -1, it will read to the end of the file. Setting size to a number larger than what's in the file will be handled - and set the List.size to the total number of bytes in the file. + and set the List length to the total number of bytes in the file. Args: size: Requested number of bytes to read (Default: -1 = EOF). diff --git a/mojo/stdlib/src/builtin/string_literal.mojo b/mojo/stdlib/src/builtin/string_literal.mojo index aabd2b7678..da60f9515c 100644 --- a/mojo/stdlib/src/builtin/string_literal.mojo +++ b/mojo/stdlib/src/builtin/string_literal.mojo @@ -411,17 +411,10 @@ struct StringLiteral( # inline the string slice constructor to work around an elaborator # memory leak. # return self.as_string_slice() - var string = String() - var length = self.byte_length() - var buffer = String._buffer_type() - var new_capacity = length + 1 - buffer._realloc(new_capacity) - buffer.size = new_capacity - var data: UnsafePointer[UInt8] = self.unsafe_ptr() - memcpy(buffer.data, data, length) - (buffer.data + length).init_pointee_move(0) - string._buffer = buffer^ - return string + var buffer = String._buffer_type(capacity=self.byte_length() + 1) + buffer.extend(self.as_bytes()) + buffer.append(0) + return String(buffer=buffer^) @no_inline fn __repr__(self) -> String: diff --git a/mojo/stdlib/src/collections/list.mojo b/mojo/stdlib/src/collections/list.mojo index 21416c95dd..1aa7051342 100644 --- a/mojo/stdlib/src/collections/list.mojo +++ b/mojo/stdlib/src/collections/list.mojo @@ -98,7 +98,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( # Fields var data: UnsafePointer[T] """The underlying storage for the list.""" - var size: Int + var _len: Int """The number of elements in the list.""" var capacity: Int """The amount of elements that can fit in the list without resizing it.""" @@ -110,7 +110,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( fn __init__(out self): """Constructs an empty list.""" self.data = UnsafePointer[T]() - self.size = 0 + self._len = 0 self.capacity = 0 fn copy(self) -> Self: @@ -131,7 +131,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( capacity: The requested capacity of the list. """ self.data = UnsafePointer[T].alloc(capacity) - self.size = 0 + self._len = 0 self.capacity = capacity fn __init__(out self, owned *values: T): @@ -161,7 +161,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( # Do not destroy the elements when their backing storage goes away. __disable_del elements - self.size = length + self._len = length fn __init__(out self, span: Span[T]): """Constructs a list from the a Span of values. @@ -184,7 +184,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( capacity: The capacity of the list. """ self.data = ptr - self.size = length + self._len = length self.capacity = capacity fn __moveinit__(out self, owned existing: Self): @@ -194,7 +194,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( existing: The existing list. """ self.data = existing.data - self.size = existing.size + self._len = existing._len self.capacity = existing.capacity fn __copyinit__(out self, existing: Self): @@ -212,7 +212,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( @parameter if not hint_trivial_type: - for i in range(self.size): + for i in range(len(self)): (self.data + i).destroy_pointee() self.data.free() @@ -369,13 +369,14 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( # Trait implementations # ===-------------------------------------------------------------------===# + @always_inline("nodebug") fn __len__(self) -> Int: """Gets the number of elements in the list. Returns: The number of elements in the list. """ - return self.size + return self._len fn __bool__(self) -> Bool: """Checks whether the list has any elements or not. @@ -411,7 +412,9 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( Returns: A string representation of the list. """ - var output = String() + # at least 1 byte per item e.g.: [a, b, c, d] = 4 + 2 * 3 + [] + null + var l = len(self) + var output = String(capacity=l + 2 * (l - 1) * Int(l > 1) + 3) self.write_to(output) return output^ @@ -478,11 +481,12 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( fn _realloc(mut self, new_capacity: Int): var new_data = UnsafePointer[T].alloc(new_capacity) - _move_pointee_into_many_elements[hint_trivial_type]( - dest=new_data, - src=self.data, - size=self.size, - ) + @parameter + if hint_trivial_type: + memcpy(new_data, self.data, len(self)) + else: + for i in range(len(self)): + (self.data + i).move_pointee_into(new_data + i) if self.data: self.data.free() @@ -499,10 +503,10 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( If there is no capacity left, resizes to twice the current capacity. Except for 0 capacity where it sets 1. """ - if self.size >= self.capacity: + if self._len >= self.capacity: self._realloc(self.capacity * 2 | Int(self.capacity == 0)) self._unsafe_next_uninit_ptr().init_pointee_move(value^) - self.size += 1 + self._len += 1 fn insert(mut self, i: Int, owned value: T): """Inserts a value to the list at the given index. @@ -512,7 +516,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( i: The index for the value. value: The value to insert. """ - debug_assert(i <= self.size, "insert index out of range") + debug_assert(i <= len(self), "insert index out of range") var normalized_idx = i if i < 0: @@ -573,7 +577,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( # visible outside this function if a `__moveinit__()` constructor were # to throw (not currently possible AFAIK though) part way through the # logic below. - other.size = 0 + other._len = 0 var dest_ptr = self.data + len(self) @@ -590,7 +594,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( # Update the size now that all new elements have been moved into this # list. - self.size = final_size + self._len = final_size fn extend[ D: DType, // @@ -606,9 +610,9 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( Notes: If there is no capacity left, resizes to `len(self) + value.size`. """ - self.reserve(self.size + value.size) + self.reserve(self._len + value.size) self._unsafe_next_uninit_ptr().store(value) - self.size += value.size + self._len += value.size fn extend[ D: DType, // @@ -627,10 +631,10 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( If there is no capacity left, resizes to `len(self) + count`. """ debug_assert(count <= value.size, "count must be <= value.size") - self.reserve(self.size + count) + self.reserve(self._len + count) var v_ptr = UnsafePointer.address_of(value).bitcast[Scalar[D]]() memcpy(self._unsafe_next_uninit_ptr(), v_ptr, count) - self.size += count + self._len += count fn extend[ D: DType, // @@ -646,9 +650,9 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( Notes: If there is no capacity left, resizes to `len(self) + len(value)`. """ - self.reserve(self.size + len(value)) + self.reserve(self._len + len(value)) memcpy(self._unsafe_next_uninit_ptr(), value.unsafe_ptr(), len(value)) - self.size += len(value) + self._len += len(value) fn pop(mut self, i: Int = -1) -> T: """Pops a value from the list at the given index. @@ -659,17 +663,17 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( Returns: The popped value. """ - debug_assert(-len(self) <= i < len(self), "pop index out of range") + debug_assert(-self._len <= i < self._len, "pop index out of range") var normalized_idx = i if i < 0: - normalized_idx += len(self) + normalized_idx += self._len var ret_val = (self.data + normalized_idx).take_pointee() - for j in range(normalized_idx + 1, self.size): + for j in range(normalized_idx + 1, self._len): (self.data + j).move_pointee_into(self.data + j - 1) - self.size -= 1 - if self.size * 4 < self.capacity: + self._len -= 1 + if self._len * 4 < self.capacity: if self.capacity > 1: self._realloc(self.capacity // 2) return ret_val^ @@ -698,13 +702,13 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( new_size: The new size. value: The value to use to populate new elements. """ - if new_size <= self.size: + if new_size <= self._len: self.resize(new_size) else: self.reserve(new_size) - for i in range(self.size, new_size): + for i in range(self._len, new_size): (self.data + i).init_pointee_copy(value) - self.size = new_size + self._len = new_size fn resize(mut self, new_size: Int): """Resizes the list to the given new size. @@ -715,16 +719,16 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( Args: new_size: The new size. """ - if self.size < new_size: + if len(self) < new_size: abort( "You are calling List.resize with a new_size bigger than the" " current size. If you want to make the List bigger, provide a" " value to fill the new slots with. If not, make sure the new" " size is smaller than the current size." ) - for i in range(new_size, self.size): + for i in range(new_size, len(self)): (self.data + i).destroy_pointee() - self.size = new_size + self._len = new_size self.reserve(new_size) fn reverse(mut self): @@ -831,9 +835,9 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( fn clear(mut self): """Clears the elements in the list.""" - for i in range(self.size): + for i in range(self._len): (self.data + i).destroy_pointee() - self.size = 0 + self._len = 0 fn steal_data(mut self) -> UnsafePointer[T]: """Take ownership of the underlying pointer from the list. @@ -843,7 +847,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( """ var ptr = self.data self.data = UnsafePointer[T]() - self.size = 0 + self._len = 0 self.capacity = 0 return ptr @@ -891,11 +895,11 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( else: var normalized_idx = Int(idx) debug_assert( - -self.size <= normalized_idx < self.size, + -self._len <= normalized_idx < self._len, "index: ", normalized_idx, - " is out of bounds for `List` of size: ", - self.size, + " is out of bounds for `List` of length: ", + self._len, ) if normalized_idx < 0: normalized_idx += len(self) @@ -1048,24 +1052,24 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( - This pointer MUST not be used to read or write memory beyond the allocated capacity of this list. - This pointer may not be used to initialize non-contiguous elements. - - Ensure that `List.size` is updated to reflect the new number of + - Ensure that `List._len` is updated to reflect the new number of initialized elements, otherwise elements may be unexpectedly overwritten or not destroyed correctly. """ debug_assert( - self.capacity > 0 and self.capacity > self.size, + self.capacity > 0 and self.capacity > self._len, ( "safety violation: Insufficient capacity to retrieve pointer to" " next uninitialized element" ), ) - return self.data + self.size + return self.data + self._len fn _cast_hint_trivial_type[ hint_trivial_type: Bool ](owned self) -> List[T, hint_trivial_type]: - var size = self.size + var size = self._len var capacity = self.capacity # TODO: Why doesn't `__disable_del self` work here? @@ -1078,18 +1082,3 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( fn _clip(value: Int, start: Int, end: Int) -> Int: return max(start, min(value, end)) - - -fn _move_pointee_into_many_elements[ - T: CollectionElement, //, hint_trivial_type: Bool -](dest: UnsafePointer[T], src: UnsafePointer[T], size: Int): - @parameter - if hint_trivial_type: - memcpy( - dest=dest.bitcast[Int8](), - src=src.bitcast[Int8](), - count=size * sizeof[T](), - ) - else: - for i in range(size): - (src + i).move_pointee_into(dest + i) diff --git a/mojo/stdlib/src/collections/string/_unicode.mojo b/mojo/stdlib/src/collections/string/_unicode.mojo index 4ec5cd280e..04613c373e 100644 --- a/mojo/stdlib/src/collections/string/_unicode.mojo +++ b/mojo/stdlib/src/collections/string/_unicode.mojo @@ -183,22 +183,21 @@ fn to_lowercase(s: StringSlice) -> String: ) var lowercase_char_opt = _get_lowercase_mapping(rune_and_size[0]) if lowercase_char_opt is None: - memcpy( - output._unsafe_next_uninit_ptr(), - input + input_offset, - rune_and_size[1], + output.extend( + Span[Byte, s.origin]( + ptr=input + input_offset, length=rune_and_size[1] + ) ) - output.size += rune_and_size[1] else: var lower_char: Codepoint = lowercase_char_opt.unsafe_value() - output.size += lower_char.unsafe_write_utf8( + output._len += lower_char.unsafe_write_utf8( output._unsafe_next_uninit_ptr() ) input_offset += rune_and_size[1] # Check if we need to reserve additional capacity. - if output.size >= output.capacity - 5: + if len(output) >= output.capacity - 5: output.reserve( output.capacity + _estimate_needed_size(s.byte_length() - input_offset) @@ -238,21 +237,20 @@ fn to_uppercase(s: StringSlice) -> String: ) for char_idx in range(count): var char: Codepoint = uppercase_replacement_chars[char_idx] - output.size += char.unsafe_write_utf8( + output._len += char.unsafe_write_utf8( output._unsafe_next_uninit_ptr() ) else: - memcpy( - output._unsafe_next_uninit_ptr(), - input + input_offset, - rune_and_size[1], + output.extend( + Span[Byte, s.origin]( + ptr=input + input_offset, length=rune_and_size[1] + ) ) - output.size += rune_and_size[1] input_offset += rune_and_size[1] # Check if we need to reserve additional capacity. - if output.size >= output.capacity - 5: + if len(output) >= output.capacity - 5: output.reserve( output.capacity + _estimate_needed_size(s.byte_length() - input_offset) diff --git a/mojo/stdlib/src/collections/string/codepoint.mojo b/mojo/stdlib/src/collections/string/codepoint.mojo index 934d74ce49..1974d40318 100644 --- a/mojo/stdlib/src/collections/string/codepoint.mojo +++ b/mojo/stdlib/src/collections/string/codepoint.mojo @@ -286,7 +286,7 @@ struct Codepoint(CollectionElement, EqualityComparable, Intable, Stringable): var buffer = List[Byte](capacity=char_len + 1) _ = self.unsafe_write_utf8(buffer.unsafe_ptr()) buffer.unsafe_ptr()[char_len] = 0 - buffer.size = char_len + 1 + buffer._len = char_len + 1 return String(buffer=buffer^) # ===-------------------------------------------------------------------===# diff --git a/mojo/stdlib/src/collections/string/format.mojo b/mojo/stdlib/src/collections/string/format.mojo index d1e8d34411..ec2935b9e5 100644 --- a/mojo/stdlib/src/collections/string/format.mojo +++ b/mojo/stdlib/src/collections/string/format.mojo @@ -147,9 +147,8 @@ struct _FormatCurlyEntry(CollectionElement, CollectionElementNew): entries, size_estimation = Self._create_entries(fmt_src, len_pos_args) var fmt_len = fmt_src.byte_length() var buf = String._buffer_type(capacity=fmt_len + size_estimation) - buf.size = 1 - buf.unsafe_set(0, 0) - var res = String(buf^) + buf.append(0) + var res = String(buffer=buf^) var offset = 0 var ptr = fmt_src.unsafe_ptr() alias S = StringSlice[StaticConstantOrigin] diff --git a/mojo/stdlib/src/collections/string/string.mojo b/mojo/stdlib/src/collections/string/string.mojo index 304d33b6cc..85e121f004 100644 --- a/mojo/stdlib/src/collections/string/string.mojo +++ b/mojo/stdlib/src/collections/string/string.mojo @@ -748,7 +748,7 @@ struct String( bytes: The byte span to write to this String. Must NOT be null terminated. """ - self._iadd[False](bytes) + self._iadd(bytes) fn write[*Ts: Writable](mut self, *args: *Ts): """Write a sequence of Writable arguments to the provided Writer. @@ -841,7 +841,7 @@ struct String( if buff[-1]: buff.append(0) - return String(buff^) + return String(buffer=buff^) # ===------------------------------------------------------------------=== # # Operator dunders @@ -861,10 +861,7 @@ struct String( """ # TODO(#933): implement this for unicode when we support llvm intrinsic evaluation at compile time var normalized_idx = normalize_index["String"](idx, len(self)) - var buf = Self._buffer_type(capacity=1) - buf.append(self._buffer[normalized_idx]) - buf.append(0) - return String(buf^) + return String(buffer=Self._buffer_type(self._buffer[normalized_idx], 0)) fn __getitem__(self, span: Slice) -> String: """Gets the sequence of characters at the specified positions. @@ -889,14 +886,12 @@ struct String( ) ) - var buffer = Self._buffer_type() - var result_len = len(r) - buffer.resize(result_len + 1, 0) + var buffer = Self._buffer_type(capacity=len(r) + 1) var ptr = self.unsafe_ptr() - for i in range(result_len): - buffer[i] = ptr[r[i]] - buffer[result_len] = 0 - return Self(buffer^) + for i in r: + buffer.append(ptr[i]) + buffer.append(0) + return String(buffer=buffer^) @always_inline fn __eq__(self, other: String) -> Bool: @@ -982,27 +977,19 @@ struct String( return not (self < rhs) @staticmethod - fn _add[rhs_has_null: Bool](lhs: Span[Byte], rhs: Span[Byte]) -> String: + fn _add(lhs: Span[Byte], rhs: Span[Byte]) -> String: var lhs_len = len(lhs) var rhs_len = len(rhs) - var lhs_ptr = lhs.unsafe_ptr() - var rhs_ptr = rhs.unsafe_ptr() alias S = StringSlice[ImmutableAnyOrigin] if lhs_len == 0: - return String(S(ptr=rhs_ptr, length=rhs_len)) + return String(S(ptr=rhs.unsafe_ptr(), length=rhs_len)) elif rhs_len == 0: - return String(S(ptr=lhs_ptr, length=lhs_len)) - var sum_len = lhs_len + rhs_len - var buffer = Self._buffer_type(capacity=sum_len + 1) - var ptr = buffer.unsafe_ptr() - memcpy(ptr, lhs_ptr, lhs_len) - memcpy(ptr + lhs_len, rhs_ptr, rhs_len + Int(rhs_has_null)) - buffer.size = sum_len + 1 - - @parameter - if not rhs_has_null: - ptr[sum_len] = 0 - return Self(buffer^) + return String(S(ptr=lhs.unsafe_ptr(), length=lhs_len)) + var buffer = Self._buffer_type(capacity=lhs_len + rhs_len + 1) + buffer.extend(lhs) + buffer.extend(rhs) + buffer.append(0) + return String(buffer=buffer^) @always_inline fn __add__(self, other: StringSlice) -> String: @@ -1014,7 +1001,7 @@ struct String( Returns: The new constructed string. """ - return Self._add[False](self.as_bytes(), other.as_bytes()) + return Self._add(self.as_bytes(), other.as_bytes()) @always_inline fn __radd__(self, other: StringSlice) -> String: @@ -1026,27 +1013,17 @@ struct String( Returns: The new constructed string. """ - return Self._add[True](other.as_bytes(), self.as_bytes()) + return Self._add(other.as_bytes(), self.as_bytes()) - fn _iadd[has_null: Bool](mut self, other: Span[Byte]): - var s_len = self.byte_length() + fn _iadd(mut self, other: Span[Byte]): var o_len = len(other) - var o_ptr = other.unsafe_ptr() - if s_len == 0: - alias S = StringSlice[ImmutableAnyOrigin] - self = String(S(ptr=o_ptr, length=o_len)) - return - elif o_len == 0: + if o_len == 0: return - var sum_len = s_len + o_len - self._buffer.reserve(sum_len + 1) - var s_ptr = self.unsafe_ptr() - memcpy(s_ptr + s_len, o_ptr, o_len + Int(has_null)) - self._buffer.size = sum_len + 1 - - @parameter - if not has_null: - s_ptr[sum_len] = 0 + self._buffer.reserve(self.byte_length() + o_len + 1) + if len(self._buffer) > 0: + _ = self._buffer.pop() + self._buffer.extend(other) + self._buffer.append(0) @always_inline fn __iadd__(mut self, other: StringSlice): @@ -1055,7 +1032,7 @@ struct String( Args: other: The string to append. """ - self._iadd[False](other.as_bytes()) + self._iadd(other.as_bytes()) @deprecated("Use `str.codepoints()` or `str.codepoint_slices()` instead.") fn __iter__(self) -> CodepointSliceIter[__origin_of(self)]: @@ -1366,11 +1343,7 @@ struct String( Returns: The pointer to the underlying memory. """ - var ptr = self.unsafe_ptr() - self._buffer.data = UnsafePointer[UInt8]() - self._buffer.size = 0 - self._buffer.capacity = 0 - return ptr + return self._buffer.steal_data() fn count(self, substr: StringSlice) -> Int: """Return the number of non-overlapping occurrences of substring diff --git a/mojo/stdlib/src/collections/string/string_slice.mojo b/mojo/stdlib/src/collections/string/string_slice.mojo index e1c6bf41ca..7ec78dc993 100644 --- a/mojo/stdlib/src/collections/string/string_slice.mojo +++ b/mojo/stdlib/src/collections/string/string_slice.mojo @@ -939,15 +939,11 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( The string concatenated `n` times. """ - var len_self = self.byte_length() - var count = len_self * n + 1 - var buf = String._buffer_type(capacity=count) - buf.size = count - var b_ptr = buf.unsafe_ptr() + var buffer = List[Byte](capacity=self.byte_length() * n + 1) for i in range(n): - memcpy(b_ptr + len_self * i, self.unsafe_ptr(), len_self) - b_ptr[count - 1] = 0 - return String(buf^) + buffer.extend(self.as_bytes()) + buffer.append(0) + return String(buffer=buffer) # ===------------------------------------------------------------------===# # Methods diff --git a/mojo/stdlib/src/memory/span.mojo b/mojo/stdlib/src/memory/span.mojo index 290c720f61..70a0482a52 100644 --- a/mojo/stdlib/src/memory/span.mojo +++ b/mojo/stdlib/src/memory/span.mojo @@ -166,7 +166,7 @@ struct Span[ list: The list to which the span refers. """ self._data = list.data.address_space_cast[address_space]() - self._len = list.size + self._len = list._len @always_inline @implicit diff --git a/mojo/stdlib/src/pathlib/path.mojo b/mojo/stdlib/src/pathlib/path.mojo index 38f8683dc5..ce5cff99fa 100644 --- a/mojo/stdlib/src/pathlib/path.mojo +++ b/mojo/stdlib/src/pathlib/path.mojo @@ -151,7 +151,7 @@ struct Path( Returns: A string representation of the path. """ - return String.write(self) + return self.path @always_inline fn __bool__(self) -> Bool: diff --git a/mojo/stdlib/test/collections/test_list_getitem_invalid_index.mojo b/mojo/stdlib/test/collections/test_list_getitem_invalid_index.mojo index 34ef22d26c..09bb5c0a45 100644 --- a/mojo/stdlib/test/collections/test_list_getitem_invalid_index.mojo +++ b/mojo/stdlib/test/collections/test_list_getitem_invalid_index.mojo @@ -17,7 +17,7 @@ # CHECK-FAIL-LABEL: test_fail_list_index fn main(): print("== test_fail_list_index") - # CHECK-FAIL: index: 4 is out of bounds for `List` of size: 3 + # CHECK-FAIL: index: 4 is out of bounds for `List` of length: 3 nums = List[Int](1, 2, 3) print(nums[4]) From 87b50fcbd0fe7a321b4fac191866d146bac732a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8rstad?= Date: Thu, 27 Feb 2025 16:38:34 +0100 Subject: [PATCH 15/44] [Pipelines] Remove dependency on scipy (#56734) MODULAR_ORIG_COMMIT_REV_ID: c39bb49bc0f7d0f5207646ac54bf86e325f62553 --- .../pipelines/nn/compute_log_probabilities.py | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/max/pipelines/nn/compute_log_probabilities.py b/src/max/pipelines/nn/compute_log_probabilities.py index 2914c34582..150ae74479 100644 --- a/src/max/pipelines/nn/compute_log_probabilities.py +++ b/src/max/pipelines/nn/compute_log_probabilities.py @@ -17,7 +17,38 @@ import numpy as np from max.pipelines import LogProbabilities -from scipy.special import log_softmax # type: ignore + + +def log_softmax(x: np.ndarray, axis: int = -1) -> np.ndarray: + """Compute the logarithm of the softmax function. + + This implementation uses the identity log(softmax(x)) = x - log(sum(exp(x))) + with numerical stability improvements to prevent overflow/underflow. + + Args: + x: Input array + axis: Axis to compute values along + + Returns: + Array with same shape as x, representing log(softmax(x)) + """ + # Subtract max value for numerical stability (prevents exp overflow) + x_max = np.amax(x, axis=axis, keepdims=True) + + # Compute exp(x - x_max) which is now safe from overflow + shifted_x = x - x_max + exp_shifted = np.exp(shifted_x) + + # Suppress -inf warnings from log(0) + # This can happen when input contains extreme negative values (-inf), + # which become 0 after exp() operation + with np.errstate(divide="ignore"): + sum_exp = np.sum(exp_shifted, axis=axis, keepdims=True) + log_sum_exp = np.log(sum_exp) + + # Final result: x - x_max - log(sum(exp(x - x_max))) + # This is mathematically equivalent to log(softmax(x)) + return shifted_x - log_sum_exp def compute_log_probabilities( From 56813a471e25a2be23c0aaf13938b84399268214 Mon Sep 17 00:00:00 2001 From: Patrick Dougherty Date: Thu, 27 Feb 2025 09:44:48 -0600 Subject: [PATCH 16/44] [CI] Update scripts for repo changes MODULAR_ORIG_COMMIT_REV_ID: c83157382bee3bb3eae3aa90ddb4921903febfcf --- examples/mojo/lit.cfg.py | 71 +++++++++++++++++++ examples/mojo/run-examples.sh | 25 +++++++ .../standard_library_tests_and_examples.yml | 1 + mojo/pixi.toml | 2 +- 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 examples/mojo/lit.cfg.py create mode 100755 examples/mojo/run-examples.sh diff --git a/examples/mojo/lit.cfg.py b/examples/mojo/lit.cfg.py new file mode 100644 index 0000000000..f4bc0fc233 --- /dev/null +++ b/examples/mojo/lit.cfg.py @@ -0,0 +1,71 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +import os +from pathlib import Path + +import lit.formats +import lit.llvm + +config.test_format = lit.formats.ShTest(True) + +# name: The name of this test suite. +config.name = "Mojo Public Examples" + +# suffixes: A list of file extensions to treat as test files. +# TODO: Enable notebooks +config.suffixes = [".mojo", ".🔥"] + +config.excludes = [ + # No RUN: directive, just bare examples + "hello_interop.mojo", + "matmul.mojo", +] + [path.name for path in os.scandir("../examples/mojo") if path.is_dir()] + +# Have the examples run in the build directory. +# The `run-examples.sh` script creates the build directory. +build_root = Path.cwd().parent.parent / "mojo" / "build" + +# Execute the examples inside this part of the build +# directory to avoid polluting the source tree. +config.test_exec_root = build_root / "examples" / "mojo" + +# test_source_root: The root path where tests are located. +config.test_source_root = Path(__file__).parent.resolve() + +# Substitute %mojo for just `mojo` itself. +config.substitutions.insert(0, ("%mojo", "mojo")) + +pre_built_packages_path = os.environ.get( + "MODULAR_MOJO_NIGHTLY_IMPORT_PATH", + Path(os.environ["MODULAR_HOME"]) + / "pkg" + / "packages.modular.com_nightly_mojo" + / "lib" + / "mojo", +) + +os.environ[ + "MODULAR_MOJO_NIGHTLY_IMPORT_PATH" +] = f"{build_root},{pre_built_packages_path}" + +# Pass through several environment variables +# to the underlying subprocesses that run the tests. +lit.llvm.initialize(lit_config, config) +lit.llvm.llvm_config.with_system_environment( + [ + "MODULAR_HOME", + "MODULAR_MOJO_NIGHTLY_IMPORT_PATH", + "PATH", + ] +) diff --git a/examples/mojo/run-examples.sh b/examples/mojo/run-examples.sh new file mode 100755 index 0000000000..323239e1a6 --- /dev/null +++ b/examples/mojo/run-examples.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +set -euo pipefail + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +REPO_ROOT="${SCRIPT_DIR}"/../../ +EXAMPLES_DIR="${REPO_ROOT}"/examples/mojo + +BUILD_DIR="${REPO_ROOT}"/mojo/build +mkdir -p "${BUILD_DIR}" + +# Run the examples using `lit`. +lit -sv "${EXAMPLES_DIR}" diff --git a/mojo/.github/workflows/standard_library_tests_and_examples.yml b/mojo/.github/workflows/standard_library_tests_and_examples.yml index 2f13005fb3..14a4f3dc45 100644 --- a/mojo/.github/workflows/standard_library_tests_and_examples.yml +++ b/mojo/.github/workflows/standard_library_tests_and_examples.yml @@ -62,6 +62,7 @@ jobs: - name: Run standard library tests and examples env: MOJO_ENABLE_ASSERTIONS_IN_TESTS: ${{ matrix.mojo-enable-assertions }} + working-directory: mojo run: | magic run --frozen tests magic run --frozen examples diff --git a/mojo/pixi.toml b/mojo/pixi.toml index 37772a1b5e..5a4c015d34 100644 --- a/mojo/pixi.toml +++ b/mojo/pixi.toml @@ -7,7 +7,7 @@ platforms = ["linux-64", "linux-aarch64", "osx-arm64"] [tasks] build = "./stdlib/scripts/build-stdlib.sh" tests = "./stdlib/scripts/run-tests.sh" -examples = "./examples/run-examples.sh" +examples = "../examples/mojo/run-examples.sh" benchmarks = { cmd = ["./stdlib/scripts/run-benchmarks.sh"], env = { MODULAR_MOJO_NIGHTLY_IMPORT_PATH = "$CONDA_PREFIX/lib/mojo" } } [dependencies] From 479c0eb1f1ee53769dec2003c439401ad48dbc8b Mon Sep 17 00:00:00 2001 From: Ewa Matejska Date: Thu, 27 Feb 2025 08:04:56 -0800 Subject: [PATCH 17/44] [CI][Docs] Updating readmes and .github for merge of max/mojo repos MODULAR_ORIG_COMMIT_REV_ID: 5d22e1cb3a7fece09567d5460ccd51c18b9d587f --- .github/CODEOWNERS | 18 +++++ .github/ISSUE_TEMPLATE/CODEOWNERS | 5 -- .github/ISSUE_TEMPLATE/magic_issue.yaml | 61 +++++++++++++++++ .github/ISSUE_TEMPLATE/max_bug_report.yaml | 2 +- .../ISSUE_TEMPLATE/max_builds_bug_report.yaml | 2 +- .../ISSUE_TEMPLATE/max_feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/mojo_bug_report.yaml | 61 +++++++++++++++++ .../ISSUE_TEMPLATE/mojo_feature_request.yaml | 63 +++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 10 +++ .github/workflows/check_pr_target.yml | 28 ++++++++ .github/workflows/check_pr_title.yml | 53 +++++++++++++++ .../standard_library_tests_and_examples.yml | 68 +++++++++++++++++++ .github/workflows/test_pre_commit.yml | 52 ++++++++++++++ README.md | 8 ++- examples/README.md | 5 ++ examples/mojo/README.md | 2 +- examples/mojo/check_mod.py | 2 +- mojo/CONTRIBUTING.md | 14 ++-- mojo/README.md | 18 ++--- mojo/proposals/byte-as-uint8.md | 2 +- mojo/proposals/inferred-parameters.md | 2 +- mojo/proposals/lifetimes-keyword-renaming.md | 2 +- mojo/proposals/ref-convention.md | 4 +- mojo/proposals/remove-let-decls.md | 10 +-- mojo/stdlib/README.md | 2 +- mojo/stdlib/docs/development.md | 4 +- mojo/stdlib/src/builtin/simd.mojo | 2 +- mojo/stdlib/src/collections/linked_list.mojo | 2 +- mojo/stdlib/test/builtin/test_issue_1004.mojo | 2 +- mojo/stdlib/test/builtin/test_issue_1505.mojo | 2 +- mojo/stdlib/test/builtin/test_simd.mojo | 4 +- mojo/stdlib/test/collections/test_list.mojo | 2 +- 32 files changed, 466 insertions(+), 48 deletions(-) create mode 100644 .github/CODEOWNERS delete mode 100644 .github/ISSUE_TEMPLATE/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/magic_issue.yaml create mode 100644 .github/ISSUE_TEMPLATE/mojo_bug_report.yaml create mode 100644 .github/ISSUE_TEMPLATE/mojo_feature_request.yaml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/check_pr_target.yml create mode 100644 .github/workflows/check_pr_title.yml create mode 100644 .github/workflows/standard_library_tests_and_examples.yml create mode 100644 .github/workflows/test_pre_commit.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..97ce248c98 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,18 @@ +# Codeowners for MAX repo. +# Every line is a file pattern that is followed by one or more code owners. +# Order is important; the last matching pattern takes the most precedence. + +# Standard Library Sources +/mojo/stdlib/ @modular/stdlib + +# Documentation +/mojo/docs/ @modular/mojo-docs + +/mojo/docs/changelog.md @modular/stdlib + +/mojo/stdlib/docs/ @modular/mojo-docs @modular/stdlib + +# Examples +/examples/mojo/ @jackos + +* @modularml/max-code-reviewers diff --git a/.github/ISSUE_TEMPLATE/CODEOWNERS b/.github/ISSUE_TEMPLATE/CODEOWNERS deleted file mode 100644 index 303c1ec52f..0000000000 --- a/.github/ISSUE_TEMPLATE/CODEOWNERS +++ /dev/null @@ -1,5 +0,0 @@ -# Codeowners for MAX repo. -# Every line is a file pattern that is followed by one or more code owners. -# Order is important; the last matching pattern takes the most precedence. - -* @modularml/max-code-reviewers diff --git a/.github/ISSUE_TEMPLATE/magic_issue.yaml b/.github/ISSUE_TEMPLATE/magic_issue.yaml new file mode 100644 index 0000000000..0f5ce15b62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/magic_issue.yaml @@ -0,0 +1,61 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: Magic issue report +description: Create an issue to help us improve Magic +title: "[Magic]" +labels: + - "magic" +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out a bug report! + + Please provide a descriptive title above and fill in the following fields. + + - type: textarea + id: Description + attributes: + label: Bug description + description: Describe the bug you encountered and what you expected to happen. + value: | + ### Actual behavior + + + ### Expected behavior + + validations: + required: true + + - type: textarea + id: Steps + attributes: + label: Steps to reproduce + description: Provide the specific steps to reproduce the issue. + value: | + - Provide a relevant code snippet or a link to the code that did not work as expected. + - If applicable, add screenshots to help explain the problem. + - If using the Playground, name the pre-existing notebook that failed and the steps that led to failure. + - Include anything else that might help us debug the issue. + validations: + required: true + + - type: textarea + id: Context + attributes: + label: System information + description: What version of Mojo are you using? + value: | + - Provide the system information by running `magic info`. + - Provide version information for MAX (includes Mojo) by pasting the output of `magic list max`. diff --git a/.github/ISSUE_TEMPLATE/max_bug_report.yaml b/.github/ISSUE_TEMPLATE/max_bug_report.yaml index 573a7069e2..097602640a 100644 --- a/.github/ISSUE_TEMPLATE/max_bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/max_bug_report.yaml @@ -15,7 +15,7 @@ name: MAX bug report description: Create a bug report to help us improve MAX title: "[BUG]: " labels: - - bug + - "bug,max" body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml b/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml index 0c43f15bac..65faa039e5 100644 --- a/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/max_builds_bug_report.yaml @@ -15,7 +15,7 @@ name: MAX Builds model bug report description: Report a bug with a model title: "[BUG]: " labels: - - bug + - max-builds body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/max_feature_request.yaml b/.github/ISSUE_TEMPLATE/max_feature_request.yaml index 57e6716fb8..b9a61bd61a 100644 --- a/.github/ISSUE_TEMPLATE/max_feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/max_feature_request.yaml @@ -15,7 +15,7 @@ name: MAX feature request description: Suggest an enhancement for MAX title: "[Feature Request]" labels: - - enhancement + - "enhancement,max" body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/mojo_bug_report.yaml b/.github/ISSUE_TEMPLATE/mojo_bug_report.yaml new file mode 100644 index 0000000000..57b19d978c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/mojo_bug_report.yaml @@ -0,0 +1,61 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: Mojo bug report +description: Create a bug report to help us improve Mojo +title: "[BUG]" +labels: + - "bug,mojo" +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out a bug report! + + Please provide a descriptive title above and fill in the following fields. + + - type: textarea + id: Description + attributes: + label: Bug description + description: Describe the bug you encountered and what you expected to happen. + value: | + ### Actual behavior + + + ### Expected behavior + + validations: + required: true + + - type: textarea + id: Steps + attributes: + label: Steps to reproduce + description: Provide the specific steps to reproduce the issue. + value: | + - Provide a relevant code snippet or a link to the code that did not work as expected. + - If applicable, add screenshots to help explain the problem. + - If using the Playground, name the pre-existing notebook that failed and the steps that led to failure. + - Include anything else that might help us debug the issue. + validations: + required: true + + - type: textarea + id: Context + attributes: + label: System information + description: What version of Mojo are you using? + value: | + - Provide the system information by running `magic info`. + - Provide version information for MAX (includes Mojo) by pasting the output of `magic list max`. diff --git a/.github/ISSUE_TEMPLATE/mojo_feature_request.yaml b/.github/ISSUE_TEMPLATE/mojo_feature_request.yaml new file mode 100644 index 0000000000..a5ddc32a58 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/mojo_feature_request.yaml @@ -0,0 +1,63 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + +name: Mojo feature request +description: Suggest an enhancement for Mojo +title: "[Feature Request]" +labels: + - "enhancement,mojo" +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to suggest a Mojo enhancement! + + Please enter a concise title above and fill out the following fields. + + - type: checkboxes + id: Roadmap + attributes: + label: Review Mojo's priorities + description: Please take a look at our roadmap before you file a new feature request. + options: + - label: I have read the [roadmap and priorities](https://docs.modular.com/mojo/roadmap.html#overall-priorities) and I believe this request falls within the priorities. + required: true + + - type: markdown + attributes: + value: | + If the request is out of the published roadmap and priorities, please start a [discussion](https://forum.modular.com/) in the Modular Forum to get feedback from the team. + + - type: textarea + id: Request + attributes: + label: What is your request? + description: Describe how you'd like us to improve Mojo. + validations: + required: true + + - type: textarea + id: Motivation + attributes: + label: What is your motivation for this change? + description: Describe the problem that your feature seeks to address (what is the value to the product/user?). + validations: + required: true + + - type: textarea + id: Description + attributes: + label: Any other details? + description: Perhaps some minimum functional attributes the implementation should include, or other context about your feature. + validations: + required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..2cd5f0bf30 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ + diff --git a/.github/workflows/check_pr_target.yml b/.github/workflows/check_pr_target.yml new file mode 100644 index 0000000000..4e333baf2a --- /dev/null +++ b/.github/workflows/check_pr_target.yml @@ -0,0 +1,28 @@ +name: Check PR target branch + +on: + pull_request: + types: [opened, edited, synchronize, reopened, ready_for_review] + +permissions: + contents: read + pull-requests: read + +jobs: + check-pr-target: + name: Check PR target branch + + runs-on: ubuntu-latest + timeout-minutes: 10 + + defaults: + run: + shell: bash + + steps: + - name: Fail if not targeting main branch + if: ${{ github.base_ref != 'main' }} + run: | + echo "PRs must be targeted to merge to the main branch!" + echo "PR is currently targeting: \"${{ github.base_ref }}\"" + exit 1 diff --git a/.github/workflows/check_pr_title.yml b/.github/workflows/check_pr_title.yml new file mode 100644 index 0000000000..9b2f320a15 --- /dev/null +++ b/.github/workflows/check_pr_title.yml @@ -0,0 +1,53 @@ +name: Check PR title + +on: + pull_request: + # By default, a workflow only runs when a pull_request's activity type is opened, synchronize, or reopened. We + # explicitly override here so that PR titles are re-linted when the PR text content is edited. + # + # Possible values: https://help.github.com/en/actions/reference/events-that-trigger-workflows#pull-request-event-pull_request + types: [opened, edited, reopened, synchronize, ready_for_review] + +jobs: + check-pr-title: + name: Check PR title format + + permissions: + pull-requests: write + + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - uses: morrisoncole/pr-lint-action@51f3cfabaf5d46f94e54524214e45685f0401b2a + if: github.actor != 'dependabot[bot]' + with: + title-regex: "^(Revert \")?(\\[\\S.*\\]\\s?)+\\s+[a-zA-Z`].*" + repo-token: "${{ secrets.GITHUB_TOKEN }}" + on-failed-regex-fail-action: true + on-failed-regex-create-review: true + on-failed-regex-request-changes: true + on-failed-regex-comment: + "The PR title does not conform to the '[\\] Title' format. + Please update the PR title. + \n\n + Typical [\\] values include: + \n\n + * `[stdlib]` — indicates a change to the Mojo standard library code\n + * `[docs]` — indicates a change to the documentation + \n\n + It's okay to include multiple labels on a PR that + affect multiple areas of work. + \n\n + Thank you for contributing to Mojo!🔥 + \n\n + + You can also use a tool like www.regex101.com to see why your PR + title fails to conform. Use + ``` + %regex% + ``` + as the regex to test and ```${{ github.event.pull_request.title }}``` + as the test string." + on-succeeded-regex-dismiss-review-comment: + "All good now, thanks!🫸🫷" diff --git a/.github/workflows/standard_library_tests_and_examples.yml b/.github/workflows/standard_library_tests_and_examples.yml new file mode 100644 index 0000000000..980e1e8678 --- /dev/null +++ b/.github/workflows/standard_library_tests_and_examples.yml @@ -0,0 +1,68 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +name: Test stdlib and examples +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + workflow_dispatch: + +permissions: + contents: read + pull-requests: read + +jobs: + test-examples: + name: with ${{ matrix.os }} and assertions=${{ matrix.mojo-enable-assertions }} + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "macos-14"] + mojo-enable-assertions: [0, 1] + + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + + defaults: + run: + shell: bash + env: + DEBIAN_FRONTEND: noninteractive + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Download Magic CLI + run: | + curl -ssL https://magic.modular.com/cfba4c92-2390-4b86-93de-04b2f47114d5 | bash + # Add magic to PATH + echo "$HOME/.modular/bin" >> $GITHUB_PATH + + - name: Install build tools (Linux) + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + ./mojo/stdlib/scripts/install-build-tools-linux.sh + + - name: Install build tools (macOS) + if: ${{ matrix.os == 'macos-14' }} + run: | + ./mojo/stdlib/scripts/install-build-tools-macos.sh + + - name: Run standard library tests and examples + env: + MOJO_ENABLE_ASSERTIONS_IN_TESTS: ${{ matrix.mojo-enable-assertions }} + working-directory: mojo + run: | + magic run --frozen tests + magic run --frozen examples diff --git a/.github/workflows/test_pre_commit.yml b/.github/workflows/test_pre_commit.yml new file mode 100644 index 0000000000..99a2ddf73d --- /dev/null +++ b/.github/workflows/test_pre_commit.yml @@ -0,0 +1,52 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +name: Run pre-commit +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + workflow_dispatch: + +permissions: + contents: read + pull-requests: read + +jobs: + lint: + runs-on: "ubuntu-latest" + timeout-minutes: 30 + + defaults: + run: + shell: bash + env: + DEBIAN_FRONTEND: noninteractive + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Download Magic CLI + run: | + curl -ssL https://magic.modular.com/cfba4c92-2390-4b86-93de-04b2f47114d5 | bash + # Add magic to PATH + echo "$HOME/.modular/bin" >> $GITHUB_PATH + + - name: Install pre-commit + run: | + pip install pre-commit + pre-commit install + + - name: Run pre-commit + run: magic run pre-commit run --all-files + diff --git a/README.md b/README.md index 92d8013410..24507ed98d 100644 --- a/README.md +++ b/README.md @@ -85,9 +85,13 @@ The MAX container image is available in the ## Contributing Thanks for your interest in contributing to this repository! -We are not accepting pull requests yet. -However, we welcome your bug reports. If you have a bug, please file an issue +We accept contributions to the [Mojo standard library](./mojo). +Please see the [Contribution Guide](mojo/CONTRIBUTING.md) for instructions. + +We are not accepting contributions for other parts of the repository. + +We also welcome your bug reports. If you have a bug, please file an issue [here](https://github.com/modular/max/issues/new/choose). If you need support, the [Discord](https://discord.gg/modular) diff --git a/examples/README.md b/examples/README.md index 0722ca6ec4..b4f2e87907 100644 --- a/examples/README.md +++ b/examples/README.md @@ -3,6 +3,11 @@ These examples demonstrate the power and flexibility of [MAX](https://docs.modular.com/max/). They include: +## [Mojo code examples](mojo/) + +A collection of sample programs written in the +[Mojo](https://docs.modular.com/mojo/manual/) programming language. + ## [Custom GPU and CPU operations in Mojo](custom_ops/) The [MAX Graph API](https://docs.modular.com/max/graph/) provides a powerful diff --git a/examples/mojo/README.md b/examples/mojo/README.md index 6c651cd92d..f40ecbc1ca 100644 --- a/examples/mojo/README.md +++ b/examples/mojo/README.md @@ -16,7 +16,7 @@ After you have set up a Mojo programming environment, you can then use `git` to clone this repository of Mojo samples using the command below: ```bash -git clone https://github.com/modular/mojo.git +git clone https://github.com/modular/max.git ``` ## Running diff --git a/examples/mojo/check_mod.py b/examples/mojo/check_mod.py index e2f2719906..36049a4fd7 100644 --- a/examples/mojo/check_mod.py +++ b/examples/mojo/check_mod.py @@ -18,7 +18,7 @@ FIX = """ ------------------------------------------------------------------------- fix following the steps here: - https://github.com/modular/mojo/issues/1085#issuecomment-1771403719 + https://github.com/modular/max/issues/1085#issuecomment-1771403719 ------------------------------------------------------------------------- """ diff --git a/mojo/CONTRIBUTING.md b/mojo/CONTRIBUTING.md index 4c39f7729a..14e6ee1a9a 100644 --- a/mojo/CONTRIBUTING.md +++ b/mojo/CONTRIBUTING.md @@ -210,7 +210,7 @@ which represents the most recent nightly build. Before you start your first pull request, please complete this checklist: - Read this entire contributor guide. -- Read the [Code of Conduct](./CODE_OF_CONDUCT.md). +- Read the [Code of Conduct](../CODE_OF_CONDUCT.md). #### Evaluate and get buy-in on the change @@ -222,7 +222,7 @@ for more details. #### Fork and clone the repo -Go to the [Mojo repo](https://github.com/modular/mojo) and click the fork +Go to the [MAX repo](https://github.com/modular/max) and click the fork button: ![Create Fork](stdlib/docs/images/create-fork.png) @@ -230,14 +230,14 @@ button: Clone your forked repo locally with the command: ```bash -git clone git@github.com:[your-username]/mojo.git -cd mojo +git clone git@github.com:[your-username]/max.git +cd max/mojo ``` Add the upstream remote and fetch it: ```bash -git remote add upstream git@github.com:modular/mojo.git +git remote add upstream git@github.com:modular/max.git git fetch upstream ``` @@ -311,10 +311,10 @@ You'll see a link to create a PR: ```plaintext remote: Create a pull request for 'my-fix-pr' on GitHub by visiting: -remote: https://github.com/[your-username]/mojo/pull/new/my-fix-pr +remote: https://github.com/[your-username]/max/pull/new/my-fix-pr ``` -It should automatically set the base branch to the upstream `modular/mojo/main`, +It should automatically set the base branch to the upstream `modular/max/main`, but if it doesn't, you can set it manually. Now fill out the details: diff --git a/mojo/README.md b/mojo/README.md index 2a4878c789..8e4682b38b 100644 --- a/mojo/README.md +++ b/mojo/README.md @@ -26,11 +26,11 @@ This repo includes source code for: This repo has two primary branches: -- The [`stable`](https://github.com/modular/mojo/tree/stable) branch, which +- The [`stable`](https://github.com/modular/max/tree/stable) branch, which is in sync with the last stable released version of Mojo. Use the examples here if you’re using a [release build of Mojo](#latest-released). -- The [`main`](https://github.com/modular/mojo/tree/main) branch, which +- The [`main`](https://github.com/modular/max/tree/main) branch, which is in sync with the Mojo nightly build and subject to breakage. Use this branch for [contributions](./CONTRIBUTING.md), or if you're using the latest [nightly build of Mojo](#latest-nightly). @@ -79,7 +79,7 @@ When you clone this repo, you'll be on the `main` branch by default, which includes code matching the latest nightly build: ```bash -git clone https://github.com/modular/mojo.git +git clone https://github.com/modular/max.git ``` If you want to instead see the source from the most recent stable @@ -88,13 +88,13 @@ release, then you can switch to the `stable` branch. ## Contributing When you want to report issues or request features, [please create a GitHub -issue here](https://github.com/modular/mojo/issues). +issue here](https://github.com/modular/max/issues). See [here](./CONTRIBUTING.md) for guidelines on filing good bugs. -We welcome contributions to this repo on the -[`main`](https://github.com/modular/mojo/tree/main) +We welcome contributions to this repo for mojo on the +[`main`](https://github.com/modular/max/tree/main) branch. If you’d like to contribute to Mojo, please first read our [Contributor -Guide](https://github.com/modular/mojo/blob/main/CONTRIBUTING.md). +Guide](https://github.com/modular/max/blob/main/mojo/CONTRIBUTING.md). For more general questions or to chat with other Mojo developers, check out our [Discord](https://discord.gg/modular). @@ -108,6 +108,6 @@ MAX and Mojo usage and distribution are licensed under the ## Thanks to our contributors - - + + diff --git a/mojo/proposals/byte-as-uint8.md b/mojo/proposals/byte-as-uint8.md index 9881574ccd..03d4f77189 100644 --- a/mojo/proposals/byte-as-uint8.md +++ b/mojo/proposals/byte-as-uint8.md @@ -40,5 +40,5 @@ and 78 results for `DTypePointer[DType.int8]`. Replacing `DTypePointer[DType.int8]` with `DTypePointer[DType.uint8]` and `Pointer[Int8]` with `Pointer[UInt8]` on case by case bases is a substantial refactoring effort, but it will prevent a certain class of logical bugs (see -). As it is a breaking change in +). As it is a breaking change in sense of API design, it is sensible to do the refactoring as soon as possible. diff --git a/mojo/proposals/inferred-parameters.md b/mojo/proposals/inferred-parameters.md index f8eb6bf5c1..0e46dc0c1a 100644 --- a/mojo/proposals/inferred-parameters.md +++ b/mojo/proposals/inferred-parameters.md @@ -49,7 +49,7 @@ scalar_param[DType.int32, Int32()]() # 'dt' parameter is required This has been requested multiple times in various forms, especially given the new autoparameterization feature. The current tracking feature request: -- +- ## Proposal diff --git a/mojo/proposals/lifetimes-keyword-renaming.md b/mojo/proposals/lifetimes-keyword-renaming.md index 3b783202e7..b39636e616 100644 --- a/mojo/proposals/lifetimes-keyword-renaming.md +++ b/mojo/proposals/lifetimes-keyword-renaming.md @@ -2,7 +2,7 @@ Date: October 2024 -Previous revision: [[June 2023](https://github.com/modular/mojo/blob/f8d7cb8ba4c21ec3fbc87e21609b3fd56cab695f/proposals/lifetimes-keyword-renaming.md)] +Previous revision: [[June 2023](https://github.com/modular/max/blob/f8d7cb8ba4c21ec3fbc87e21609b3fd56cab695f/proposals/lifetimes-keyword-renaming.md)] The design of the Mojo references subsystem is starting to come together. To finalize the major points, it helps to come back and re-evaluate several early diff --git a/mojo/proposals/ref-convention.md b/mojo/proposals/ref-convention.md index 53b608e51e..f3c86e107c 100644 --- a/mojo/proposals/ref-convention.md +++ b/mojo/proposals/ref-convention.md @@ -12,7 +12,7 @@ Mojo’s safe references have evolved and iterated a lot. From the initial compiler re-plumbing that made memory-only types possible, to threading lifetimes through everything with the introduction of `!lit.ref` to the development of a “user-space” Reference type, to the recent discussions about -[adding automatic dereference to Reference](https://github.com/modular/mojo/discussions/2594), +[adding automatic dereference to Reference](https://github.com/modular/max/discussions/2594), we’ve been iteratively improving the model with a goal of ending up with something powerful and explainable. @@ -42,7 +42,7 @@ Along the way, we’ve had a number of challenges to address: to `Reference`. It would be awesome to clarify this. 5. We still need to - [reconsider which keywords](https://github.com/modular/mojo/blob/main/proposals/lifetimes-keyword-renaming.md) + [reconsider which keywords](https://github.com/modular/max/blob/main/mojo/proposals/lifetimes-keyword-renaming.md) to use for argument conventions. The `inout` keyword, for example, is problematic because it works with types that are not movable or copyable. The callee doesn’t actually move things in and out, it takes a mutable reference. diff --git a/mojo/proposals/remove-let-decls.md b/mojo/proposals/remove-let-decls.md index 1d1f8a3692..2fda1bc30b 100644 --- a/mojo/proposals/remove-let-decls.md +++ b/mojo/proposals/remove-let-decls.md @@ -1,6 +1,6 @@ # Simplifying Mojo🔥 - let's get rid of `let` -Chris Lattner, Dec 5, 2023, Status: **Accepted**, [discussion thread](https://github.com/modular/mojo/discussions/1456#discussioncomment-8358722) +Chris Lattner, Dec 5, 2023, Status: **Accepted**, [discussion thread](https://github.com/modular/max/discussions/1456#discussioncomment-8358722) Mojo is still a new language, and is rapidly evolving. We’re learning a lot from other languages, but Mojo poses its own set of tradeoffs that indicate a @@ -10,7 +10,7 @@ One of the early decisions made in Mojo's development is that it adopts the `let` and `var` design point that Swift uses. This whitepaper argues that we should switch to a simpler model by jettisoning `let` and just retaining `var` (and implicit Python-style variable declarations in `def`). This has also been -[suggested by the community](https://github.com/modular/mojo/issues/1205). +[suggested by the community](https://github.com/modular/max/issues/1205). Note that immutability and value semantics remain an important part of the Mojo design, this is just about removing "named immutable variables". Immutable @@ -31,7 +31,7 @@ variables aren't a core programming concept, and not something required to achieve Mojo's goals. 2. The naming of `let` caused a lot of early [heat and -debate](https://github.com/modular/mojo/discussions/120). Other programming +debate](https://github.com/modular/max/discussions/120). Other programming languages have a wide range of design points (e.g. `const` in C/C++ and Javascript) and there is a divergence of naming for all these things: `let`, `val`, `const`, etc, etc. @@ -43,7 +43,7 @@ three concepts going around: `alias`, `let`, and `var`. Most of the uses of 4. Both Swift and Rust encourage immutable values - Swift (and currently Mojo) warn about unneeded mutability, Rust makes mutability more verbose (`let mut`), and some propose that Mojo [make mutability more -verbose](https://github.com/modular/mojo/issues/451). This cuts very hard +verbose](https://github.com/modular/max/issues/451). This cuts very hard against a lot of the design center of Python, which doesn’t even have this concept at all: it would be weird to make it the default, but if we don’t, then why bother having it? @@ -112,7 +112,7 @@ This would eliminate a bunch of complexity in the compiler as well: like: “`let x: Int; x = 1; use(x); x = 2; use(x)`” even though the original lifetime of the first “`x=1`” naturally ended and “`x`” is uninitialized before being assigned to. This has always been a design smell, and it - [doesn’t work right](https://github.com/modular/mojo/issues/1414). + [doesn’t work right](https://github.com/modular/max/issues/1414). This proposal will not affect runtime performance at all as far as we know. diff --git a/mojo/stdlib/README.md b/mojo/stdlib/README.md index d64144c02d..8a9891f02d 100644 --- a/mojo/stdlib/README.md +++ b/mojo/stdlib/README.md @@ -54,6 +54,6 @@ See the license file in the repository for more details. ## Support For any inquiries, bug reports, or feature requests, please [open an -issue](https://github.com/modular/mojo/issues) on the GitHub repository. See +issue](https://github.com/modular/max/issues) on the GitHub repository. See the [Mojo contributor guide](../CONTRIBUTING.md) for guidelines on filing good bugs. diff --git a/mojo/stdlib/docs/development.md b/mojo/stdlib/docs/development.md index 37cfb5182e..a306c57515 100644 --- a/mojo/stdlib/docs/development.md +++ b/mojo/stdlib/docs/development.md @@ -107,7 +107,7 @@ You can do the same for a directory with All the tests should pass on the `main` branch with the nightly Mojo compiler. If you've pulled the latest changes and they're still failing please [open a GitHub -issue](https://github.com/modular/mojo/issues/new?assignees=&labels=bug%2Cmojo&projects=&template=mojo_bug_report.yaml&title=%5BBUG%5D). +issue](https://github.com/modular/max/issues). ### Running a subset of the Standard Library Unit Tests @@ -135,7 +135,7 @@ disabled, you can set the environment variable `MOJO_ENABLE_ASSERTIONS_IN_TESTS=0`. If you run into any issues when running the tests, -[please file an issue](https://github.com/modular/mojo/issues) and we’ll take +[please file an issue](https://github.com/modular/max/issues) and we’ll take a look. ## Formatting changes diff --git a/mojo/stdlib/src/builtin/simd.mojo b/mojo/stdlib/src/builtin/simd.mojo index 018d8f5f25..3a39d1c5ed 100644 --- a/mojo/stdlib/src/builtin/simd.mojo +++ b/mojo/stdlib/src/builtin/simd.mojo @@ -2256,7 +2256,7 @@ struct SIMD[type: DType, size: Int]( # Not an overload of shuffle because there is ambiguity # with fn shuffle[*mask: Int](self, other: Self) -> Self: - # TODO: move to the utils directory - see https://github.com/modular/mojo/issues/3477 + # TODO: move to the utils directory - see https://github.com/modular/max/issues/3477 @always_inline fn _dynamic_shuffle[ mask_size: Int, // diff --git a/mojo/stdlib/src/collections/linked_list.mojo b/mojo/stdlib/src/collections/linked_list.mojo index 55c49adc18..6c145d10fa 100644 --- a/mojo/stdlib/src/collections/linked_list.mojo +++ b/mojo/stdlib/src/collections/linked_list.mojo @@ -203,7 +203,7 @@ struct LinkedList[ self._tail = node # Do not destroy the elements when their backing storage goes away. - # FIXME(https://github.com/modular/mojo/issues/3969) this is leaking! + # FIXME(https://github.com/modular/max/issues/3969) this is leaking! __disable_del elements self._size = length diff --git a/mojo/stdlib/test/builtin/test_issue_1004.mojo b/mojo/stdlib/test/builtin/test_issue_1004.mojo index e80c944316..391205de72 100644 --- a/mojo/stdlib/test/builtin/test_issue_1004.mojo +++ b/mojo/stdlib/test/builtin/test_issue_1004.mojo @@ -11,7 +11,7 @@ # limitations under the License. # ===----------------------------------------------------------------------=== # # RUN: %mojo %s -# Test for https://github.com/modular/mojo/issues/1004 +# Test for https://github.com/modular/max/issues/1004 from testing import assert_equal diff --git a/mojo/stdlib/test/builtin/test_issue_1505.mojo b/mojo/stdlib/test/builtin/test_issue_1505.mojo index 712c1d9c0c..43eb2b764d 100644 --- a/mojo/stdlib/test/builtin/test_issue_1505.mojo +++ b/mojo/stdlib/test/builtin/test_issue_1505.mojo @@ -11,7 +11,7 @@ # limitations under the License. # ===----------------------------------------------------------------------=== # # RUN: %mojo %s -# Test for https://github.com/modular/mojo/issues/1505 +# Test for https://github.com/modular/max/issues/1505 from random import random_ui64 diff --git a/mojo/stdlib/test/builtin/test_simd.mojo b/mojo/stdlib/test/builtin/test_simd.mojo index 184627c5b7..e48370e2d1 100644 --- a/mojo/stdlib/test/builtin/test_simd.mojo +++ b/mojo/stdlib/test/builtin/test_simd.mojo @@ -119,7 +119,7 @@ def test_convert_simd_to_string(): var c: SIMD[DType.index, 8] = 7 assert_equal(String(c), "[7, 7, 7, 7, 7, 7, 7, 7]") - # TODO: uncomment when https://github.com/modular/mojo/issues/2353 is fixed + # TODO: uncomment when https://github.com/modular/max/issues/2353 is fixed # assert_equal(String(UInt32(-1)), "4294967295") assert_equal(String(UInt64(-1)), "18446744073709551615") @@ -129,7 +129,7 @@ def test_convert_simd_to_string(): assert_equal(String(UInt64(16646288086500911323)), "16646288086500911323") - # https://github.com/modular/mojo/issues/556 + # https://github.com/modular/max/issues/556 assert_equal( String( SIMD[DType.uint64, 4]( diff --git a/mojo/stdlib/test/collections/test_list.mojo b/mojo/stdlib/test/collections/test_list.mojo index b7c3cecf7a..a7a6e30f0f 100644 --- a/mojo/stdlib/test/collections/test_list.mojo +++ b/mojo/stdlib/test/collections/test_list.mojo @@ -574,7 +574,7 @@ def test_no_extra_copies_with_sugared_set_by_field(): # Ensure correct behavior of __copyinit__ # as reported in GH issue 27875 internally and -# https://github.com/modular/mojo/issues/1493 +# https://github.com/modular/max/issues/1493 def test_list_copy_constructor(): var vec = List[Int](capacity=1) var vec_copy = vec From d35951e21b5b17ac6c8a16b6b8b00598a8a4a291 Mon Sep 17 00:00:00 2001 From: Dan Moldovan <26628547+mdanatg@users.noreply.github.com> Date: Thu, 27 Feb 2025 11:12:34 -0500 Subject: [PATCH 18/44] Remove stale readme files. These are largely superseded by https://github.com/modular/max/tree/main/src/max/README.md MODULAR_ORIG_COMMIT_REV_ID: a63ce6c37bb4971ed67b17033d29b4b172eda196 --- src/max/pipelines/README.md | 119 ---------------- .../pipelines/architectures/mistral/README.md | 129 ----------------- .../pipelines/architectures/pixtral/README.md | 134 ------------------ .../pipelines/architectures/qwen2/README.md | 120 ---------------- .../pipelines/architectures/replit/README.md | 119 ---------------- 5 files changed, 621 deletions(-) delete mode 100644 src/max/pipelines/README.md delete mode 100644 src/max/pipelines/architectures/mistral/README.md delete mode 100644 src/max/pipelines/architectures/pixtral/README.md delete mode 100644 src/max/pipelines/architectures/qwen2/README.md delete mode 100644 src/max/pipelines/architectures/replit/README.md diff --git a/src/max/pipelines/README.md b/src/max/pipelines/README.md deleted file mode 100644 index 160952f64b..0000000000 --- a/src/max/pipelines/README.md +++ /dev/null @@ -1,119 +0,0 @@ -# MAX Pipelines - -These are end-to-end pipelines that demonstrate the power of -[MAX](https://docs.modular.com/max/) for accelerating common AI workloads, and -more. Each of the supported pipelines can be served via an OpenAI-compatible -endpoint. - -MAX can also serve most PyTorch-based large language models that are -present on Hugging Face, although not at the same performance as native MAX -Graph versions. - -## Pipelines - -Highly optimized MAX Graph implementations exist for several core model -architectures. These include: - -- [Llama 3.1](llama3): A text completion pipeline using the Llama 3.1 model, -implemented using the MAX Graph API. This pipeline contains everything -needed to run a self-hosted large language model in the `LlamaForCausalLM` -family with state-of-the-art serving throughput. -- [Mistral](architectures/mistral): Support for the `MistralForCausalLM` family -of text completion models, by default using the Mistral NeMo 12B model. This pipeline -has been tuned for performance using the MAX Graph API. -- [Replit Code](architectures/replit): Code generation via the -Replit Code V1.5 3B model, implemented using the MAX Graph API. - -Instructions for how to run each pipeline can be found in their respective -subdirectories, along with all configuration parameters. A shared driver is -used to execute the pipelines. - -## Usage - -The easiest way to try out any of the pipelines is with our Magic command-line -tool. - -1. Install Magic on macOS and Ubuntu with this command: - - ```shell - curl -ssL https://magic.modular.com | bash - ``` - - Then run the source command that's printed in your terminal. - - To see the available commands, you can run `magic --help`. - [Learn more about Magic here](https://docs.modular.com/magic). - -2. Clone the MAX examples repository: - - If you don't already have a local clone of this repository, create one via: - - ```shell - git clone https://github.com/modular/max.git - ``` - - The following instructions assume that you're present within this - directory, and you can change to it after cloning: - - ```shell - cd max/src/max/ - ``` - -3. Now run one of the text completion demos with any of following commands: - - ```shell - magic run generate --model-path=modularai/llama-3.1 --prompt "Why is the sky blue?" - magic run generate --model-path=modularai/replit-code-1.5 --prompt "def fibonacci(n):" - magic run generate --model-path=mistralai/Mistral-Nemo-Instruct-2407 --prompt "Why is the sky blue?" - ``` - -4. Host a chat completion endpoint via MAX Serve. - - MAX Serve provides functionality to host performant OpenAI compatible - endpoints using the FastAPI framework. - - Finetuned weights hosted on Hugging Face can be used with one - of these optimized pipeline architectures when serving via the `serve` - command: - - ```shell - magic run serve --model-path=modularai/llama-3.1 - ``` - - A request can then be submitted via a cURL command. - - ```shell - curl -N http://localhost:8000/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "modularai/llama-3.1", - "stream": true, - "messages": [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"} - ] - }' - ``` - -## Verified Hugging Face model architectures - -If you provide a repository ID for a Hugging Face large language model -that does not currently have an optimized MAX Graph implementation, MAX -falls back to serving a PyTorch eager version of the model. - -The following table lists the model architectures tested to work with MAX. - -| **Architecture** | **Example Model** | -| --- | --- | -| AquilaForCausalLM | BAAI/Aquila-7B | -| ChatGLMModel | THUDM/chatglm3-6b | -| GPT2LMHeadModel | openai-community/gpt2 | -| GPTJForCausalLM | EleutherAI/gpt-j-6b | -| LlamaForCausalLM | meta-llama/Llama-3.2-3B-Instruct | -| LlamaForCausalLM | Skywork/Skywork-o1-Open-Llama-3.1-8B | -| LlamaForCausalLM | deepseek-ai/deepseek-coder-1.3b-instruct | -| PhiForCausalLM | microsoft/phi-2 | -| Phi3ForCausalLM | microsoft/Phi-3-mini-4k-instruct | -| GraniteForCausalLM | ibm-granite/granite-3.1-8b-instruct | -| Qwen2ForCausalLM | Qwen/Qwen2.5-1.5B-Instruct | -| OlmoForCausalLM | allenai/OLMo-1B-0724-hf | diff --git a/src/max/pipelines/architectures/mistral/README.md b/src/max/pipelines/architectures/mistral/README.md deleted file mode 100644 index 4603761d44..0000000000 --- a/src/max/pipelines/architectures/mistral/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# Mistral NeMo - -**Language:** Python - -**API**: MAX Graph - -This pipeline provides optimized support for the `MistralForCausalLM` family -of large language models, as exemplified by the Mistral NeMo 12B text -completion model. The model itself has been constructed in Python -using the [MAX Graph API](https://docs.modular.com/max/graph/). - -The MAX Graph API provides an accessible interface to the construction of -flexible accelerated compute graphs, which are then optimized by the MAX -Engine's advanced graph compiler. This pipeline showcases how a large language -model can be fully defined using Python and MAX Graphs and then compiled for -optimal inference performance via the MAX Engine. - -## Model - -[Mistral NeMo](https://mistral.ai/news/mistral-nemo/) is an open source large -language model released by [Mistral AI](https://mistral.ai) in partnership -with NVIDIA. The weight checkpoints have been released under an Apache 2.0 -license. - -The default settings for this pipeline use the NeMo 12B set of pretrained -weights in the `bfloat16` encoding. - -## Usage - -The easiest way to try out this pipeline is with our Magic command-line tool. - -1. Install Magic on macOS and Ubuntu with this command: - - ```shell - curl -ssL https://magic.modular.com | bash - ``` - - Then run the source command that's printed in your terminal. - - To see the available commands, you can run `magic --help`. - [Learn more about Magic here](https://docs.modular.com/magic). - -2. Clone the MAX examples repository: - - If you don't already have a local clone of this repository, create one via: - - ```shell - git clone https://github.com/modular/max.git - ``` - - The following instructions assume that you're present within this pipeline's - directory, and you can change to it after cloning: - - ```shell - cd max/src/max/ - ``` - -3. Now run the Mistral text completion demo with the following command: - - ```shell - magic run mistral --prompt "I believe the meaning of life is" - ``` - -4. Host a chat completion endpoint via MAX Serve. - - MAX Serve provides functionality to host performant OpenAI compatible - endpoints using the FastAPI framework. - - You can configure the pipeline to be hosted by using the `--serve` argument. - For example: - - ```shell - magic run mistral --serve - ``` - - A request can be submitted via a cURL command. - - ```shell - curl -N http://localhost:8000/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "mistralai/Mistral-Nemo-Instruct-2407", - "stream": true, - "messages": [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"} - ] - }' - ``` - - Additionally, finetuned weights hosted on Hugging Face for any compatible - `MistralForCausalLM` model can be used with this optimized architecture - via the `serve` command: - - ```shell - magic run serve --model-path=mistralai/Ministral-8B-Instruct-2410 - ``` - -## Options - -The following command-line options are available to customize operation of the -pipeline: - -- `--max-length`: Controls the maximum length of the text sequence - (includes the input tokens). - (Default value: 512) -- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 - value is provided, the model will continue to generate tokens for the entire - context length. (Default value: -1) -- `--prompt`: The text prompt to use for further generation. -- `--quantization-encoding`: The encoding to use for a datatype that can be - quantized to a low bits per weight format. The options for quantized formats - will download and cache default weights, but `float32` requires the use of - `--weight-path` to specify locally downloaded full-precision weights for use - in the model. - Valid values: `bfloat16`, `float32`. - (Default value: `float32`). -- `--save-to-serialized-model-path`: If specified, writes the serialized model - to this path. -- `--serialized-model-path`: If specified, tries to load a serialized model - from this path. -- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. -- `--weight-path`: Overrides the default URL, and allows for an - already-downloaded pretrained weight file to be used with the model. -- `--max-batch-size`: Specifies the maximum batch size to be used. - Default is 1. -- `--devices`: Specifies the device(s) to use for the model. This can optionally - be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". - Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/pixtral/README.md b/src/max/pipelines/architectures/pixtral/README.md deleted file mode 100644 index 4911c4ac85..0000000000 --- a/src/max/pipelines/architectures/pixtral/README.md +++ /dev/null @@ -1,134 +0,0 @@ -# Pixtral - -**Language:** Python - -**API**: MAX Graph - -This pipeline provides optimized support for the -`LlavaForConditionalGeneration` family of multimodal models, as exemplified -by the Pixtral multimodal text generation model. The model itself has -been constructed in Python using the -[MAX Graph API](https://docs.modular.com/max/graph/). - -The MAX Graph API provides an accessible interface to the construction of -flexible accelerated compute graphs, which are then optimized by the MAX -Engine's advanced graph compiler. This pipeline showcases how a multimodal -model can be fully defined using Python and MAX Graphs and then compiled for -optimal inference performance via the MAX Engine. - -> [!NOTE] -> This pipeline is under active development, and while many layers have been -> implemented, the entire pipeline is not fully functional at present. - -## Model - -[Pixtral](https://mistral.ai/news/pixtral-12b/) -is an open source multimodal model released by Mistral AI. It handles both text -and image input, and allows for text generation based on those multimodal -inputs. The underlying architecture provides support for the broader -`LlavaForConditionalGeneration` family of models. - -The default settings for this pipeline use the 12B set of pretrained weights in -the `bfloat16` encoding. - -## Usage - -The easiest way to try out this pipeline is with our Magic command-line tool. - -1. Install Magic on macOS and Ubuntu with this command: - - ```shell - curl -ssL https://magic.modular.com | bash - ``` - - Then run the source command that's printed in your terminal. - - To see the available commands, you can run `magic --help`. - [Learn more about Magic here](https://docs.modular.com/magic). - -2. Clone the MAX examples repository: - - If you don't already have a local clone of this repository, create one via: - - ```shell - git clone https://github.com/modular/max.git - ``` - - The following instructions assume that you're present within this pipeline's - directory, and you can change to it after cloning: - - ```shell - cd max/src/max/pipelines - ``` - -3. Host a multimodal chat completion endpoint via MAX Serve. - - MAX Serve provides functionality to host performant OpenAI compatible - endpoints using the FastAPI framework. - - You can configure the pipeline to be hosted by using the `serve` command. - Weights hosted on Hugging Face for any compatible - `LlavaForConditionalGeneration` model can be used with this optimized - architecture. For example: - - ```shell - magic run serve --model-path mistral-community/pixtral-12b - ``` - - A request can be submitted via a cURL command. - - ```shell - curl -N http://localhost:8000/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "mistral-community/pixtral-12b", - "stream": true, - "messages": [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": [ - {"type": "text", "text": "What is in this image?"}, - {"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}} - ]} - ] - }' - ``` - -## Options - -The following command-line options are available to customize operation of the -pipeline: - -- `--model-path`: Specify the repository ID of a Hugging Face model - repository to use. This is used to load tokenizers, architectures and model - weights. -- `--force-download`: Specify whether to force a download of configuration - files and weights even if they already exist in the local cache. Set this - if you want to ensure you have the correct version of the model. -- `--max-batch-size`: Specifies the maximum batch size to be used. - Default is 1. -- `--max-ce-batch-size`: Set the maximum cache size reserved for a single - context encoding batch. The effective limit will be the lesser of this value - and `max-cache-batch-size`. - Default is 32. -- `--max-length`: Controls the maximum length of the text sequence (includes the - input tokens). Defaults to huggingface model config's max sequence length. -- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 - value is provided, the model will continue to generate tokens for the entire - context length. (Default value: -1) -- `--quantization-encoding`: The encoding to use for a datatype that can be - quantized to a low bits per weight format. - Valid values: `q4_0`, `q4_k`, `q6_k`, `bfloat16`, `float32`. - (Default value: `bfloat16`). -- `--save-to-serialized-model-path`: If specified, writes the serialized model - to this path. -- `--serialized-model-path`: If specified, tries to load a serialized model - from this path. -- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. -- `--trust-remote-code`: Indicate whether to allow custom modeling files from - Hugging Face repositories. Set this to true with caution, as it may - introduce security risks. -- `--weight-path`: Overrides the default URL, and allows for an - already-downloaded pretrained weight file to be used with the model. -- `--devices`: Specifies the device(s) to use for the model. This can optionally - be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". - Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/qwen2/README.md b/src/max/pipelines/architectures/qwen2/README.md deleted file mode 100644 index d42abdc47d..0000000000 --- a/src/max/pipelines/architectures/qwen2/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# Qwen 2.5 - -**Language:** Python - -**API**: MAX Graph - -This pipeline provides optimized support for the `Qwen2ForCausalLM` family -of large language models, as exemplified by the Qwen 2.5 7B Instruct text -completion model. The model itself has been constructed in Python -using the [MAX Graph API](https://docs.modular.com/max/graph/). - -The MAX Graph API provides an accessible interface to the construction of -flexible accelerated compute graphs, which are then optimized by the MAX -Engine's advanced graph compiler. This pipeline showcases how a large language -model can be fully defined using Python and MAX Graphs and then compiled for -optimal inference performance via the MAX Engine. - -## Model - -[Qwen 2.5](https://qwenlm.github.io/blog/qwen2.5/) is an open source large -language model released by [Qwen AI](https://qwenlm.github.io/). The weight -checkpoints have been released under an Apache 2.0 license. - -The default settings for this pipeline use the 7B Instruct set of pretrained -weights in the `bfloat16` encoding. - -## Usage - -The easiest way to try out this pipeline is with our Magic command-line tool. - -1. Install Magic on macOS and Ubuntu with this command: - - ```shell - curl -ssL https://magic.modular.com | bash - ``` - - Then run the source command that's printed in your terminal. - - To see the available commands, you can run `magic --help`. - [Learn more about Magic here](https://docs.modular.com/magic). - -2. Clone the MAX examples repository: - - If you don't already have a local clone of this repository, create one via: - - ```shell - git clone https://github.com/modular/max.git - ``` - - The following instructions assume that you're present within this pipeline's - directory, and you can change to it after cloning: - - ```shell - cd max/src/max/ - ``` - -3. Now run the Qwen text completion demo with the following command: - - ```shell - magic run qwen --prompt "I believe the meaning of life is" - ``` - -4. Host a chat completion endpoint via MAX Serve. - - MAX Serve provides functionality to host performant OpenAI compatible - endpoints using the FastAPI framework. - - You can configure the pipeline to be hosted by using the `--serve` argument. - For example: - - ```shell - magic run qwen --serve - ``` - - A request can be submitted via a cURL command. - - ```shell - curl -N http://localhost:8000/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "Qwen/Qwen2.5-7B-Instruct", - "stream": true, - "messages": [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"} - ] - }' - ``` - - Additionally, finetuned weights hosted on Hugging Face for any compatible - `Qwen2ForCausalLM` model can be used with this optimized architecture - via the `serve` command: - - ```shell - magic run serve --model-path=Qwen/Qwen2.5-7B-Instruct - ``` - -## Options - -The following command-line options are available to customize operation of the -pipeline: - -- `--max-length`: Controls the maximum length of the text sequence - (includes the input tokens). -- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 - value is provided, the model will continue to generate tokens for the entire - context length. (Default value: -1) -- `--prompt`: The text prompt to use for further generation. -- `--save-to-serialized-model-path`: If specified, writes the serialized model - to this path. -- `--serialized-model-path`: If specified, tries to load a serialized model - from this path. -- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. -- `--weight-path`: Overrides the default URL, and allows for an - already-downloaded pretrained weight file to be used with the model. -- `--max-batch-size`: Specifies the maximum batch size to be used. - Default is 1. -- `--devices`: Specifies the device(s) to use for the model. This can optionally - be "cpu", "gpu", or a comma-separated list of GPU ID(s) like "gpu-0,gpu-1". - Defaults to the first available GPU, or "cpu" if no GPUs are available. diff --git a/src/max/pipelines/architectures/replit/README.md b/src/max/pipelines/architectures/replit/README.md deleted file mode 100644 index a77f156e3a..0000000000 --- a/src/max/pipelines/architectures/replit/README.md +++ /dev/null @@ -1,119 +0,0 @@ -# Replit Code V1.5 3B - -**Language:** Python - -**API**: MAX Graph - -This pipeline demonstrates code completion from an initial prompt using -Replit's Code V1.5 3B large language model. The model itself has been -constructed in Python using the -[MAX Graph API](https://docs.modular.com/max/graph/). - -The MAX Graph API provides an accessible interface to the construction of -flexible accelerated compute graphs, which are then optimized by the MAX -Engine's advanced graph compiler. This pipeline showcases how a large language -model can be fully defined using Python and MAX Graphs and then compiled for -optimal inference performance via the MAX Engine. - -## Model - -[Replit Code](https://blog.replit.com/replit-code-v1_5) is an open source code -generation model trained on permissively licensed code and released by -[Replit](https://replit.com). The V1.5, 3B variant is the basis for this -implementation, and weights are -[obtained via Hugging Face](https://huggingface.co/replit/replit-code-v1-3b). - -## Usage - -The easiest way to try out this pipeline is with our Magic command-line tool. - -1. Install Magic on macOS and Ubuntu with this command: - - ```shell - curl -ssL https://magic.modular.com | bash - ``` - - Then run the source command that's printed in your terminal. - - To see the available commands, you can run `magic --help`. - [Learn more about Magic here](https://docs.modular.com/magic). - -2. Clone the MAX examples repository: - - If you don't already have a local clone of this repository, create one via: - - ```shell - git clone https://github.com/modular/max.git - ``` - - The following instructions assume that you're present within this pipeline's - directory, and you can change to it after cloning: - - ```shell - cd max/src/max/ - ``` - -3. Now run the Replit code completion demo with the following command: - - ```shell - magic run replit --prompt "def fibonacci(n):" - ``` - -4. Host a code completion endpoint via MAX Serve. - - MAX Serve provides functionality to host performant OpenAI compatible - endpoints using the FastAPI framework. - - You can configure the pipeline to be hosted by using the `--serve` argument. - For example: - - ```shell - magic run replit --serve - ``` - - A request can be submitted via a cURL command. - - ```shell - curl -N http://localhost:8000/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "replit/replit-code-v1_5-3b", - "stream": true, - "messages": [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "def fibonacci(n)"} - ] - }' - ``` - -## Options - -The following command-line options are available to customize operation of the -pipeline: - -- `--max-length`: Controls the maximum length of the text sequence - (includes the input tokens). - (Default value: 512) -- `--max-new-tokens`: The maximum number of new tokens to generate. If a -1 - value is provided, the model will continue to generate tokens for the entire - context length. (Default value: -1) -- `--prompt`: The text prompt to use for further generation. -- `--quantization-encoding`: The encoding to use for a datatype that can be - quantized to a low bits per weight format. The options for quantized formats - will download and cache default weights, but `float32` requires the use of - `--weight-path` to specify locally downloaded full-precision weights for use - in the model. - Valid values: `bfloat16`, `float32`. - (Default value: `float32`). -- `--save-to-serialized-model-path`: If specified, writes the serialized model - to this path. -- `--serialized-model-path`: If specified, tries to load a serialized model - from this path. -- `--top-k`: Limits the sampling to the K most probable tokens. Default is 1. -- `--weight-path`: Overrides the default URL, and allows for an - already-downloaded pretrained weight file to be used with the model. -- `--max-batch-size`: Specifies the maximum batch size to be used. - Default is 1. -- `--devices`: Specifies the device(s) to use for the model. This can optionally - be "cpu" or a comma-separated list of GPU ID(s). Defaults to the first - available GPU. From 98333f260bbf490d0f2034e923b42b2cf83c85df Mon Sep 17 00:00:00 2001 From: Scott Main Date: Thu, 27 Feb 2025 08:58:53 -0800 Subject: [PATCH 19/44] Update all GitHub links for `mojo`->`max` repo change MODULAR_ORIG_COMMIT_REV_ID: e3c60edfa481cae4a17f91c23cf9d1080d4bd030 --- mojo/docs/README.md | 2 +- mojo/docs/changelog-released.md | 662 +++++++++++++------------- mojo/docs/changelog.md | 2 +- mojo/docs/faq.md | 4 +- mojo/docs/manual/basics.mdx | 10 +- mojo/docs/manual/get-started.mdx | 4 +- mojo/docs/manual/operators.mdx | 6 +- mojo/docs/manual/parameters/index.mdx | 2 +- mojo/docs/manual/values/lifetimes.mdx | 4 +- mojo/docs/roadmap.md | 4 +- mojo/docs/tools/debugging.mdx | 6 +- mojo/docs/tools/testing.mdx | 13 +- 12 files changed, 361 insertions(+), 358 deletions(-) diff --git a/mojo/docs/README.md b/mojo/docs/README.md index 5200bc5cfe..d5abf29c53 100644 --- a/mojo/docs/README.md +++ b/mojo/docs/README.md @@ -16,7 +16,7 @@ Be aware that we don't provide tools to generate a preview of the website, because the Mojo docs are built along with other content that's not included in this repo. As such, we recommend you preview your edits in an IDE that can render Markdown and MDX files, such as VS Code, including the -[VS Code environment in GitHub](https://github.dev/modular/mojo/blob/main/). +[VS Code environment in GitHub](https://github.dev/modular/max/blob/main/). For more information about how to contribute, see the [Contributor Guide](../CONTRIBUTING.md) diff --git a/mojo/docs/changelog-released.md b/mojo/docs/changelog-released.md index 13cca39ddf..82fa4aa7a8 100644 --- a/mojo/docs/changelog-released.md +++ b/mojo/docs/changelog-released.md @@ -572,25 +572,25 @@ in [Update a package](/magic#update-a-package) to update the `max` package. - The command `mojo debug --vscode` now sets the current working directory properly. -- [Issue #3796](https://github.com/modular/mojo/issues/3796) - Compiler crash +- [Issue #3796](https://github.com/modular/max/issues/3796) - Compiler crash handling `for`-`else` statement. -- [Issue #3540](https://github.com/modular/mojo/issues/3540) - Using named +- [Issue #3540](https://github.com/modular/max/issues/3540) - Using named output slot breaks trait conformance -- [Issue #3617](https://github.com/modular/mojo/issues/3617) - Can't generate +- [Issue #3617](https://github.com/modular/max/issues/3617) - Can't generate the constructors for a type wrapping `!lit.ref` - The Mojo Language Server doesn't crash anymore on empty `__init__.mojo` files. - [Issue #3826](https://github.com/modular/mojo/issues/3826). + [Issue #3826](https://github.com/modular/max/issues/3826). -- [Issue #3935](https://github.com/modular/mojo/issues/3935) - Confusing OOM +- [Issue #3935](https://github.com/modular/max/issues/3935) - Confusing OOM error when using `Tuple.get()` incorrectly. -- [Issue #3955](https://github.com/modular/mojo/issues/3955) - Unexpected +- [Issue #3955](https://github.com/modular/max/issues/3955) - Unexpected copy behavior with `def` arguments in loops -- [Issue #3960](https://github.com/modular/mojo/issues/3960) - Infinite `for` +- [Issue #3960](https://github.com/modular/max/issues/3960) - Infinite `for` loop ## v24.6 (2024-12-17) @@ -617,7 +617,7 @@ detailed information in the following sections: (`ref [a, b]`). For details, see [Language changes](#24-6-language-changes). For background information and rationale on the name change see - [the proposal](https://github.com/modular/mojo/issues/3623). For more + [the proposal](https://github.com/modular/max/issues/3623). For more information on origins, see [Lifetimes, origins and references](/mojo/manual/values/lifetimes) in the Mojo Manual. @@ -699,7 +699,7 @@ detailed information in the following sections: eventually be deprecated and removed. This was [discussed extensively in a public - proposal](https://github.com/modular/mojo/issues/3623). For more + proposal](https://github.com/modular/max/issues/3623). For more information, see [Named results](/nightly/mojo/manual/functions#named-results) in the Mojo Manual. @@ -922,7 +922,7 @@ detailed information in the following sections: - Mojo can now interpret simple LLVM intrinsics in parameter expressions, enabling things like `count_leading_zeros` to work at compile time: - [Issue #933](https://github.com/modular/mojo/issues/933). + [Issue #933](https://github.com/modular/max/issues/933). - Introduced the `@explicit_destroy` annotation, the `__disable_del` keyword, the `UnknownDestructibility` trait, and the `ImplicitlyDestructible` keyword, @@ -1041,8 +1041,8 @@ detailed information in the following sections: 'strong reference' pointer. - Support for multi-dimensional indexing and slicing for `PythonObject` - (PR [#3549](https://github.com/modular/mojo/pull/3549), - PR [#3583](https://github.com/modular/mojo/pull/3583)). + (PR [#3549](https://github.com/modular/max/pull/3549), + PR [#3583](https://github.com/modular/max/pull/3583)). ```mojo var np = Python.import_module("numpy") @@ -1055,7 +1055,7 @@ detailed information in the following sections: - Added [`PythonObject.__contains__()`](/mojo/stdlib/python/python_object/PythonObject#__contains__). - ([PR #3101](https://github.com/modular/mojo/pull/3101)) + ([PR #3101](https://github.com/modular/max/pull/3101)) Example usage: @@ -1087,7 +1087,7 @@ detailed information in the following sections: semantics to Rust's [`Box<>`](https://doc.rust-lang.org/std/boxed/struct.Box.html) and C++'s [`std::unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr). - ([PR #3524](https://github.com/modular/mojo/pull/3524)) + ([PR #3524](https://github.com/modular/max/pull/3524)) - `Arc` has been renamed to [`ArcPointer`](/mojo/stdlib/memory/arc/ArcPointer), for consistency with `OwnedPointer`. @@ -1117,7 +1117,7 @@ detailed information in the following sections: [`FloatableRaising`](/mojo/stdlib/builtin/floatable/FloatableRaising) traits to denote types that can be converted to a `Float64` value using the builtin `float` function. Made `SIMD` and `FloatLiteral` conform to the `Floatable` - trait. ([PR #3163](https://github.com/modular/mojo/pull/3163)) + trait. ([PR #3163](https://github.com/modular/max/pull/3163)) ```mojo fn foo[F: Floatable](v: F): @@ -1135,7 +1135,7 @@ detailed information in the following sections: - Introduced the [`random.shuffle()`](/mojo/stdlib/random/random/shuffle) function for randomizing the elements of a `List`. - ([PR #3327](https://github.com/modular/mojo/pull/3327)) + ([PR #3327](https://github.com/modular/max/pull/3327)) Example: @@ -1153,20 +1153,20 @@ detailed information in the following sections: - [`Slice.step`](/mojo/stdlib/builtin/builtin_slice/Slice#fields) is now an `Optional[Int]`, matching the optionality of `slice.step` in Python. - ([PR #3160](https://github.com/modular/mojo/pull/3160)) + ([PR #3160](https://github.com/modular/max/pull/3160)) - There is now a [`Byte`](/mojo/stdlib/builtin/simd/#aliases) alias to better express intent when working with a pack of bits. - ([PR #3670](https://github.com/modular/mojo/pull/3670)). + ([PR #3670](https://github.com/modular/max/pull/3670)). - Expanded [`os.path`](/mojo/stdlib/os/path/path/) with new functions: - - `os.path.expandvars()`: Expands environment variables in a path ([PR #3735](https://github.com/modular/mojo/pull/3735)). + - `os.path.expandvars()`: Expands environment variables in a path ([PR #3735](https://github.com/modular/max/pull/3735)). - `os.path.splitroot()`: Split a path into drive, root and tail. - ([PR #3780](https://github.com/modular/mojo/pull/3780)). + ([PR #3780](https://github.com/modular/max/pull/3780)). - Added a [`reserve()`](/mojo/stdlib/collections/string/String#reserve) method and new constructor to the `String` struct to allocate additional capacity. - ([PR #3755](https://github.com/modular/mojo/pull/3755)). + ([PR #3755](https://github.com/modular/max/pull/3755)). - A new [`StringLiteral.get[some_stringable]()`](/mojo/stdlib/builtin/string_literal/StringLiteral#get) @@ -1192,7 +1192,7 @@ detailed information in the following sections: - [`StringRef`](/mojo/stdlib/utils/stringref/StringRef) now implements `split()` which can be used to split a `StringRef` into a `List[StringRef]` by a - delimiter. ([PR #2705](https://github.com/modular/mojo/pull/2705)) + delimiter. ([PR #2705](https://github.com/modular/max/pull/2705)) - [`StringRef`](/mojo/stdlib/utils/stringref/StringRef) is now representable so `repr(StringRef("hello"))` will return `StringRef('hello')`. @@ -1251,7 +1251,7 @@ detailed information in the following sections: - The VS Code extension now has the `mojo.run.focusOnTerminalAfterLaunch` setting, which controls whether to focus on the terminal used by the `Mojo: Run Mojo File` command or on the editor after launch. - [Issue #3532](https://github.com/modular/mojo/issues/3532). + [Issue #3532](https://github.com/modular/max/issues/3532). - The VS Code extension now has the `mojo.SDK.additionalSDKs` setting, which allows the user to provide a list of MAX SDKs that the extension can use when @@ -1316,40 +1316,40 @@ detailed information in the following sections: - Lifetime tracking is now fully field sensitive, which makes the uninitialized variable checker more precise. -- [Issue #1310](https://github.com/modular/mojo/issues/1310) - Mojo permits +- [Issue #1310](https://github.com/modular/max/issues/1310) - Mojo permits the use of any constructor for implicit conversions -- [Issue #1632](https://github.com/modular/mojo/issues/1632) - Mojo produces +- [Issue #1632](https://github.com/modular/max/issues/1632) - Mojo produces weird error when inout function is used in non mutating function -- [Issue #3444](https://github.com/modular/mojo/issues/3444) - Raising init +- [Issue #3444](https://github.com/modular/max/issues/3444) - Raising init causing use of uninitialized variable -- [Issue #3544](https://github.com/modular/mojo/issues/3544) - Known +- [Issue #3544](https://github.com/modular/max/issues/3544) - Known mutable `ref` argument are not optimized as `noalias` by LLVM. -- [Issue #3559](https://github.com/modular/mojo/issues/3559) - VariadicPack +- [Issue #3559](https://github.com/modular/max/issues/3559) - VariadicPack doesn't extend the lifetimes of the values it references. -- [Issue #3627](https://github.com/modular/mojo/issues/3627) - Compiler +- [Issue #3627](https://github.com/modular/max/issues/3627) - Compiler overlooked exclusivity violation caused by `ref [MutableAnyOrigin] T` -- [Issue #3710](https://github.com/modular/mojo/issues/3710) - Mojo frees +- [Issue #3710](https://github.com/modular/max/issues/3710) - Mojo frees memory while reference to it is still in use. -- [Issue #3805](https://github.com/modular/mojo/issues/3805) - Crash When +- [Issue #3805](https://github.com/modular/max/issues/3805) - Crash When Initializing !llvm.ptr. -- [Issue #3816](https://github.com/modular/mojo/issues/3816) - Ternary +- [Issue #3816](https://github.com/modular/max/issues/3816) - Ternary if-operator doesn't propagate origin information. -- [Issue #3815](https://github.com/modular/mojo/issues/3815) - +- [Issue #3815](https://github.com/modular/max/issues/3815) - [BUG] Mutability not preserved when taking the union of two origins. -- [Issue #3829](https://github.com/modular/mojo/issues/3829) - Poor error +- [Issue #3829](https://github.com/modular/max/issues/3829) - Poor error message when invoking a function pointer upon an argument of the wrong origin -- [Issue #3830](https://github.com/modular/mojo/issues/3830) - Failures +- [Issue #3830](https://github.com/modular/max/issues/3830) - Failures emitting register RValues to ref arguments. - The VS Code extension now auto-updates its private copy of the MAX SDK. @@ -1555,7 +1555,7 @@ detailed information in the following sections: The Mojo compiler now always passes the "new value" being set using the last keyword argument of the `__setitem__()`, e.g. turning `yourType[1, 2] = 3` into `yourType.__setitem__(1, 2, val=3)`. This fixes - [Issue #248](https://github.com/modular/mojo/issues/248). + [Issue #248](https://github.com/modular/max/issues/248). - Mojo context managers used in regions of code that may raise no longer need to define a "conditional" exit function in the form of @@ -1682,7 +1682,7 @@ detailed information in the following sections: - Added the builtin [`input()`](/mojo/stdlib/builtin/io/input) function, which behaves the same as Python. - ([PR #3392](https://github.com/modular/mojo/pull/3392)) + ([PR #3392](https://github.com/modular/max/pull/3392)) ```mojo name = input("Enter your name: ") @@ -1693,7 +1693,7 @@ detailed information in the following sections: There is a known issue when running the `input()` function with JIT compilation (see issue - [#3479](https://github.com/modular/mojo/issues/3479)). + [#3479](https://github.com/modular/max/issues/3479)). - [`print()`](/mojo/stdlib/builtin/io/print) now requires that its arguments conform to the [`Formattable`](/mojo/stdlib/utils/format/Formattable) trait. @@ -1766,12 +1766,12 @@ detailed information in the following sections: - Added [`TemporaryDirectory`](/mojo/stdlib/tempfile/tempfile/TemporaryDirectory) in module `tempfile`. - ([PR 2743](https://github.com/modular/mojo/pull/2743)) + ([PR 2743](https://github.com/modular/max/pull/2743)) - Added [`NamedTemporaryFile`](/mojo/stdlib/tempfile/tempfile/NamedTemporaryFile) in module `tempfile`. - ([PR 2762](https://github.com/modular/mojo/pull/2762)) + ([PR 2762](https://github.com/modular/max/pull/2762)) - [`String`](/mojo/stdlib/collections/string/String) and friends: @@ -1780,7 +1780,7 @@ detailed information in the following sections: - Added the [`String.format()`](/mojo/stdlib/collections/string/String#format) method. - ([PR #2771](https://github.com/modular/mojo/pull/2771)) + ([PR #2771](https://github.com/modular/max/pull/2771)) Supports automatic and manual indexing of `*args`. @@ -1801,7 +1801,7 @@ detailed information in the following sections: - [`String.format()`](/mojo/stdlib/collections/string/String#format) now supports conversion flags `!s` and `!r`, allowing for `str()` and `repr()` conversions within format strings. - ([PR #3279](https://github.com/modular/mojo/pull/3279)) + ([PR #3279](https://github.com/modular/max/pull/3279)) Example: @@ -1818,14 +1818,14 @@ detailed information in the following sections: [`ljust()`](/mojo/stdlib/collections/string/String#ljust), and [`center()`](/mojo/stdlib/collections/string/String#center) methods to return a justified string based on width and fillchar. ([PR - #3278](https://github.com/modular/mojo/pull/3278)) + #3278](https://github.com/modular/max/pull/3278)) - The [`atol()`](/mojo/stdlib/collections/string/atol) function now correctly supports leading underscores, (e.g.`atol("0x_ff", 0)`), when the appropriate base is specified or inferred (base 0). non-base-10 integer literals as per Python's [Integer Literals](). - ([PR #3180](https://github.com/modular/mojo/pull/3180)) + ([PR #3180](https://github.com/modular/max/pull/3180)) - Added the [`unsafe_cstr_ptr()`](/mojo/stdlib/collections/string/String#unsafe_cstr_ptr) @@ -1843,7 +1843,7 @@ detailed information in the following sections: and [`StringSlice.__len__()`](/mojo/stdlib/utils/string_slice/StringSlice#__len__) now does return the Unicode codepoints length. - ([PR #2960](https://github.com/modular/mojo/pull/2960)) + ([PR #2960](https://github.com/modular/max/pull/2960)) - Added a new [`StaticString`](/mojo/stdlib/utils/string_slice/#aliases) type alias. This can be used in place of @@ -1987,7 +1987,7 @@ detailed information in the following sections: assert_equal(str(stacked), "[1 2 3 4 5 6]") ``` - ([PR #3264](https://github.com/modular/mojo/pull/3264)) + ([PR #3264](https://github.com/modular/max/pull/3264)) - Accessing local Python modules with [`Python.add_to_path(".")`](/mojo/stdlib/python/python/Python#add_to_path) @@ -2002,7 +2002,7 @@ detailed information in the following sections: - [`List`](/mojo/stdlib/collections/list/List) values are now equality comparable with `==` and `!=` when their element type is equality - comparable. ([PR #3195](https://github.com/modular/mojo/pull/3195)) + comparable. ([PR #3195](https://github.com/modular/max/pull/3195)) - [`Optional`](/mojo/stdlib/collections/optional/Optional) values are now equality comparable with `==` and `!=` when their element type is equality @@ -2010,22 +2010,22 @@ detailed information in the following sections: - Added a new [`Counter`](/mojo/stdlib/collections/counter/Counter) dictionary-like type, matching most of the features of the Python one. - ([PR #2910](https://github.com/modular/mojo/pull/2910)) + ([PR #2910](https://github.com/modular/max/pull/2910)) - [`Dict`](/mojo/stdlib/collections/dict/Dict) now implements [`setdefault()`](/mojo/stdlib/collections/dict/Dict#setdefault), which gets a value from the dictionary by key, or sets it to a default if it doesn't exist. - ([PR #2803](https://github.com/modular/mojo/pull/2803)) + ([PR #2803](https://github.com/modular/max/pull/2803)) - `Dict` now supports [`popitem()`](/mojo/stdlib/collections/dict/Dict#popitem), which removes and returns the last item in the `Dict`. - ([PR #2701](https://github.com/modular/mojo/pull/2701)) + ([PR #2701](https://github.com/modular/max/pull/2701)) - Added a [`Dict.__init__()`](/mojo/stdlib/collections/dict/Dict#__init__) overload to specify initial capacity. - ([PR #3171](https://github.com/modular/mojo/pull/3171)) + ([PR #3171](https://github.com/modular/max/pull/3171)) The capacity has to be a power of two and greater than or equal to 8. @@ -2040,7 +2040,7 @@ detailed information in the following sections: - `ListLiteral` now supports [`__contains__()`](/mojo/stdlib/builtin/builtin_list/ListLiteral#__contains__). - ([PR #3251](https://github.com/modular/mojo/pull/3251)) + ([PR #3251](https://github.com/modular/max/pull/3251)) - Filesystem and environment utilities: @@ -2122,7 +2122,7 @@ detailed information in the following sections: - Added the [`Identifiable`](/mojo/stdlib/builtin/identifiable/Identifiable) trait, used to describe types that implement the `__is__()` and `__isnot__()` trait methods. - ([PR #2807](https://github.com/modular/mojo/pull/2807)) + ([PR #2807](https://github.com/modular/max/pull/2807)) - Types conforming to [`Boolable`](/mojo/stdlib/builtin/bool/Boolable) (that is, those implementing `__bool__()`) no longer implicitly convert to `Bool`. @@ -2164,7 +2164,7 @@ detailed information in the following sections: - Added the [`oct()`](/mojo/stdlib/builtin/format_int/oct) builtin function for formatting an integer in octal. - ([PR #2914](https://github.com/modular/mojo/pull/2914)) + ([PR #2914](https://github.com/modular/max/pull/2914)) - Added the [`assert_is()`](/mojo/stdlib/testing/testing/assert_is) and [`assert_is_not()`](/mojo/stdlib/testing/testing/assert_is_not) test @@ -2172,7 +2172,7 @@ detailed information in the following sections: - The [`math`](/mojo/stdlib/math/constants/) package now includes the `pi`, `e`, and `tau` constants (Closes Issue - [#2135](https://github.com/modular/mojo/issues/2135)). + [#2135](https://github.com/modular/max/issues/2135)). - The [`ulp`](/mojo/stdlib/math/math/ulp) function from `numerics` has been moved to the `math` module. @@ -2181,7 +2181,7 @@ detailed information in the following sections: [`bit_reverse()`](/mojo/stdlib/bit/bit/bit_reverse), [`byte_swap()`](/mojo/stdlib/bit/bit/byte_swap), and [`pop_count()`](/mojo/stdlib/bit/bit/pop_count) for the `Int` type. - ([PR #3150](https://github.com/modular/mojo/pull/3150)) + ([PR #3150](https://github.com/modular/max/pull/3150)) - A few `bit` functions have been renamed for clarity: @@ -2193,7 +2193,7 @@ detailed information in the following sections: `OptionalReg[Int]` for `start` and `end` and implements a constructor which accepts optional values. `Slice._has_end()` has also been removed since a Slice with no end is now represented by an empty `Slice.end` option. - ([PR #2495](https://github.com/modular/mojo/pull/2495)) + ([PR #2495](https://github.com/modular/max/pull/2495)) ```mojo var s = Slice(1, None, 2) @@ -2305,28 +2305,28 @@ detailed information in the following sections: - Mojo now prints `ref` arguments and results in generated documentation correctly. -- [#1734](https://github.com/modular/mojo/issues/1734) - Calling +- [#1734](https://github.com/modular/max/issues/1734) - Calling `__copyinit__` on self causes crash. -- [#3142](https://github.com/modular/mojo/issues/3142) - [QoI] Confusing +- [#3142](https://github.com/modular/max/issues/3142) - [QoI] Confusing `__setitem__` method is failing with a "must be mutable" error. -- [#248](https://github.com/modular/mojo/issues/248) - [Feature] Enable +- [#248](https://github.com/modular/max/issues/248) - [Feature] Enable `__setitem__` to take variadic arguments -- [#3065](https://github.com/modular/mojo/issues/3065) - Fix incorrect behavior +- [#3065](https://github.com/modular/max/issues/3065) - Fix incorrect behavior of `SIMD.__int__` on unsigned types -- [#3045](https://github.com/modular/mojo/issues/3045) - Disable implicit SIMD +- [#3045](https://github.com/modular/max/issues/3045) - Disable implicit SIMD conversion routes through `Bool` -- [#3126](https://github.com/modular/mojo/issues/3126) - [BUG] List doesn't +- [#3126](https://github.com/modular/max/issues/3126) - [BUG] List doesn't work at compile time. -- [#3237](https://github.com/modular/mojo/issues/3237) - [BUG] Difference +- [#3237](https://github.com/modular/max/issues/3237) - [BUG] Difference between `__getitem__` and `[.]` operator. -- [#3336](https://github.com/modular/mojo/issues/3336) - Fix outdated +- [#3336](https://github.com/modular/max/issues/3336) - Fix outdated references to `let` in REPL documentation. - The VS Code extension no longer caches the information of the selected @@ -2545,7 +2545,7 @@ Big themes for this release: - Added built-in [`repr()`](/mojo/stdlib/builtin/repr/repr) function and [`Representable`](/mojo/stdlib/builtin/repr/Representable) trait. - ([PR #2361](https://github.com/modular/mojo/pull/2361)) + ([PR #2361](https://github.com/modular/max/pull/2361)) - Added the [`Indexer`](/mojo/stdlib/builtin/int/Indexer) trait to denote types that implement the `__index__()` method which allows these types to be @@ -2592,7 +2592,7 @@ Big themes for this release: print(a[AlwaysZero()]) # works and prints 1 ``` - ([PR #2685](https://github.com/modular/mojo/pull/2685)) + ([PR #2685](https://github.com/modular/max/pull/2685)) - Added traits allowing user-defined types to be supported by various built-in and math functions. @@ -2670,14 +2670,14 @@ Big themes for this release: [`rstrip()`](/mojo/stdlib/collections/string/String#rstrip) can now remove custom characters other than whitespace. In addition, there are now several useful aliases for whitespace, ASCII lower/uppercase, and so on. - ([PR #2555](https://github.com/modular/mojo/pull/2555)) + ([PR #2555](https://github.com/modular/max/pull/2555)) - `String` now has a [`splitlines()`](/mojo/stdlib/collections/string/String#splitlines) method, which allows splitting strings at line boundaries. This method supports [universal newlines](https://docs.python.org/3/glossary.html#term-universal-newlines) and provides an option to retain or remove the line break characters. - ([PR #2810](https://github.com/modular/mojo/pull/2810)) + ([PR #2810](https://github.com/modular/max/pull/2810)) - `InlinedString` has been renamed to [`InlineString`](/mojo/stdlib/utils/inline_string/InlineString) to be @@ -2686,12 +2686,12 @@ Big themes for this release: - [`StringRef`](/mojo/stdlib/utils/stringref/StringRef) now implements [`strip()`](/mojo/stdlib/utils/stringref/StringRef#strip), which can be used to remove leading and trailing whitespace. - ([PR #2683](https://github.com/modular/mojo/pull/2683)) + ([PR #2683](https://github.com/modular/max/pull/2683)) - `StringRef` now implements [`startswith()`](/mojo/stdlib/utils/stringref/StringRef#startswith) and [`endswith()`](/mojo/stdlib/utils/stringref/StringRef#endswith). - ([PR #2710](https://github.com/modular/mojo/pull/2710)) + ([PR #2710](https://github.com/modular/max/pull/2710)) - Added a new [`StringSlice`](/mojo/stdlib/utils/string_slice/StringSlice) type, to replace uses of the unsafe `StringRef` type in standard library @@ -2743,7 +2743,7 @@ Big themes for this release: - Added a built-in [`sort()`](/mojo/stdlib/builtin/sort/sort) function for lists of elements that conform to the [`ComparableCollectionElement`](/mojo/stdlib/builtin/value/ComparableCollectionElement) - trait.([PR #2609](https://github.com/modular/mojo/pull/2609)) + trait.([PR #2609](https://github.com/modular/max/pull/2609)) - [`int()`](/mojo/stdlib/builtin/int/int-function) can now take a string and a specified base to parse an integer from a @@ -2751,17 +2751,17 @@ Big themes for this release: specified, the string will be parsed as if it was an integer literal, with the base determined by whether the string contains the prefix `"0x"`, `"0o"`, or `"0b"`. - ([PR #2273](https://github.com/modular/mojo/pull/2273), - fixes [#2274](https://github.com/modular/mojo/issues/2274)) + ([PR #2273](https://github.com/modular/max/pull/2273), + fixes [#2274](https://github.com/modular/max/issues/2274)) - Added the [`bin()`](/mojo/stdlib/builtin/format_int/bin) built-in function to convert integral types into their binary string representation. - ([PR #2603](https://github.com/modular/mojo/pull/2603)) + ([PR #2603](https://github.com/modular/max/pull/2603)) - Added the [`atof()`](/mojo/stdlib/collections/string/atof) built-in function, which can convert a `String` to a `float64`. - ([PR #2649](https://github.com/modular/mojo/pull/2649)) + ([PR #2649](https://github.com/modular/max/pull/2649)) - You can now use the built-in [`any()`](/mojo/stdlib/builtin/bool/any) and [`all()`](/mojo/stdlib/builtin/bool/all) functions to check for truthy @@ -2769,7 +2769,7 @@ Big themes for this release: `size=1`, You must explicitly use these to get the truthy value of a SIMD vector with more than one element. This avoids common bugs around implicit conversion of `SIMD` to `Bool`. - ([PR #2600](https://github.com/modular/mojo/pull/2600)) + ([PR #2600](https://github.com/modular/max/pull/2600)) For example: @@ -2784,10 +2784,10 @@ Big themes for this release: - [`object`](/mojo/stdlib/builtin/object/) now implements all the bitwise operators. - ([PR #2324](https://github.com/modular/mojo/pull/2324)) + ([PR #2324](https://github.com/modular/max/pull/2324)) - [`Tuple`](/mojo/stdlib/builtin/tuple/Tuple) now supports `__contains__()`. - ([PR #2709](https://github.com/modular/mojo/pull/2709)) For example: + ([PR #2709](https://github.com/modular/max/pull/2709)) For example: ```mojo var x = Tuple(1, 2, True) @@ -2837,12 +2837,12 @@ Big themes for this release: Note that `List` doesn't conform to the `Stringable` trait yet so you cannot use `str(my_list)` yet. - ([PR #2673](https://github.com/modular/mojo/pull/2673)) + ([PR #2673](https://github.com/modular/max/pull/2673)) - `List` has a simplified syntax to call the [`count()`](/mojo/stdlib/collections/list/List#count) method: `my_list.count(x)`. - ([PR #2675](https://github.com/modular/mojo/pull/2675)) + ([PR #2675](https://github.com/modular/max/pull/2675)) - `List()` now supports `__contains__()`, so you can now use lists with the `in` operator: @@ -2851,84 +2851,84 @@ Big themes for this release: if x in my_list: ``` - ([PR #2667](https://github.com/modular/mojo/pull/2667)) + ([PR #2667](https://github.com/modular/max/pull/2667)) - `List` now has an [`unsafe_get()`](/mojo/stdlib/collections/list/List#unsafe_get) to get the reference to an element without bounds check or wraparound for negative indices. Note that this method is unsafe. Use with caution. - [PR #2800](https://github.com/modular/mojo/pull/2800)) + [PR #2800](https://github.com/modular/max/pull/2800)) - Added a [`fromkeys()`](/mojo/stdlib/collections/dict/Dict#fromkeys) method to `Dict` to return a `Dict` with the specified keys and values. - ([PR 2622](https://github.com/modular/mojo/pull/2622)) + ([PR 2622](https://github.com/modular/max/pull/2622)) - Added a [`clear()`](/mojo/stdlib/collections/dict/Dict#clear) method to - `Dict`. ([PR 2627](https://github.com/modular/mojo/pull/2627)) + `Dict`. ([PR 2627](https://github.com/modular/max/pull/2627)) - `Dict` now supports [`reversed()`](/mojo/stdlib/builtin/reversed/reversed) for its `items()` and `values()` iterators. - ([PR #2340](https://github.com/modular/mojo/pull/2340)) + ([PR #2340](https://github.com/modular/max/pull/2340)) - `Dict` now has a simplified conversion to `String` with `my_dict.__str__()`. Note that `Dict` does not conform to the `Stringable` trait so `str(my_dict)` is not possible yet. - ([PR #2674](https://github.com/modular/mojo/pull/2674)) + ([PR #2674](https://github.com/modular/max/pull/2674)) - `Dict` now implements [`get(key)`](/mojo/stdlib/collections/dict/Dict#get) and `get(key, default)` functions. - ([PR #2519](https://github.com/modular/mojo/pull/2519)) + ([PR #2519](https://github.com/modular/max/pull/2519)) - Added a temporary `__get_ref(key)` method to `Dict`, allowing you to get a `Reference` to a dictionary value. - Added a new [`InlineList`](/mojo/stdlib/collections/inline_list/InlineList) type, a stack-allocated list with a static maximum size. - ([PR 2587#](https://github.com/modular/mojo/pull/2587)) - ([PR #2703](https://github.com/modular/mojo/pull/2703)) + ([PR 2587#](https://github.com/modular/max/pull/2587)) + ([PR #2703](https://github.com/modular/max/pull/2703)) - Added a new [`Span`](/mojo/stdlib/memory/span/Span) type for taking slices of contiguous collections. - ([PR #2595](https://github.com/modular/mojo/pull/2595)) + ([PR #2595](https://github.com/modular/max/pull/2595)) - [`os`](/mojo/stdlib/os/os/) module: - The `os` module now provides functionality for adding and removing directories using [`mkdir()`](/mojo/stdlib/os/os/mkdir) and [`rmdir()`](/mojo/stdlib/os/os/rmdir). - ([PR #2430](https://github.com/modular/mojo/pull/2430)) + ([PR #2430](https://github.com/modular/max/pull/2430)) - Added the [`os.path.getsize()`](/mojo/stdlib/os/path/path/getsize) function, which gives the size in bytes of the file identified by the path. - ([PR 2626](https://github.com/modular/mojo/pull/2626)) + ([PR 2626](https://github.com/modular/max/pull/2626)) - Added [`os.path.join()`](/mojo/stdlib/os/path/path/join) function. - ([PR 2792](https://github.com/modular/mojo/pull/2792)) + ([PR 2792](https://github.com/modular/max/pull/2792)) - Added a new [`tempfile`](/mojo/stdlib/tempfile/tempfile/) module, with `gettempdir()` and `mkdtemp()` functions. - ([PR 2742](https://github.com/modular/mojo/pull/2742)) + ([PR 2742](https://github.com/modular/max/pull/2742)) - [`SIMD`](/mojo/stdlib/builtin/simd/SIMD) type: - Added [`SIMD.shuffle()`](/mojo/stdlib/builtin/simd/SIMD#shuffle) with `IndexList` mask. - ([PR #2315](https://github.com/modular/mojo/pull/2315)) + ([PR #2315](https://github.com/modular/max/pull/2315)) - [`SIMD.__bool__()`](/mojo/stdlib/builtin/simd/SIMD#__bool__) is constrained such that it only works when `size` is `1`. For SIMD vectors with more than one element, use [`any()`](/mojo/stdlib/builtin/bool/any) or [`all()`](/mojo/stdlib/builtin/bool/all). - ([PR #2502](https://github.com/modular/mojo/pull/2502)) + ([PR #2502](https://github.com/modular/max/pull/2502)) - The [`SIMD.reduce_or()`](/mojo/stdlib/builtin/simd/SIMD#reduce_or) and [`SIMD.reduce_and()`](/mojo/stdlib/builtin/simd/SIMD#reduce_and) methods are now bitwise operations, and support integer types. - ([PR #2671](https://github.com/modular/mojo/pull/2671)) + ([PR #2671](https://github.com/modular/max/pull/2671)) - Added [`SIMD.__repr__()`](/mojo/stdlib/builtin/simd/SIMD#__repr__) to get the verbose string representation of `SIMD` types. - ([PR #2728](https://github.com/modular/mojo/pull/2728)) + ([PR #2728](https://github.com/modular/max/pull/2728)) - [`math`](/mojo/stdlib/math/math/) package: @@ -2964,7 +2964,7 @@ Big themes for this release: - [`math.gcd()`](/mojo/stdlib/math/math/gcd) now works on negative inputs, and like Python's implementation, accepts a variadic list of integers. New overloads for a `List` or `Span`of integers are also added. - ([PR #2777](https://github.com/modular/mojo/pull/2777)) + ([PR #2777](https://github.com/modular/max/pull/2777)) - Async and coroutines: @@ -2988,12 +2988,12 @@ Big themes for this release: that works on memory-only types. Compare with the existing [`StaticTuple`](/mojo/stdlib/utils/static_tuple/StaticTuple) type, which is conceptually an array type, but only works on `AnyTrivialRegType`. - ([PR #2294](https://github.com/modular/mojo/pull/2294)) + ([PR #2294](https://github.com/modular/max/pull/2294)) - The [`base64`](/mojo/stdlib/base64/) package now includes encoding and decoding support for both the Base64 and Base16 encoding schemes. - ([PR #2364](https://github.com/modular/mojo/pull/2364)) - ([PR #2584](https://github.com/modular/mojo/pull/2584)) + ([PR #2364](https://github.com/modular/max/pull/2364)) + ([PR #2584](https://github.com/modular/max/pull/2584)) - The `take()` function in [`Variant`](/mojo/stdlib/utils/variant/Variant) and [`Optional`](/mojo/stdlib/collections/optional/Optional) has been renamed to @@ -3010,7 +3010,7 @@ Big themes for this release: - `infinity` and `NaN` are now correctly handled in [`testing.assert_almost_equal()`](/mojo/stdlib/testing/testing/assert_almost_equal) and an `inf` function has been added to `utils/numerics.mojo`. - ([PR #2375](https://github.com/modular/mojo/pull/2375)) + ([PR #2375](https://github.com/modular/max/pull/2375)) ### Tooling changes @@ -3124,16 +3124,16 @@ Big themes for this release: #### 🛠️ Fixed -- [#1837](https://github.com/modular/mojo/issues/1837) Fix self-referential +- [#1837](https://github.com/modular/max/issues/1837) Fix self-referential variant crashing the compiler. -- [#2363](https://github.com/modular/mojo/issues/2363) Fix LSP crashing on +- [#2363](https://github.com/modular/max/issues/2363) Fix LSP crashing on simple trait definitions. -- [#1787](https://github.com/modular/mojo/issues/1787) Fix error when using +- [#1787](https://github.com/modular/max/issues/1787) Fix error when using `//` on `FloatLiteral` in alias expression. - Made several improvements to dictionary performance. Dicts with integer keys are most heavily affected, but large dicts and dicts with large values will also see large improvements. -- [#2692](https://github.com/modular/mojo/issues/2692) Fix `assert_raises` +- [#2692](https://github.com/modular/max/issues/2692) Fix `assert_raises` to include calling location. ### Special thanks @@ -3322,21 +3322,21 @@ Special thanks to our community contributors: - `pop(index)` for removing an element at a particular index. By default, `List.pop()` removes the last element in the list. ([@LJ-9801](https://github.com/LJ-9801), fixes - [#2017](https://github.com/modular/mojo/issues/2017)) + [#2017](https://github.com/modular/max/issues/2017)) - `resize(new_size)` for resizing the list without the need to specify an additional value. ([@mikowals](https://github.com/mikowals), fixes - [#2133](https://github.com/modular/mojo/issues/2133)) + [#2133](https://github.com/modular/max/issues/2133)) - `insert(index, value)` for inserting a value at a specified index into the `List`. ([@whym1here](https://github.com/whym1here), fixes - [#2134](https://github.com/modular/mojo/issues/2134)) + [#2134](https://github.com/modular/max/issues/2134)) - A new constructor `List(ptr, size, capacity)` to to avoid needing to do a deep copy of an existing contiguous memory allocation when constructing a new `List`. ([@StandinKP](https://github.com/StandinKP), fixes - [#2170](https://github.com/modular/mojo/issues/2170)) + [#2170](https://github.com/modular/max/issues/2170)) - [`Dict`](/mojo/stdlib/collections/dict/Dict) now has a `update()` method to update keys/values from another `Dict`. @@ -3377,7 +3377,7 @@ Special thanks to our community contributors: ([@helehex](https://github.com/helehex) and [@jayzhan211](https://github.com/jayzhan211), contributes towards - [#2325](https://github.com/modular/mojo/issues/2325)) + [#2325](https://github.com/modular/max/issues/2325)) - [`Optional`](/mojo/stdlib/collections/optional/Optional) now implements `__is__` and `__isnot__` methods so that you can compare an `Optional` with @@ -3524,7 +3524,7 @@ Special thanks to our community contributors: [`chr`](/mojo/stdlib/collections/string/chr) functions have been improved to accept any Unicode character. ([@mzaks](https://github.com/mzaks), contributes towards - [#1616](https://github.com/modular/mojo/issues/1616)) + [#1616](https://github.com/modular/max/issues/1616)) - [`atol()`](/mojo/stdlib/collections/string/atol) now handles whitespace. The `atol()`function is used internally by `String.__int__()`, so @@ -3533,7 +3533,7 @@ Special thanks to our community contributors: - [`SIMD`](/mojo/stdlib/builtin/simd/SIMD) now implements the `__rmod__()` method. ([@bgreni](https://github.com/bgreni), fixes - [#1482](https://github.com/modular/mojo/issues/1482)) + [#1482](https://github.com/modular/max/issues/1482)) - [`bool(None)`](/mojo/stdlib/builtin/bool/bool-function) is now implemented. ([@zhoujingya](https://github.com/zhoujingya)) @@ -3568,7 +3568,7 @@ Special thanks to our community contributors: division, modulo, and left and right shift operators, including the in-place and reverse variants. ([@LJ-9801](https://github.com/LJ-9801), fixes - [#2224](https://github.com/modular/mojo/issues/2224)) + [#2224](https://github.com/modular/max/issues/2224)) - Added checked arithmetic operations for `SIMD` integers. @@ -3600,7 +3600,7 @@ Special thanks to our community contributors: - Added [`os.remove()`](/mojo/stdlib/os/os/remove) and [`os.unlink()`](/mojo/stdlib/os/os/unlink) for deleting files. ([@artemiogr97](https://github.com/artemiogr97), fixes - [#2306](https://github.com/modular/mojo/issues/2306)) + [#2306](https://github.com/modular/max/issues/2306)) #### 🦋 Changed @@ -3620,15 +3620,15 @@ Special thanks to our community contributors: ``` ([@lsh](https://github.com/lsh), fixes - [#2179](https://github.com/modular/mojo/issues/2179)) + [#2179](https://github.com/modular/max/issues/2179)) -- Per the accepted community proposal, - [Standardize the representation of byte sequence as a sequence of unsigned - 8-bit integers](https://github.com/modular/mojo/blob/main/proposals/byte-as-uint8.md), - began transition to using `UInt8` by changing the data pointer of `Error` - to `DTypePointer[DType.uint8]`. - ([@gabrieldemarmiesse](https://github.com/gabrieldemarmiesse), contributes - towards [#2317](https://github.com/modular/mojo/issues/2317)) +- Per the accepted community proposal, [Standardize the representation of byte +sequence as a sequence of unsigned 8-bit +integers](https://github.com/modular/max/blob/main/mojo/proposals/byte-as-uint8.md), +began transition to using `UInt8` by changing the data pointer of `Error` to +`DTypePointer[DType.uint8]`. +([@gabrieldemarmiesse](https://github.com/gabrieldemarmiesse), contributes +towards [#2317](https://github.com/modular/max/issues/2317)) - Continued transition to `UnsafePointer` from the legacy `Pointer` type in various standard library APIs and internals. @@ -3700,56 +3700,56 @@ Special thanks to our community contributors: #### 🛠️ Fixed -- [#516](https://github.com/modular/mojo/issues/516) and - [#1817](https://github.com/modular/mojo/issues/1817) and many others, e.g. +- [#516](https://github.com/modular/max/issues/516) and + [#1817](https://github.com/modular/max/issues/1817) and many others, e.g. "Can't create a function that returns two strings." -- [#1178](https://github.com/modular/mojo/issues/1178) (os/kern) failure (5). +- [#1178](https://github.com/modular/max/issues/1178) (os/kern) failure (5). -- [#1609](https://github.com/modular/mojo/issues/1609) alias with +- [#1609](https://github.com/modular/max/issues/1609) alias with `DynamicVector[Tuple[Int]]` fails. -- [#1987](https://github.com/modular/mojo/issues/1987) Defining `main` +- [#1987](https://github.com/modular/max/issues/1987) Defining `main` in a Mojo package is an error, for now. This is not intended to work yet, erroring for now will help to prevent accidental undefined behavior. -- [#1215](https://github.com/modular/mojo/issues/1215) and - [#1949](https://github.com/modular/mojo/issues/1949) The Mojo LSP server no +- [#1215](https://github.com/modular/max/issues/1215) and + [#1949](https://github.com/modular/max/issues/1949) The Mojo LSP server no longer cuts off hover previews for functions with functional arguments, parameters, or results. -- [#1901](https://github.com/modular/mojo/issues/1901) Fixed Mojo LSP and +- [#1901](https://github.com/modular/max/issues/1901) Fixed Mojo LSP and documentation generation handling of inout arguments. -- [#1913](https://github.com/modular/mojo/issues/1913) - `0__` no longer +- [#1913](https://github.com/modular/max/issues/1913) - `0__` no longer crashes the Mojo parser. -- [#1924](https://github.com/modular/mojo/issues/1924) JIT debugging on Mac +- [#1924](https://github.com/modular/max/issues/1924) JIT debugging on Mac has been fixed. -- [#1941](https://github.com/modular/mojo/issues/1941) Mojo variadic arguments +- [#1941](https://github.com/modular/max/issues/1941) Mojo variadic arguments don't work with non-trivial register-only types. -- [#1963](https://github.com/modular/mojo/issues/1963) `a!=0` is now parsed +- [#1963](https://github.com/modular/max/issues/1963) `a!=0` is now parsed and formatted correctly by `mojo format`. -- [#1676](https://github.com/modular/mojo/issues/1676) Fix a crash related to +- [#1676](https://github.com/modular/max/issues/1676) Fix a crash related to `@value` decorator and structs with empty body. -- [#1917](https://github.com/modular/mojo/issues/1917) Fix a crash after +- [#1917](https://github.com/modular/max/issues/1917) Fix a crash after syntax error during tuple creation. -- [#2006](https://github.com/modular/mojo/issues/2006) The Mojo LSP now +- [#2006](https://github.com/modular/max/issues/2006) The Mojo LSP now properly supports signature types with named arguments and parameters. -- [#2007](https://github.com/modular/mojo/issues/2007) and - [#1997](https://github.com/modular/mojo/issues/1997) The Mojo LSP no longer +- [#2007](https://github.com/modular/max/issues/2007) and + [#1997](https://github.com/modular/max/issues/1997) The Mojo LSP no longer crashes on certain types of closures. -- [#1675](https://github.com/modular/mojo/issues/1675) Ensure `@value` +- [#1675](https://github.com/modular/max/issues/1675) Ensure `@value` decorator fails gracefully after duplicate field error. -- [#2068](https://github.com/modular/mojo/issues/2068) +- [#2068](https://github.com/modular/max/issues/2068) Fix `SIMD.reduce()` for size_out == 2. ([@soraros](https://github.com/soraros)) @@ -3762,7 +3762,7 @@ This release doesn't include any changes to Mojo. ### 🔥 Legendary - The Mojo standard library is now open source! Check out the - [README](https://github.com/modular/mojo/blob/main/stdlib/README.md) + [README](https://github.com/modular/max/blob/main/mojo/stdlib/README.md) for everything you need to get started. - Structs and other nominal types are now allowed to implicitly conform to @@ -3831,7 +3831,7 @@ This release doesn't include any changes to Mojo. - `let` declarations now produce a compile time error instead of a warning, our next step in [removing let - declarations](https://github.com/modular/mojo/blob/main/proposals/remove-let-decls.md). + declarations](https://github.com/modular/max/blob/main/mojo/proposals/remove-let-decls.md). The compiler still recognizes the `let` keyword for now in order to produce a good error message, but that will be removed in subsequent releases. @@ -4135,27 +4135,27 @@ fixed in a future release. #### 🛠️ Fixed -- [#1362](https://github.com/modular/mojo/issues/1362) - Parameter inference +- [#1362](https://github.com/modular/max/issues/1362) - Parameter inference now recursively matches function types. -- [#951](https://github.com/modular/mojo/issues/951) - Functions that were +- [#951](https://github.com/modular/max/issues/951) - Functions that were both `async` and `@always_inline` incorrectly errored. -- [#1858](https://github.com/modular/mojo/issues/1858) - Trait with parametric +- [#1858](https://github.com/modular/max/issues/1858) - Trait with parametric methods regression. -- [#1892](https://github.com/modular/mojo/issues/1892) - Forbid unsupported +- [#1892](https://github.com/modular/max/issues/1892) - Forbid unsupported decorators on traits. -- [#1735](https://github.com/modular/mojo/issues/1735) - Trait-typed values +- [#1735](https://github.com/modular/max/issues/1735) - Trait-typed values are incorrectly considered equal. -- [#1909](https://github.com/modular/mojo/issues/1909) - Crash due to nested +- [#1909](https://github.com/modular/max/issues/1909) - Crash due to nested import in unreachable block. -- [#1921](https://github.com/modular/mojo/issues/1921) - Parser crashes +- [#1921](https://github.com/modular/max/issues/1921) - Parser crashes binding Reference to lvalue with subtype lifetime. -- [#1945](https://github.com/modular/mojo/issues/1945) - `Optional[T].or_else()` +- [#1945](https://github.com/modular/max/issues/1945) - `Optional[T].or_else()` should return `T` instead of `Optional[T]`. -- [#1940](https://github.com/modular/mojo/issues/1940) - Constrain +- [#1940](https://github.com/modular/max/issues/1940) - Constrain `math.copysign` to floating point or integral types. -- [#1838](https://github.com/modular/mojo/issues/1838) - Variadic `print` +- [#1838](https://github.com/modular/max/issues/1838) - Variadic `print` does not work when specifying `end=""` -- [#1826](https://github.com/modular/mojo/issues/1826) - The `SIMD.reduce` +- [#1826](https://github.com/modular/max/issues/1826) - The `SIMD.reduce` methods correctly handle edge cases where `size_out >= size`. ## v24.1.1 (2024-03-18) @@ -4509,7 +4509,7 @@ installation issues. Otherwise it is functionally identical to Mojo 24.1. ### 🦋 Changed - As another step towards [removing let - declarations](https://github.com/modular/mojo/blob/main/proposals/remove-let-decls.md) + declarations](https://github.com/modular/max/blob/main/mojo/proposals/remove-let-decls.md) we have removed support for let declarations inside the compiler. To ease migration, we parse `let` declarations as a `var` declaration so your code won't break. We emit a warning about this, but please switch your code to @@ -4609,72 +4609,72 @@ experience without dedicated sugar. ### 🛠️ Fixed -- [#435](https://github.com/modular/mojo/issues/435) +- [#435](https://github.com/modular/max/issues/435) Structs with Self type don't always work. -- [#1540](https://github.com/modular/mojo/issues/1540) +- [#1540](https://github.com/modular/max/issues/1540) Crash in register_passable self referencing struct. -- [#1664](https://github.com/modular/mojo/issues/1664) - Improve error +- [#1664](https://github.com/modular/max/issues/1664) - Improve error message when `StaticTuple` is constructed with a negative size for the number of elements. -- [#1679](https://github.com/modular/mojo/issues/1679) - crash on SIMD of zero +- [#1679](https://github.com/modular/max/issues/1679) - crash on SIMD of zero elements. - Various crashes on invalid code: - [#1230](https://github.com/modular/mojo/issues/1230), - [#1699](https://github.com/modular/mojo/issues/1699), - [#1708](https://github.com/modular/mojo/issues/1708) -- [#1223](https://github.com/modular/mojo/issues/1223) - Crash when parametric + [#1230](https://github.com/modular/max/issues/1230), + [#1699](https://github.com/modular/max/issues/1699), + [#1708](https://github.com/modular/max/issues/1708) +- [#1223](https://github.com/modular/max/issues/1223) - Crash when parametric function is passed as (runtime) argument. The parser now errors out instead. -- [#1530](https://github.com/modular/mojo/issues/1530) - Crash during +- [#1530](https://github.com/modular/max/issues/1530) - Crash during diagnostic emission for parameter deduction failure. -- [#1538](https://github.com/modular/mojo/issues/1538) and [#1607]( - https://github.com/modular/mojo/issues/1607) - Crash when returning type +- [#1538](https://github.com/modular/max/issues/1538) and [#1607]( + https://github.com/modular/max/issues/1607) - Crash when returning type value instead of instance of expected type. This is a common mistake and the error now includes a hint to point users to the problem. -- [#1613](https://github.com/modular/mojo/issues/1613) - Wrong type name in +- [#1613](https://github.com/modular/max/issues/1613) - Wrong type name in error for incorrect `self` argument type in trait method declaration. -- [#1670](https://github.com/modular/mojo/issues/1670) - Crash on implicit +- [#1670](https://github.com/modular/max/issues/1670) - Crash on implicit conversion in a global variable declaration. -- [#1741](https://github.com/modular/mojo/issues/1741) - Mojo documentation +- [#1741](https://github.com/modular/max/issues/1741) - Mojo documentation generation doesn't show `inout`/`owned` on variadic arguments. -- [#1621](https://github.com/modular/mojo/issues/1621) - VS Code does not +- [#1621](https://github.com/modular/max/issues/1621) - VS Code does not highlight `raises` and `capturing` in functional type expressions. -- [#1617](https://github.com/modular/mojo/issues/1617) - VS Code does not +- [#1617](https://github.com/modular/max/issues/1617) - VS Code does not highlight `fn` in specific contexts. -- [#1740](https://github.com/modular/mojo/issues/1740) - LSP shows unrelated +- [#1740](https://github.com/modular/max/issues/1740) - LSP shows unrelated info when hovering over a struct. -- [#1238](https://github.com/modular/mojo/issues/1238) - File shadows Mojo +- [#1238](https://github.com/modular/max/issues/1238) - File shadows Mojo package path. -- [#1429](https://github.com/modular/mojo/issues/1429) - Crash when using +- [#1429](https://github.com/modular/max/issues/1429) - Crash when using nested import statement. -- [#1322](https://github.com/modular/mojo/issues/1322) - Crash when missing +- [#1322](https://github.com/modular/max/issues/1322) - Crash when missing types in variadic argument. -- [#1314](https://github.com/modular/mojo/issues/1314) - Typecheck error when +- [#1314](https://github.com/modular/max/issues/1314) - Typecheck error when binding alias to parametric function with default argument. -- [#1248](https://github.com/modular/mojo/issues/1248) - Crash when importing +- [#1248](https://github.com/modular/max/issues/1248) - Crash when importing from file the same name as another file in the search path. -- [#1354](https://github.com/modular/mojo/issues/1354) - Crash when importing +- [#1354](https://github.com/modular/max/issues/1354) - Crash when importing from local package. -- [#1488](https://github.com/modular/mojo/issues/1488) - Crash when setting +- [#1488](https://github.com/modular/max/issues/1488) - Crash when setting generic element field. -- [#1476](https://github.com/modular/mojo/issues/1476) - Crash in interpreter +- [#1476](https://github.com/modular/max/issues/1476) - Crash in interpreter when calling functions in parameter context. -- [#1537](https://github.com/modular/mojo/issues/1537) - Crash when copying +- [#1537](https://github.com/modular/max/issues/1537) - Crash when copying parameter value. -- [#1546](https://github.com/modular/mojo/issues/1546) - Modify nested vector +- [#1546](https://github.com/modular/max/issues/1546) - Modify nested vector element crashes parser. -- [#1558](https://github.com/modular/mojo/issues/1558) - Invalid import causes +- [#1558](https://github.com/modular/max/issues/1558) - Invalid import causes parser to crash. -- [#1562](https://github.com/modular/mojo/issues/1562) - Crash when calling +- [#1562](https://github.com/modular/max/issues/1562) - Crash when calling parametric type member function. -- [#1577](https://github.com/modular/mojo/issues/1577) - Crash when using +- [#1577](https://github.com/modular/max/issues/1577) - Crash when using unresolved package as a variable. -- [#1579](https://github.com/modular/mojo/issues/1579) - Member access into +- [#1579](https://github.com/modular/max/issues/1579) - Member access into type instances causes a crash. -- [#1602](https://github.com/modular/mojo/issues/1602) - Interpreter failure +- [#1602](https://github.com/modular/max/issues/1602) - Interpreter failure when constructing strings at compile time. -- [#1696](https://github.com/modular/mojo/issues/1696) - Fixed an issue that +- [#1696](https://github.com/modular/max/issues/1696) - Fixed an issue that caused syntax highlighting to occasionally fail. -- [#1549](https://github.com/modular/mojo/issues/1549) - Fixed an issue when +- [#1549](https://github.com/modular/max/issues/1549) - Fixed an issue when the shift amount is out of range in `SIMD.shift_left` and `SIMD.shift_right`. ## v0.7.0 (2024-01-25) @@ -5020,7 +5020,7 @@ experience without dedicated sugar. - The `simd_width` and `dtype` parameters of `polynomial_evaluate` have been switched. Based on the request in - [#1587](https://github.com/modular/mojo/issues/1587), the + [#1587](https://github.com/modular/max/issues/1587), the `polynomial_evaluate` function has also been extended so that the `coefficients` parameter can take either a either a [`StaticTuple`](/mojo/stdlib/utils/static_tuple/StaticTuple) or a @@ -5031,50 +5031,50 @@ experience without dedicated sugar. ### 🛠️ Fixed -- [#1595](https://github.com/modular/mojo/issues/1595) - Improve error message +- [#1595](https://github.com/modular/max/issues/1595) - Improve error message when trying to materialize `IntLiteral` in runtime code. - Raising an error from the initializer of a memory-only type now works correctly in the presence of complex control flow. Previously Mojo could run the destructor on `self` before it was initialized when exiting with an error. -- [#1096](https://github.com/modular/mojo/issues/1096) - Improve warning +- [#1096](https://github.com/modular/max/issues/1096) - Improve warning messages for dead code in conditionals like `or` expressions. -- [#1419](https://github.com/modular/mojo/issues/1419) - Fix assertion failure +- [#1419](https://github.com/modular/max/issues/1419) - Fix assertion failure with uninitialized lattice values. -- [#1402](https://github.com/modular/mojo/issues/1402) - Fix movable trait not +- [#1402](https://github.com/modular/max/issues/1402) - Fix movable trait not detected on recursive struct implemented with `AnyPointer`. -- [#1399](https://github.com/modular/mojo/issues/1399) - Fix parser crash when +- [#1399](https://github.com/modular/max/issues/1399) - Fix parser crash when a parameter type in a struct that implements a trait is misspelled. -- [#1152](https://github.com/modular/mojo/issues/1152) - Allow mutable `self` +- [#1152](https://github.com/modular/max/issues/1152) - Allow mutable `self` argument when overloading operators using dunder methods. -- [#1493](https://github.com/modular/mojo/issues/1493) - Fix crash in +- [#1493](https://github.com/modular/max/issues/1493) - Fix crash in `DynamicVector` copy constructor in certain situations. -- [#1316](https://github.com/modular/mojo/issues/1316) - The `benchmark.keep` +- [#1316](https://github.com/modular/max/issues/1316) - The `benchmark.keep` function now properly handles vector types. -- [#1505](https://github.com/modular/mojo/issues/1505) - The `simd.shuffle` +- [#1505](https://github.com/modular/max/issues/1505) - The `simd.shuffle` operation now works on 64 element permutations. -- [#1355](https://github.com/modular/mojo/issues/1355) - Fix `String.find()` +- [#1355](https://github.com/modular/max/issues/1355) - Fix `String.find()` returning wrong value when starting index is non-zero. -- [#1367](https://github.com/modular/mojo/issues/1367) - Fix `String.replace()` +- [#1367](https://github.com/modular/max/issues/1367) - Fix `String.replace()` returning incorrect results for multi-character search strings. -- [#1535](https://github.com/modular/mojo/issues/1535) - Invalid error `field +- [#1535](https://github.com/modular/max/issues/1535) - Invalid error `field 'w.x.y' destroyed out of the middle of a value, preventing the overall value from being destroyed`. -- [#1475](https://github.com/modular/mojo/issues/1475) - Assertion failure in +- [#1475](https://github.com/modular/max/issues/1475) - Assertion failure in nested loop. -- [#1591](https://github.com/modular/mojo/issues/1591) - Assertion failure +- [#1591](https://github.com/modular/max/issues/1591) - Assertion failure when using `AnyType` struct member. -- [#1503](https://github.com/modular/mojo/issues/1503) - Rename the mojo build +- [#1503](https://github.com/modular/max/issues/1503) - Rename the mojo build of LLDB to `mojo-lldb`, to prevent name collisions with the system's LLDB. -- [#1542](https://github.com/modular/mojo/issues/1542) - `@unroll` does not +- [#1542](https://github.com/modular/max/issues/1542) - `@unroll` does not accept alias as unroll factor. -- [#1443](https://github.com/modular/mojo/issues/1443) - Compiler crash on +- [#1443](https://github.com/modular/max/issues/1443) - Compiler crash on variadic list of traits. -- [#1604](https://github.com/modular/mojo/issues/1604) - Variable of trivial +- [#1604](https://github.com/modular/max/issues/1604) - Variable of trivial type not destroyed by transferring ownership. -- [#1341](https://github.com/modular/mojo/issues/1341) - Segmentation fault +- [#1341](https://github.com/modular/max/issues/1341) - Segmentation fault when passing closures around. -- [#217](https://github.com/modular/mojo/issues/217) - Closure state is +- [#217](https://github.com/modular/max/issues/217) - Closure state is stack allocated. ## v0.6.1 (2023-12-18) @@ -5136,23 +5136,23 @@ experience without dedicated sugar. ### 🛠️ Fixed -- [#1421](https://github.com/modular/mojo/issues/1421) - Fixed a crash when +- [#1421](https://github.com/modular/max/issues/1421) - Fixed a crash when using Tuples in the REPL. -- [#222](https://github.com/modular/mojo/issues/222) - Generate an error +- [#222](https://github.com/modular/max/issues/222) - Generate an error for obviously self recursive functions. -- [#1408](https://github.com/modular/mojo/issues/1408) - Fix overload +- [#1408](https://github.com/modular/max/issues/1408) - Fix overload resolution when candidates can return generic types. -- [#1413](https://github.com/modular/mojo/issues/1413) and - [#1395](https://github.com/modular/mojo/issues/1395) - Do not crash when +- [#1413](https://github.com/modular/max/issues/1413) and + [#1395](https://github.com/modular/max/issues/1395) - Do not crash when re-declaring a builtin declaration. -- [#1307](https://github.com/modular/mojo/issues/1307) - Fix compatibility of +- [#1307](https://github.com/modular/max/issues/1307) - Fix compatibility of function signatures that only differ in default argument values. -- [#1380](https://github.com/modular/mojo/issues/1380) - Fix printing +- [#1380](https://github.com/modular/max/issues/1380) - Fix printing of empty `String`. ## v0.6.0 (2023-12-04) @@ -5287,7 +5287,7 @@ experience without dedicated sugar. manual (now deprecated). Plus, the entire Mojo Manual and other Mojo docs are now [open-sourced on - GitHub](https://github.com/modular/mojo/tree/main/docs), and we'd love + GitHub](https://github.com/modular/max/tree/main/mojo/docs), and we'd love to accept contributions to help us improve them! - Mojo now supports partial automatic parameterization: when a function is @@ -5455,7 +5455,7 @@ the previous "read to EOF" behavior when size is negative. - The Mojo Language Server now implements the Document Symbols request. IDEs use this to provide support for **Outline View** and **Go to Symbol**. This - addresses [Issue #960](https://github.com/modular/mojo/issues/960). + addresses [Issue #960](https://github.com/modular/max/issues/960). - The Mojo Language Server now shows documentation when code completing modules or packages in `import` statements. @@ -5519,31 +5519,31 @@ the previous "read to EOF" behavior when size is negative. ### 🛠️ Fixed -- [#734](https://github.com/modular/mojo/issues/734) - Consumption of struct +- [#734](https://github.com/modular/max/issues/734) - Consumption of struct works only for types with a `__del__` method. -- [#910](https://github.com/modular/mojo/issues/910) - Parser crash when +- [#910](https://github.com/modular/max/issues/910) - Parser crash when using memory-only generic type as return of function that `raise`s. -- [#1060](https://github.com/modular/mojo/issues/1060) - Mojo happily parses +- [#1060](https://github.com/modular/max/issues/1060) - Mojo happily parses code that has messed up indentation -- [#1159](https://github.com/modular/mojo/issues/1159) - The language server +- [#1159](https://github.com/modular/max/issues/1159) - The language server doesn't warn about bad return type. -- [#1166](https://github.com/modular/mojo/issues/1166) - warning: unreachable +- [#1166](https://github.com/modular/max/issues/1166) - warning: unreachable code after return statement with context manager -- [#1098](https://github.com/modular/mojo/issues/1098) - The language server +- [#1098](https://github.com/modular/max/issues/1098) - The language server doesn't highlight properties of PythonObjects correctly. -- [#1153](https://github.com/modular/mojo/issues/1153) - The language server +- [#1153](https://github.com/modular/max/issues/1153) - The language server crashes when parsing an invalid multi-nested module import. -- [#1236](https://github.com/modular/mojo/issues/1236) - The language server +- [#1236](https://github.com/modular/max/issues/1236) - The language server doesn't show autocomplete in if statements. -- [#1246](https://github.com/modular/mojo/issues/1246) - Warning diagnostics +- [#1246](https://github.com/modular/max/issues/1246) - Warning diagnostics are transient in the presence of caching. ### Known Issue @@ -5798,32 +5798,32 @@ the previous "read to EOF" behavior when size is negative. ### 🛠️ Fixed -- [#532](https://github.com/modular/mojo/issues/532) - Compiler optimizing +- [#532](https://github.com/modular/max/issues/532) - Compiler optimizing while True loop away -- [#760](https://github.com/modular/mojo/issues/760) - Compilation error: +- [#760](https://github.com/modular/max/issues/760) - Compilation error: 'hlcf.for.yield' op specifies 0 branch inputs but target expected 1 along control-flow edge from here -- [#849](https://github.com/modular/mojo/issues/849) - The `Tensor` type is +- [#849](https://github.com/modular/max/issues/849) - The `Tensor` type is now initialized with zeros at construction time. -- [#912](https://github.com/modular/mojo/issues/912) - Invalid load for +- [#912](https://github.com/modular/max/issues/912) - Invalid load for `__get_address_as_lvalue`. -- [#916](https://github.com/modular/mojo/issues/916) - Parser crash when +- [#916](https://github.com/modular/max/issues/916) - Parser crash when specifying default values for `inout` arguments. -- [#943](https://github.com/modular/mojo/issues/943) - Mojo hangs if you +- [#943](https://github.com/modular/max/issues/943) - Mojo hangs if you use continue in the nested loop -- [#957](https://github.com/modular/mojo/issues/957) - Parser crash when a +- [#957](https://github.com/modular/max/issues/957) - Parser crash when a function call with variadic arguments of a memory-only type is evaluated at compile time. -- [#990](https://github.com/modular/mojo/issues/990) - Fixes rounding +- [#990](https://github.com/modular/max/issues/990) - Fixes rounding issue with floor division with negative numerator. -- [#1018](https://github.com/modular/mojo/issues/1018) - In some cases the +- [#1018](https://github.com/modular/max/issues/1018) - In some cases the sort function was returning invalid results. This release fixes some of these corner cases. -- [#1010](https://github.com/modular/mojo/issues/1010) - Initializing tensor +- [#1010](https://github.com/modular/max/issues/1010) - Initializing tensor in alias declaration results in crash. -- [#1110](https://github.com/modular/mojo/issues/1110) - The `time.now()` +- [#1110](https://github.com/modular/max/issues/1110) - The `time.now()` function now returns nanoseconds across all operating systems. -- [#1115](https://github.com/modular/mojo/issues/1115) - cannot load +- [#1115](https://github.com/modular/max/issues/1115) - cannot load non-register passable type into SSA register. ## v0.4.0 for Mac (2023-10-19) @@ -6002,33 +6002,33 @@ the previous "read to EOF" behavior when size is negative. ### 🛠️ Fixed -- [#794](https://github.com/modular/mojo/issues/794) - Parser crash when +- [#794](https://github.com/modular/max/issues/794) - Parser crash when using the `in` operator. -- [#936](https://github.com/modular/mojo/issues/936) - The `Int` constructor +- [#936](https://github.com/modular/max/issues/936) - The `Int` constructor now accepts other `Int` instances. -- [#921](https://github.com/modular/mojo/issues/921) - Better error message +- [#921](https://github.com/modular/max/issues/921) - Better error message when running `mojo` on a module with no `main` function. -- [#556](https://github.com/modular/mojo/issues/556) - UInt64s are now +- [#556](https://github.com/modular/max/issues/556) - UInt64s are now printed correctly. -- [#804](https://github.com/modular/mojo/issues/804) - Emit error instead of +- [#804](https://github.com/modular/max/issues/804) - Emit error instead of crashing when passing variadic arguments of unsupported types. -- [#833](https://github.com/modular/mojo/issues/833) - Parser crash when +- [#833](https://github.com/modular/max/issues/833) - Parser crash when assigning module value. -- [#752](https://github.com/modular/mojo/issues/752) - Parser crash when +- [#752](https://github.com/modular/max/issues/752) - Parser crash when calling async def. -- [#711](https://github.com/modular/mojo/issues/711) - The overload resolution +- [#711](https://github.com/modular/max/issues/711) - The overload resolution logic now correctly prioritizes instance methods over static methods (if candidates are an equally good match otherwise), and no longer crashed if a static method has a `Self` type as its first argument. -- [#859](https://github.com/modular/mojo/issues/859) - Fix confusing error and +- [#859](https://github.com/modular/max/issues/859) - Fix confusing error and documentation of the `rebind` builtin. -- [#753](https://github.com/modular/mojo/issues/753) - Direct use of LLVM +- [#753](https://github.com/modular/max/issues/753) - Direct use of LLVM dialect produces strange errors in the compiler. -- [#926](https://github.com/modular/mojo/issues/926) - Fixes an issue that +- [#926](https://github.com/modular/max/issues/926) - Fixes an issue that occurred when a function with a return type of `StringRef` raised an error. When the function raised an error, it incorrectly returned the string value of that error. -- [#536](https://github.com/modular/mojo/issues/536) - Report More information +- [#536](https://github.com/modular/max/issues/536) - Report More information on python exception. ## v0.3.1 (2023-09-28) @@ -6039,15 +6039,15 @@ installing the previous versions of the SDK, this release may be for you. ### 🛠️ Fixed -- [#538](https://github.com/modular/mojo/issues/538) - Installation hangs +- [#538](https://github.com/modular/max/issues/538) - Installation hangs during the testing phase. This issue occurs on machines with a low number of CPU cores, such as free AWS EC2 instances and GitHub Codespaces. -- [#590](https://github.com/modular/mojo/issues/590) - Installation fails +- [#590](https://github.com/modular/max/issues/590) - Installation fails with a “failed to run python” message. -- [#672](https://github.com/modular/mojo/issues/672) - Language server hangs +- [#672](https://github.com/modular/max/issues/672) - Language server hangs on code completion. Related to #538, this occurs on machines with a low number of CPU cores. -- [#913](https://github.com/modular/mojo/issues/913) - In the REPL and Jupyter +- [#913](https://github.com/modular/max/issues/913) - In the REPL and Jupyter notebooks, inline comments were being parsed incorrectly. ## v0.3.0 (2023-09-21) @@ -6149,7 +6149,7 @@ Code](https://marketplace.visualstudio.com/items?itemName=modular-mojotools.vsco - The Mojo Language Server now supports top-level code completions, enabling completion when typing a reference to a variable, type, etc. This resolves - [#679](https://github.com/modular/mojo/issues/679). + [#679](https://github.com/modular/max/issues/679). - The Mojo REPL now colorizes the resultant variables to help distinguish input expressions from the output variables. @@ -6188,19 +6188,19 @@ Code](https://marketplace.visualstudio.com/items?itemName=modular-mojotools.vsco ### 🛠️ Fixed -- [#503](https://github.com/modular/mojo/issues/503) - Improve error message +- [#503](https://github.com/modular/max/issues/503) - Improve error message for failure lowering `kgen.param.constant`. -- [#554](https://github.com/modular/mojo/issues/554) - Alias of static tuple +- [#554](https://github.com/modular/max/issues/554) - Alias of static tuple fails to expand. -- [#500](https://github.com/modular/mojo/issues/500) - Call expansion failed +- [#500](https://github.com/modular/max/issues/500) - Call expansion failed due to verifier error. -- [#422](https://github.com/modular/mojo/issues/422) - Incorrect comment +- [#422](https://github.com/modular/max/issues/422) - Incorrect comment detection in multiline strings. -- [#729](https://github.com/modular/mojo/issues/740) - Improve messaging on +- [#729](https://github.com/modular/max/issues/740) - Improve messaging on how to exit the REPL. -- [#756](https://github.com/modular/mojo/issues/756) - Fix initialization +- [#756](https://github.com/modular/max/issues/756) - Fix initialization errors of the VS Code extension. -- [#575](https://github.com/modular/mojo/issues/575) - Build LLDB/REPL with +- [#575](https://github.com/modular/max/issues/575) - Build LLDB/REPL with libedit for a nicer editing experience in the terminal. ## v0.2.1 (2023-09-07) @@ -6263,17 +6263,17 @@ All earlier releases were considered version 0.1. been changed to enable type inference. Now it's possible to write `rotate_right[shift_val](simd_val)` and have the `dtype` and `simd_width` inferred from the argument. This addresses - [Issue #528](https://github.com/modular/mojo/issues/528). + [Issue #528](https://github.com/modular/max/issues/528). ### 🛠️ Fixed - Fixed a bug causing the parser to crash when the `with` statement was written without a colon. - This addresses [Issue #529](https://github.com/modular/mojo/issues/529). + This addresses [Issue #529](https://github.com/modular/max/issues/529). - Incorrect imports no longer crash when there are other errors at the top level of a module. This fixes [Issue - #531](https://github.com/modular/mojo/issues/531). + #531](https://github.com/modular/max/issues/531). ## August 2023 @@ -6348,15 +6348,15 @@ All earlier releases were considered version 0.1. #### 🛠️ Fixed - Fixed issues with print formatting for `DType.uint16` and `DType.int16`. -- [Issue #499](https://github.com/modular/mojo/issues/499) - Two new +- [Issue #499](https://github.com/modular/max/issues/499) - Two new `rotate_right` and `rotate_left` functions have been added to the SIMD module. -- [Issue #429](https://github.com/modular/mojo/issues/429) - You can now +- [Issue #429](https://github.com/modular/max/issues/429) - You can now construct a `Bool` from a `SIMD` type whose element-type is `DType.bool`. -- [Issue #350](https://github.com/modular/mojo/issues/350) - Confusing Matrix +- [Issue #350](https://github.com/modular/max/issues/350) - Confusing Matrix implementation -- [Issue #349](https://github.com/modular/mojo/issues/349) - Missing load_tr +- [Issue #349](https://github.com/modular/max/issues/349) - Missing load_tr in struct Matrix -- [Issue #501](https://github.com/modular/mojo/issues/501) - Missing syntax +- [Issue #501](https://github.com/modular/max/issues/501) - Missing syntax error messages in Python expressions. ### 2023-08-09 @@ -6420,7 +6420,7 @@ All earlier releases were considered version 0.1. #### 🛠️ Fixed -- [Issue #53](https://github.com/modular/mojo/issues/53) - `Int` now +- [Issue #53](https://github.com/modular/max/issues/53) - `Int` now implements true division with the `/` operator. Similar to Python, this returns a 64-bit floating point number. The corresponding in-place operator, `/=`, has the same semantics as `//=`. @@ -6460,10 +6460,10 @@ All earlier releases were considered version 0.1. #### 🛠️ Fixed -- [Issue #437](https://github.com/modular/mojo/issues/437) - Range can now +- [Issue #437](https://github.com/modular/max/issues/437) - Range can now be instantiated with a PythonObject. -- [Issue #288](https://github.com/modular/mojo/issues/288) - Python strings +- [Issue #288](https://github.com/modular/max/issues/288) - Python strings can now be safely copied. ### 2023-07-20 @@ -6472,7 +6472,7 @@ All earlier releases were considered version 0.1. - Mojo now includes a `Limits` module, which contains functions to get the max and min values representable by a type, as requested in [Issue - #51](https://github.com/modular/mojo/issues/51). The following functions + #51](https://github.com/modular/max/issues/51). The following functions moved from `Math` to `Limits`: `inf()`, `neginf()`, `isinf()`, `isfinite()`. - Mojo decorators are now distinguished between "signature" and "body" @@ -6539,14 +6539,14 @@ All earlier releases were considered version 0.1. - Reverted the feature from 2023-02-13 that allowed unqualified struct members. Use the `Self` keyword to conveniently access struct members with bound parameters instead. This was required to fix - [Issue #260](https://github.com/modular/mojo/issues/260). + [Issue #260](https://github.com/modular/max/issues/260). - Updated the RayTracing notebook: added step 5 to create specular lighting for more realistic images and step 6 to add a background image. #### 🛠️ Fixed -- [Issue #260](https://github.com/modular/mojo/issues/260) - Definitions +- [Issue #260](https://github.com/modular/max/issues/260) - Definitions inside structs no longer shadow definitions outside of struct definitions. ### 2023-07-12 @@ -6583,7 +6583,7 @@ All earlier releases were considered version 0.1. - The walrus operator now works in if/while statements without parentheses, e.g. `if x := function():`. -- [Issue #428](https://github.com/modular/mojo/issues/428) - The +- [Issue #428](https://github.com/modular/max/issues/428) - The `FloatLiteral` and `SIMD` types now support conversion to `Int` via the `to_int` or `__int__` method calls. The behavior matches that of Python, which rounds towards zero. @@ -6613,21 +6613,21 @@ All earlier releases were considered version 0.1. #### 🛠️ Fixed -- [Issue #253](https://github.com/modular/mojo/issues/253) - Issue +- [Issue #253](https://github.com/modular/max/issues/253) - Issue when accessing a struct member alias without providing parameters. -- [Issue #404](https://github.com/modular/mojo/issues/404) - The docs now use +- [Issue #404](https://github.com/modular/max/issues/404) - The docs now use `snake_case` for variable names, which more closely conforms to Python's style. -- [Issue #379](https://github.com/modular/mojo/issues/379) - Tuple +- [Issue #379](https://github.com/modular/max/issues/379) - Tuple limitations have been addressed and multiple return values are now supported, even without parentheses. -- [Issue #347](https://github.com/modular/mojo/issues/347) - Tuples no longer +- [Issue #347](https://github.com/modular/max/issues/347) - Tuples no longer require parentheses. -- [Issue #320](https://github.com/modular/mojo/issues/320) - Python objects +- [Issue #320](https://github.com/modular/max/issues/320) - Python objects are now traversable via `for` loops. ## June 2023 @@ -6653,18 +6653,18 @@ All earlier releases were considered version 0.1. #### 🛠️ Fixed -- [Issue #229](https://github.com/modular/mojo/issues/229) - Issue when +- [Issue #229](https://github.com/modular/max/issues/229) - Issue when throwing an exception from `__init__` before all fields are initialized. -- [Issue #74](https://github.com/modular/mojo/issues/74) - Struct +- [Issue #74](https://github.com/modular/max/issues/74) - Struct definition with recursive reference crashes. -- [Issue #285](https://github.com/modular/mojo/issues/285) - The +- [Issue #285](https://github.com/modular/max/issues/285) - The [`TargetInfo`](/mojo/stdlib/sys/info) module now includes `is_little_endian()` and `is_big_endian()` to check if the target host uses either little or big endian. -- [Issue #254](https://github.com/modular/mojo/issues/254) - Parameter name +- [Issue #254](https://github.com/modular/max/issues/254) - Parameter name shadowing in nested scopes is now handled correctly. ### 2023-06-21 @@ -6721,14 +6721,14 @@ only in declared parameter names, e.g. the following now works correctly: fn foobar[w: Int, S: DType]() -> SIMD[S, w]: ... ``` -- [Issue #219](https://github.com/modular/mojo/issues/219) - Issue when +- [Issue #219](https://github.com/modular/max/issues/219) - Issue when redefining a function and a struct defined in the same cell. -- [Issue #355](https://github.com/modular/mojo/issues/355) - The loop order +- [Issue #355](https://github.com/modular/max/issues/355) - The loop order in the Matmul notebook for Python and naive mojo have been reordered for consistency. The loop order now follows (M, K, N) ordering. -- [Issue #309](https://github.com/modular/mojo/issues/309) - Use snake case +- [Issue #309](https://github.com/modular/max/issues/309) - Use snake case naming within the testing package and move the asserts out of the TestSuite struct. @@ -6750,11 +6750,11 @@ only in declared parameter names, e.g. the following now works correctly: #### 🛠️ Fixed -- [Issue #354](https://github.com/modular/mojo/issues/354) - Returning a tuple +- [Issue #354](https://github.com/modular/max/issues/354) - Returning a tuple doesn't work even with parens. -- [Issue #365](https://github.com/modular/mojo/issues/365) - Copy-paste error +- [Issue #365](https://github.com/modular/max/issues/365) - Copy-paste error in `FloatLiteral` docs. -- [Issue #357](https://github.com/modular/mojo/issues/357) - Crash when +- [Issue #357](https://github.com/modular/max/issues/357) - Crash when missing input parameter to variadic parameter struct member function. ### 2023-06-07 @@ -6771,7 +6771,7 @@ only in declared parameter names, e.g. the following now works correctly: - Mojo Playground no longer includes the following Python packages (due to size, compute costs, and - [environment complications](https://github.com/modular/mojo/issues/300)): + [environment complications](https://github.com/modular/max/issues/300)): `torch`, `tensorflow`, `keras`, `transformers`. #### 🦋 Changed @@ -6779,19 +6779,19 @@ only in declared parameter names, e.g. the following now works correctly: - The data types and scalar names now conform to the naming convention used by numpy. So we use `Int32` instead of `SI32`, similarly using `Float32` instead of `F32`. Closes - [Issue #152](https://github.com/modular/mojo/issues/152). + [Issue #152](https://github.com/modular/max/issues/152). #### 🛠️ Fixed -- [Issue #287](https://github.com/modular/mojo/issues/287) - computed +- [Issue #287](https://github.com/modular/max/issues/287) - computed lvalues don't handle raising functions correctly -- [Issue #318](https://github.com/modular/mojo/issues/318) - Large integers +- [Issue #318](https://github.com/modular/max/issues/318) - Large integers are not being printed correctly -- [Issue #326](https://github.com/modular/mojo/issues/326) - Float modulo +- [Issue #326](https://github.com/modular/max/issues/326) - Float modulo operator is not working as expected -- [Issue #282](https://github.com/modular/mojo/issues/282) - Default arguments +- [Issue #282](https://github.com/modular/max/issues/282) - Default arguments are not working as expected -- [Issue #271](https://github.com/modular/mojo/issues/271) - Confusing error +- [Issue #271](https://github.com/modular/max/issues/271) - Confusing error message when converting between function types with different result semantics ## May 2023 @@ -6801,7 +6801,7 @@ only in declared parameter names, e.g. the following now works correctly: #### ⭐️ New - Mojo Playground now includes the following Python packages (in response to - [popular demand](https://github.com/modular/mojo/discussions/173)): + [popular demand](https://github.com/modular/max/discussions/173)): `torch`, `tensorflow`, `polars`, `opencv-python`, `keras`, `Pillow`, `plotly`, `seaborn`, `sympy`, `transformers`. @@ -6865,9 +6865,9 @@ only in declared parameter names, e.g. the following now works correctly: #### 🛠️ Fixed -- [Issue #231](https://github.com/modular/mojo/issues/231) - Unexpected error +- [Issue #231](https://github.com/modular/max/issues/231) - Unexpected error when a Python expression raises an exception -- [Issue #119](https://github.com/modular/mojo/issues/119) - The REPL fails +- [Issue #119](https://github.com/modular/max/issues/119) - The REPL fails when a python variable is redefined ### 2023-05-24 @@ -6892,39 +6892,39 @@ only in declared parameter names, e.g. the following now works correctly: #### 🛠️ Fixed -- [Issue #204](https://github.com/modular/mojo/issues/204) - Mojo REPL +- [Issue #204](https://github.com/modular/max/issues/204) - Mojo REPL crash when returning a String at compile-time -- [Issue #143](https://github.com/modular/mojo/issues/143) - synthesized +- [Issue #143](https://github.com/modular/max/issues/143) - synthesized init in `@register_passable` type doesn't get correct convention. -- [Issue #201](https://github.com/modular/mojo/issues/201) - String literal +- [Issue #201](https://github.com/modular/max/issues/201) - String literal concatenation is too eager. -- [Issue #209](https://github.com/modular/mojo/issues/209) - [QoI] Terrible +- [Issue #209](https://github.com/modular/max/issues/209) - [QoI] Terrible error message trying to convert a type to itself. -- [Issue #32](https://github.com/modular/mojo/issues/32) - Include struct +- [Issue #32](https://github.com/modular/max/issues/32) - Include struct fields in docgen -- [Issue #50](https://github.com/modular/mojo/issues/50) - Int to string +- [Issue #50](https://github.com/modular/max/issues/50) - Int to string conversion crashes due to buffer overflow -- [Issue #132](https://github.com/modular/mojo/issues/132) - PythonObject +- [Issue #132](https://github.com/modular/max/issues/132) - PythonObject `to_int` method has a misleading name -- [Issue #189](https://github.com/modular/mojo/issues/189) - PythonObject bool +- [Issue #189](https://github.com/modular/max/issues/189) - PythonObject bool conversion is incorrect -- [Issue #65](https://github.com/modular/mojo/issues/65) - Add SIMD +- [Issue #65](https://github.com/modular/max/issues/65) - Add SIMD constructor from Bool -- [Issue #153](https://github.com/modular/mojo/issues/153) - Meaning of +- [Issue #153](https://github.com/modular/max/issues/153) - Meaning of `Time.now` function result is unclear -- [Issue #165](https://github.com/modular/mojo/issues/165) - Type in +- [Issue #165](https://github.com/modular/max/issues/165) - Type in `Pointer.free` documentation -- [Issue #210](https://github.com/modular/mojo/issues/210) - Parameter results +- [Issue #210](https://github.com/modular/max/issues/210) - Parameter results cannot be declared outside top-level in function -- [Issue #214](https://github.com/modular/mojo/issues/214) - Pointer offset +- [Issue #214](https://github.com/modular/max/issues/214) - Pointer offset calculations at compile-time are incorrect -- [Issue #115](https://github.com/modular/mojo/issues/115) - Float printing +- [Issue #115](https://github.com/modular/max/issues/115) - Float printing does not include the right number of digits -- [Issue #202](https://github.com/modular/mojo/issues/202) - +- [Issue #202](https://github.com/modular/max/issues/202) - `kgen.unreachable` inside nested functions is illegal -- [Issue #235](https://github.com/modular/mojo/issues/235) - Crash when +- [Issue #235](https://github.com/modular/max/issues/235) - Crash when register passable struct field is not register passable -- [Issue #237](https://github.com/modular/mojo/issues/237) - Parameter +- [Issue #237](https://github.com/modular/max/issues/237) - Parameter closure sharp edges are not documented ### 2023-05-16 @@ -6939,16 +6939,16 @@ only in declared parameter names, e.g. the following now works correctly: #### 🛠️ Fixed -- [Issue #98](https://github.com/modular/mojo/issues/98): +- [Issue #98](https://github.com/modular/max/issues/98): Incorrect error with lifetime tracking in loop. -- [Issue #49](https://github.com/modular/mojo/issues/49): Type inference +- [Issue #49](https://github.com/modular/max/issues/49): Type inference issue (?) in 'ternary assignment' operation (FloatLiteral vs. 'SIMD[f32, 1]'). -- [Issue #48](https://github.com/modular/mojo/issues/48): +- [Issue #48](https://github.com/modular/max/issues/48): and/or don't work with memory-only types. -- [Issue #11](https://github.com/modular/mojo/issues/11): `setitem` Support +- [Issue #11](https://github.com/modular/max/issues/11): `setitem` Support for `PythonObject`. ### 2023-05-11 @@ -6966,7 +6966,7 @@ only in declared parameter names, e.g. the following now works correctly: - The "byref" syntax with the `&` sigil has changed to use an `inout` keyword to be more similar to the `borrowed` and `owned` syntax in arguments. - Please see [Issue #7](https://github.com/modular/mojo/issues/7) for more + Please see [Issue #7](https://github.com/modular/max/issues/7) for more information. - Optimized the Matrix multiplication implementation in the notebook. @@ -6983,10 +6983,10 @@ from "consume" to "transfer." - Fixed missing overloads for `Testing.assertEqual` so that they work on `Integer` and `String` values. -- [Issue #6](https://github.com/modular/mojo/issues/6): +- [Issue #6](https://github.com/modular/max/issues/6): Playground stops evaluating cells when a simple generic is defined. -- [Issue #18](https://github.com/modular/mojo/issues/18): +- [Issue #18](https://github.com/modular/max/issues/18): Memory leak in Python interoperability was removed. ### 2023-05-02 diff --git a/mojo/docs/changelog.md b/mojo/docs/changelog.md index 8f7363e0de..750d44f331 100644 --- a/mojo/docs/changelog.md +++ b/mojo/docs/changelog.md @@ -105,7 +105,7 @@ what we publish. The same statement will now raise an error informing the user their indices are invalid. -- Added an iterator to `LinkedList` ([PR #4005](https://github.com/modular/mojo/pull/4005)) +- Added an iterator to `LinkedList` ([PR #4005](https://github.com/modular/max/pull/4005)) - `LinkedList.__iter__()` to create a forward iterator. - `LinkedList.__reversed__()` for a backward iterator. diff --git a/mojo/docs/faq.md b/mojo/docs/faq.md index 2061c83564..93da03c653 100644 --- a/mojo/docs/faq.md +++ b/mojo/docs/faq.md @@ -148,7 +148,7 @@ at Modular to develop AI algorithms, but you can use it for other things like HPC, data transformations, writing pre/post processing operations, and much more. For examples of how Mojo can be used for other general programming tasks, see our [Mojo -examples](https://github.com/modular/mojo/tree/main/examples). +examples](https://github.com/modular/max/tree/main/examples/mojo). ### Is Mojo interpreted or compiled? @@ -285,7 +285,7 @@ and does not require login. using buttons in the Playground toolbar. - There might be some bugs. Please [report issues and feedback on - GitHub](https://github.com/modular/mojo/issues/new/choose). + GitHub](https://github.com/modular/max/issues/new/choose). ### What are the license terms for the SDK? diff --git a/mojo/docs/manual/basics.mdx b/mojo/docs/manual/basics.mdx index 4020b3eb96..ea9c44180c 100644 --- a/mojo/docs/manual/basics.mdx +++ b/mojo/docs/manual/basics.mdx @@ -450,11 +450,15 @@ Otherwise, here are some other resources to check out: * See [Get started with Mojo](/mojo/manual/get-started) for a hands-on tutorial that will get you up and running with Mojo. -* If you want to experiment with some code, clone [the Mojo - repo](https://github.com/modular/mojo/) to try our code examples: +* If you want to experiment with some code, clone [our GitHub + repo](https://github.com/modular/max/) to try our code examples: ```sh - git clone https://github.com/modular/mojo.git + git clone https://github.com/modular/max.git + ``` + + ```sh + cd max/examples/mojo ``` * To see all the available Mojo APIs, check out the [Mojo standard library diff --git a/mojo/docs/manual/get-started.mdx b/mojo/docs/manual/get-started.mdx index 799ebbc78d..2c7ac86f54 100644 --- a/mojo/docs/manual/get-started.mdx +++ b/mojo/docs/manual/get-started.mdx @@ -2,7 +2,7 @@ title: "Get started with Mojo" sidebar_label: "Tutorial: Get started with Mojo" description: "Install Mojo and learn the language basics by building a complete Mojo program" -github_url: https://github.com/modular/mojo/tree/main/examples/life +github_url: https://github.com/modular/max/tree/main/examples/mojo/life image: /images/artwork/mojo-get-started.jpg --- @@ -37,7 +37,7 @@ This tutorial might be a little long because there's a lot to learn, but we tried to keep the explanations simple, and we included links along the way for you to go learn more about each topic. If you just want to see the finished code, you can [get it on -GitHub](https://github.com/modular/mojo/tree/main/examples/life). +GitHub](https://github.com/modular/max/tree/main/examples/mojo/life). System requirements: diff --git a/mojo/docs/manual/operators.mdx b/mojo/docs/manual/operators.mdx index b3f9e8fd00..22a52dd56e 100644 --- a/mojo/docs/manual/operators.mdx +++ b/mojo/docs/manual/operators.mdx @@ -1,7 +1,7 @@ --- title: Operators, expressions, and dunder methods sidebar_label: Operators and expressions -github_url: https://github.com/modular/mojo/tree/main/examples/operators +github_url: https://github.com/modular/max/tree/main/examples/mojo/operators --- Mojo includes a variety of operators for manipulating values of different types. @@ -1071,8 +1071,8 @@ operations like printing complex values. We'll also allow mixing `Complex` and `Float64` values in arithmetic expressions to produce a `Complex` result. This example builds our `Complex` struct incrementally. You can also find the -[complete example in the public Mojo GitHub -repo](https://github.com/modular/mojo/tree/main/examples/operators). +[complete example in the public GitHub +repo](https://github.com/modular/max/tree/main/examples/mojo/operators). :::note diff --git a/mojo/docs/manual/parameters/index.mdx b/mojo/docs/manual/parameters/index.mdx index 22f588a94a..3c1b82c475 100644 --- a/mojo/docs/manual/parameters/index.mdx +++ b/mojo/docs/manual/parameters/index.mdx @@ -140,7 +140,7 @@ Mojo's support for generics is still early. You can write generic functions like this using traits and parameters. You can also write generic collections like `List` and `Dict`. If you're interested in learning how these types work, you can find the source code for the standard library collection types -[on GitHub](https://github.com/modular/mojo/blob/nightly/stdlib/src/collections/). +[on GitHub](https://github.com/modular/max/blob/main/mojo/stdlib/src/collections/). ## Parameterized structs diff --git a/mojo/docs/manual/values/lifetimes.mdx b/mojo/docs/manual/values/lifetimes.mdx index bd96d45b95..5d9bb37c10 100644 --- a/mojo/docs/manual/values/lifetimes.mdx +++ b/mojo/docs/manual/values/lifetimes.mdx @@ -424,8 +424,8 @@ for i in range(len(nums)): ``` (You can find the code for the -`List` iterator in the [Mojo -repo](https://github.com/modular/mojo/blob/main/stdlib/src/collections/list.mojo#L63).) +`List` iterator in the [public +repo](https://github.com/modular/max/blob/main/mojo/stdlib/src/collections/list.mojo#L63).) #### Parametric mutability of return values diff --git a/mojo/docs/roadmap.md b/mojo/docs/roadmap.md index 05e5bf94da..754c0acdc7 100644 --- a/mojo/docs/roadmap.md +++ b/mojo/docs/roadmap.md @@ -29,7 +29,7 @@ In the near-term, we will **not** prioritize "general goodness" work such as: - Tackling broad Python ecosystem challenges like packaging. If you have encountered any bugs with current Mojo behavior, please -[submit an issue on GitHub](https://github.com/modular/mojo/issues). +[submit an issue on GitHub](https://github.com/modular/max/issues). If you have ideas about how to improve the core Mojo features, we prefer that you first look for similar topics or start a new conversation about it @@ -148,7 +148,7 @@ When we get here, we will discuss what the right default is: for example, is full Python hash-table dynamism the default? Or do we use a more efficient model by default (e.g. vtable-based dispatch and explicitly declared stored properties) and allow opt'ing into dynamism with a `@dynamic` decorator on the -class. More discussion is [in this proposal](https://github.com/modular/mojo/blob/main/proposals/mojo-and-dynamism.md). +class. More discussion is [in this proposal](https://github.com/modular/max/blob/main/mojo/proposals/mojo-and-dynamism.md). ## C/C++ Interop diff --git a/mojo/docs/tools/debugging.mdx b/mojo/docs/tools/debugging.mdx index 2a761c6f88..50befddbed 100644 --- a/mojo/docs/tools/debugging.mdx +++ b/mojo/docs/tools/debugging.mdx @@ -24,9 +24,9 @@ in VS Code. There are several ways to start a debug session in VS Code. -To start debugging, you'll need to have a Mojo project to debug. There are -a number of examples ranging from simple to complex in the [Mojo repo on -GitHub](https://github.com/modular/mojo). +To start debugging, you'll need to have a Mojo project to debug. There are a +number of examples ranging from simple to complex in [our GitHub +repo](https://github.com/modular/max/tree/main/examples/mojo). :::note **VS Code veteran?** diff --git a/mojo/docs/tools/testing.mdx b/mojo/docs/tools/testing.mdx index 34dc575ce1..8861c554fe 100644 --- a/mojo/docs/tools/testing.mdx +++ b/mojo/docs/tools/testing.mdx @@ -2,7 +2,7 @@ title: Testing sidebar_position: 2 description: Testing Mojo programs. -github_url: https://github.com/modular/mojo/tree/main/examples/testing +github_url: https://github.com/modular/max/tree/main/examples/mojo/testing --- Mojo includes a framework for developing and executing unit tests. The Mojo @@ -96,9 +96,8 @@ its error message. organize them into test files. - [The `mojo test` command](#the-mojo-test-command) describes how to execute and collect lists of tests. -- The public [GitHub repo](https://github.com/modular/mojo/tree/main) contains - an [example - project](https://github.com/modular/mojo/tree/main/examples/testing) to +- Our GitHub repo contains an [example + project](https://github.com/modular/max/tree/main/examples/mojo/testing) to demonstrate unit testing. Several of the examples shown later are based on this project. @@ -291,7 +290,7 @@ the following: If needed, you can optionally use the `-I` option one or more times to append additional paths to the list of directories searched to import Mojo modules and packages. Consider the [example testing -project](https://github.com/modular/mojo/tree/main/examples/testing) in +project](https://github.com/modular/max/tree/main/examples/mojo/testing) in GitHub, which has the following directory structure: ```output @@ -363,7 +362,7 @@ By including the `--collect-only` or `--co` option, you can use `mojo test` to discover and print a list of tests. Consider the [example testing -project](https://github.com/modular/mojo/tree/main/examples/testing) +project](https://github.com/modular/max/tree/main/examples/mojo/testing) directory structure shown in the [Running tests](#running-tests) section. The following command produces a list of all of the tests defined in the `test` directory hierarchy. @@ -434,7 +433,7 @@ output shown): You can also produce JSON output for test collection as well. Consider the [example testing -project](https://github.com/modular/mojo/tree/main/examples/testing) +project](https://github.com/modular/max/tree/main/examples/mojo/testing) directory structure shown in the [Running tests](#running-tests) section. The following command collects a list in JSON format of all of the tests defined in the `test` directory hierarchy: From e9be43eb64d6899e0fa54b1af5b29f86695e9ce7 Mon Sep 17 00:00:00 2001 From: kcaverly Date: Thu, 27 Feb 2025 12:08:06 -0500 Subject: [PATCH 20/44] [Pipelines] Refactor next_token to return dict[str, TextGenerationResponse] This PR refactors the `next_token` interface to enable variable token length responses from the pipeline on a per-request basis. Instead of returning a `list[dict[str, TextResponse]]` and implicitly identifying request completion based on the keys returned in the dictionary. This PR refactors `next_token` to return a `dict[str, TextGenerationResponse]`, in which the dictionary keys align with the request ids provided. The newly introduced `TextGenerationResponse` includes variable token length arrays, and explicitly states the final status (`TextGenerationStatus`: ACTIVE, MAXIMUM_LENGTH, or END_OF_SEQUENCE).This hardens our interface to completion tracking, enables more complex decoding strategies, and provides the server the opportunity to provide a corrected `finish_reason`. MODULAR_ORIG_COMMIT_REV_ID: fa8c7ff5af9470d25d3f86c966c633f783cc37ec --- src/max/entrypoints/cli/generate.py | 30 +++++----- src/max/pipelines/hf_pipeline.py | 29 +++++++--- src/max/pipelines/interfaces/response.py | 20 +++++-- .../pipelines/interfaces/text_generation.py | 4 +- src/max/pipelines/pipeline.py | 56 ++++++++++++------- 5 files changed, 89 insertions(+), 50 deletions(-) diff --git a/src/max/entrypoints/cli/generate.py b/src/max/entrypoints/cli/generate.py index 97718673a8..ec90472b7c 100644 --- a/src/max/entrypoints/cli/generate.py +++ b/src/max/entrypoints/cli/generate.py @@ -76,22 +76,22 @@ async def stream_text_to_console( num_steps=num_steps, ) - for response in responses: - if req_id not in response: - # next_token is expected to omit the return if - # it encounters eos. + for request_idx, response in responses.items(): + if response.is_done: generate_again = False - break - - encoded_text = response[req_id].next_token - response_text = await tokenizer.decode(context, encoded_text) - if metrics: - if first_token: - first_token = False - metrics.signpost("first_token") - metrics.new_token() - if print_tokens: - print(response_text, end="", flush=True) + + for text_response in response.tokens: + encoded_text = text_response.next_token + response_text = await tokenizer.decode( + context, encoded_text + ) + if metrics: + if first_token: + first_token = False + metrics.signpost("first_token") + metrics.new_token() + if print_tokens: + print(response_text, end="", flush=True) # Yield to the event loop. If at no other point (e.g. # tokenizer.decode which we await earlier does not yield to the diff --git a/src/max/pipelines/hf_pipeline.py b/src/max/pipelines/hf_pipeline.py index 52f25f6985..ff252ceec0 100644 --- a/src/max/pipelines/hf_pipeline.py +++ b/src/max/pipelines/hf_pipeline.py @@ -34,6 +34,8 @@ from .interfaces import ( EmbeddingsGenerator, EmbeddingsResponse, + TextGenerationResponse, + TextGenerationStatus, TextResponse, TokenGenerator, ) @@ -119,7 +121,7 @@ def __init__( def next_token( self, batch: dict[str, TextContext], num_steps: int - ) -> list[dict[str, TextResponse]]: + ) -> dict[str, TextGenerationResponse]: """Provided a batch, process batch inputs, execute the graph for num_steps in a multi-step scenario, then decode the tokens holistically and return the list of decoded tokens. """ @@ -183,8 +185,10 @@ def next_token( generated_tokens = generated_tokens.cpu() # Prepare the response, pruning away completed requests as we go. - res: list[dict[str, TextResponse]] = [{} for i in range(num_steps)] + res: dict[str, TextGenerationResponse] = {} for batch_idx, (request_id, context) in enumerate(batch.items()): + status = TextGenerationStatus.ACTIVE + res[request_id] = TextGenerationResponse([], status) for step in range(num_steps): next_token_id = generated_tokens[batch_idx, step].item() @@ -200,13 +204,22 @@ def next_token( if context.max_length is None else context.max_length ) - if ( - next_token_id in self._eos_token_id - or context.current_length > max_length - ): - break - res[step][request_id] = TextResponse(next_token) + if next_token_id in self._eos_token_id: + status = TextGenerationStatus.END_OF_SEQUENCE + res[request_id].update_status(status) + elif context.current_length > max_length: + status = TextGenerationStatus.MAXIMUM_LENGTH + res[request_id].update_status(status) + elif context.current_length == max_length: + res[request_id].append_token(TextResponse(next_token)) + status = TextGenerationStatus.MAXIMUM_LENGTH + res[request_id].update_status(status) + else: + res[request_id].append_token(TextResponse(next_token)) + + if status.is_done: + break return res diff --git a/src/max/pipelines/interfaces/response.py b/src/max/pipelines/interfaces/response.py index 45808c9d72..573326871b 100644 --- a/src/max/pipelines/interfaces/response.py +++ b/src/max/pipelines/interfaces/response.py @@ -117,11 +117,23 @@ class TextGenerationResponse: def __init__( self, tokens: list[TextResponse], final_status: TextGenerationStatus ) -> None: - self.tokens = tokens - self.final_status = final_status + self._tokens = tokens + self._final_status = final_status + @property def is_done(self) -> bool: - return self.final_status.is_done + return self._final_status.is_done + + @property + def tokens(self) -> list[TextResponse]: + return self._tokens + + @property + def final_status(self) -> TextGenerationStatus: + return self._final_status def append_token(self, token: TextResponse) -> None: - self.tokens.append(token) + self._tokens.append(token) + + def update_status(self, status: TextGenerationStatus) -> None: + self._final_status = status diff --git a/src/max/pipelines/interfaces/text_generation.py b/src/max/pipelines/interfaces/text_generation.py index ac7b64d1c7..e329e0829b 100644 --- a/src/max/pipelines/interfaces/text_generation.py +++ b/src/max/pipelines/interfaces/text_generation.py @@ -28,7 +28,7 @@ runtime_checkable, ) -from .response import TextResponse +from .response import TextGenerationResponse class TokenGeneratorRequestFunction(TypedDict): @@ -258,7 +258,7 @@ class TokenGenerator(Generic[TokenGeneratorContext], Protocol): def next_token( self, batch: dict[str, TokenGeneratorContext], num_steps: int - ) -> list[dict[str, TextResponse]]: + ) -> dict[str, TextGenerationResponse]: """Computes the next token response for a single batch. Args: diff --git a/src/max/pipelines/pipeline.py b/src/max/pipelines/pipeline.py index b42e9b7f48..d1c951a3ab 100644 --- a/src/max/pipelines/pipeline.py +++ b/src/max/pipelines/pipeline.py @@ -42,7 +42,13 @@ from .config import PipelineConfig from .context import InputContext -from .interfaces import LogProbabilities, TextResponse, TokenGenerator +from .interfaces import ( + LogProbabilities, + TextGenerationResponse, + TextGenerationStatus, + TextResponse, + TokenGenerator, +) from .kv_cache import KVCacheManager, KVCacheParams from .sampling import token_sampler @@ -565,7 +571,7 @@ def next_token( self, batch: dict[str, T], num_steps: int, - ) -> list[dict[str, TextResponse]]: + ) -> dict[str, TextGenerationResponse]: """Provided a batch, process batch inputs, execute the graph for num_steps in a multi-step scenario, then decode the tokens holistically and return the list of decoded tokens. """ @@ -695,11 +701,12 @@ def next_token( tracer.pop() # pops kv_manager.step # Prepare the response, pruning away completed requests as we go. - res: list[dict[str, TextResponse]] = [{} for _ in range(num_steps)] + res: dict[str, TextGenerationResponse] = {} tracer.push("prepare_response") for batch_index, (request_id, context) in enumerate(batch.items()): - step = 0 - while step < num_steps: + status = TextGenerationStatus.ACTIVE + res[request_id] = TextGenerationResponse([], status) + for step in range(num_steps): # Convert to a Python scalar to improve serialization performance. next_token = int(generated_tokens_host[batch_index, step]) @@ -715,19 +722,6 @@ def next_token( default=context.max_length, ) - # The current length is incremented above, during context.update - # As such, if we are already at the max length, exiting here - # would cause us to miss updating the request. - # As such, we overrun here by 1, ensuring that the context object - # tracks special tokens like eos_token_id appropriately for benchmarking - # and other uses, but that they are not returned in the request. - if ( - next_token in self._eos_token_id - or context.current_length > max_length - ): - step += 1 - break - # Set up TextResponse log_probs: Optional[LogProbabilities] = None if compute_log_probabilities and ( @@ -735,10 +729,30 @@ def next_token( ): log_probs = log_probs_for_step[batch_index] - # Removing the positional arguments here, go about 100us faster. - res[step][request_id] = TextResponse(next_token, log_probs) + # Update status + # If its eos, dont add it to the token array. + if next_token in self._eos_token_id: + status = TextGenerationStatus.END_OF_SEQUENCE + res[request_id].update_status(status) + elif context.current_length == max_length: + status = TextGenerationStatus.MAXIMUM_LENGTH + res[request_id].append_token( + TextResponse(next_token, log_probs) + ) + res[request_id].update_status(status) + # This practically, should not be hit, as once the context object + # reaches the max_length, we should break from this current loop. + # TODO: Explore cleaning up max length checks. + elif context.current_length > max_length: + status = TextGenerationStatus.MAXIMUM_LENGTH + res[request_id].update_status(status) + else: + res[request_id].append_token( + TextResponse(next_token, log_probs) + ) - step += 1 + if status.is_done: + break return res From ab72aae5ae7e363837ad6f135ac8c5516ff55059 Mon Sep 17 00:00:00 2001 From: Patrick Dougherty Date: Thu, 27 Feb 2025 12:09:37 -0600 Subject: [PATCH 21/44] [CI] Add pre-commit-config to internal source of truth MODULAR_ORIG_COMMIT_REV_ID: 14e2678c27e07378a49cdfcae41feae5b7c27fb6 --- .pre-commit-config.yaml | 26 +++++++++++++++++++++++++ mojo/stdlib/scripts/check-docstrings.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..b04addfbb6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,26 @@ +repos: + - repo: local + hooks: + - id: mojo-format + name: mojo-format + entry: mojo format mojo + language: system + files: '\.(mojo|🔥|py)$' + stages: [commit] + - id: check-docstrings + name: check-docstrings + entry: python3 ./mojo/stdlib/scripts/check-docstrings.py + language: system + pass_filenames: false + stages: [commit] + - id: check-license + name: check-license + entry: mojo mojo/stdlib/scripts/check_licenses.mojo + language: system + files: '\.(mojo|🔥|py)$' + stages: [commit] + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.40.0 + hooks: + - id: markdownlint + args: ['--config', 'mojo/stdlib/scripts/.markdownlint.yaml', '--fix'] diff --git a/mojo/stdlib/scripts/check-docstrings.py b/mojo/stdlib/scripts/check-docstrings.py index ddba7bb42c..1eb77ea27e 100644 --- a/mojo/stdlib/scripts/check-docstrings.py +++ b/mojo/stdlib/scripts/check-docstrings.py @@ -27,7 +27,7 @@ def main(): "--diagnose-missing-doc-strings", "-o", "/dev/null", - "./stdlib/src", + "./mojo/stdlib/src", ] result = subprocess.run(command, capture_output=True) if result.stderr or result.returncode != 0: From 99bbe159934c260bd1aa77e997a89d1c3d287e3b Mon Sep 17 00:00:00 2001 From: modularbot Date: Thu, 27 Feb 2025 22:33:19 +0000 Subject: [PATCH 22/44] [Release] Update lockfiles to point to latest nightly version: 25.2.0.dev2025022718 --- examples/custom_ops/magic.lock | 2182 ++++ examples/gpu_functions/magic.lock | 2182 ++++ examples/graph-api/magic.lock | 2182 ++++ .../inference/bert-c-torchscript/magic.lock | 7455 ++++++++++++++ .../bert-mojo-torchscript/magic.lock | 7480 ++++++++++++++ .../bert-python-torchscript/magic.lock | 7480 ++++++++++++++ .../resnet50-python-torchscript/magic.lock | 8098 +++++++++++++++ .../stable-diffusion-mojo-onnx/magic.lock | 8173 +++++++++++++++ .../stable-diffusion-python-onnx/magic.lock | 8272 +++++++++++++++ .../inference/yolo-python-onnx/magic.lock | 2220 ++++ examples/mojo/life/magic.lock | 5402 ++++++++++ examples/mojo/magic.lock | 2185 ++++ examples/mojo/operators/magic.lock | 2182 ++++ examples/mojo/testing/magic.lock | 2182 ++++ examples/notebooks/magic.lock | 7828 +++----------- examples/offline-inference/magic.lock | 9001 +++++++++++++++++ mojo/magic.lock | 2194 ++++ src/max/magic.lock | 9001 +++++++++++++++++ tutorials/hello-magic/local/magic.lock | 2333 +++++ tutorials/hello-magic/magic.lock | 2901 ++++++ tutorials/max-graph-api/magic.lock | 4414 ++++++++ 21 files changed, 99104 insertions(+), 6243 deletions(-) create mode 100644 examples/custom_ops/magic.lock create mode 100644 examples/gpu_functions/magic.lock create mode 100644 examples/graph-api/magic.lock create mode 100644 examples/inference/bert-c-torchscript/magic.lock create mode 100644 examples/inference/bert-mojo-torchscript/magic.lock create mode 100644 examples/inference/bert-python-torchscript/magic.lock create mode 100644 examples/inference/resnet50-python-torchscript/magic.lock create mode 100644 examples/inference/stable-diffusion-mojo-onnx/magic.lock create mode 100644 examples/inference/stable-diffusion-python-onnx/magic.lock create mode 100644 examples/inference/yolo-python-onnx/magic.lock create mode 100644 examples/mojo/life/magic.lock create mode 100644 examples/mojo/magic.lock create mode 100644 examples/mojo/operators/magic.lock create mode 100644 examples/mojo/testing/magic.lock create mode 100644 examples/offline-inference/magic.lock create mode 100644 mojo/magic.lock create mode 100644 src/max/magic.lock create mode 100644 tutorials/hello-magic/local/magic.lock create mode 100644 tutorials/hello-magic/magic.lock create mode 100644 tutorials/max-graph-api/magic.lock diff --git a/examples/custom_ops/magic.lock b/examples/custom_ops/magic.lock new file mode 100644 index 0000000000..9473097321 --- /dev/null +++ b/examples/custom_ops/magic.lock @@ -0,0 +1,2182 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/gpu_functions/magic.lock b/examples/gpu_functions/magic.lock new file mode 100644 index 0000000000..9473097321 --- /dev/null +++ b/examples/gpu_functions/magic.lock @@ -0,0 +1,2182 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/graph-api/magic.lock b/examples/graph-api/magic.lock new file mode 100644 index 0000000000..9473097321 --- /dev/null +++ b/examples/graph-api/magic.lock @@ -0,0 +1,2182 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/inference/bert-c-torchscript/magic.lock b/examples/inference/bert-c-torchscript/magic.lock new file mode 100644 index 0000000000..d732b1f8d7 --- /dev/null +++ b/examples/inference/bert-c-torchscript/magic.lock @@ -0,0 +1,7455 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + indexes: + - https://pypi.org/simple + - https://download.pytorch.org/whl/cpu + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.6-h74e3db0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-3.31.6-h0efca9c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.5-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_1.conda + - pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + - pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + - pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + - pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + - pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + - pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + - pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.31.6-ha25475f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.5-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=compressed-mapping + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.6-h74e3db0_0.conda + sha256: 82372b404995a92fecfef38e9f1cb4977e71b785a728db5a9ed6f1aec49d547c + md5: d6e0e094315ee3e99ca153663e7fa669 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.12.1,<9.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.5,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20376244 + timestamp: 1740467420604 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-3.31.6-h0efca9c_0.conda + sha256: fa894bf2306b4db3fde630b66a9c052dfcde7ec9f876e86fc555b86c21c97063 + md5: f3ec9663b69f8ac9315ff08d847a0e00 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.12.1,<9.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.5,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19859434 + timestamp: 1740467090575 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.31.6-ha25475f_0.conda + sha256: d71e84b6b7000323d2a394c3e01cfd35df3421741e8b4af7852e8400c2604574 + md5: 3a3bbf1de0a6d99658f4c1b63ad40d21 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.12.1,<9.0a0 + - libcxx >=18 + - libexpat >=2.6.4,<3.0a0 + - liblzma >=5.6.4,<6.0a0 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.5,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16507414 + timestamp: 1740467905288 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + sha256: 06109a3de7a977424d960b75cdb307f8d769eae87c53e33a64e706171199997a + md5: c2f904077afe3a8246c26576f555a6af + depends: + - aiohttp + - dill >=0.3.0,<0.3.9 + - filelock + - fsspec >=2023.1.0,<=2024.12.0 + - huggingface_hub >=0.24.0 + - multiprocess <0.70.17 + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=15.0.0 + - python >=3.9 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.32.2 + - tqdm >=4.66.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 335311 + timestamp: 1740153561620 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 78745f157d56877a2c6e7b386f66f3e2 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 88169 + timestamp: 1706434833883 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + sha256: f75ca9436fe11d0def6e575d29e0614033c45c90f37895a3b2bb3536612b251c + md5: 0bbbf72b600a1df32666a084769bf240 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=compressed-mapping + size: 287974 + timestamp: 1740068383431 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + name: jinja2 + version: 3.1.4 + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + purls: [] + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + purls: [] + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + purls: [] + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + sha256: b4a8890023902aef9f1f33e3e35603ad9c2f16c21fdb58e968fa6c1bd3e94c0b + md5: 771ee65e13bc599b0b62af5359d80169 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 891272 + timestamp: 1737016632446 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda + sha256: 67914c7f171d343059144d804c2f17fcd621a94e45f179a0fd843b8c1618823e + md5: 915db044076cbbdffb425170deb4ce38 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 621056 + timestamp: 1737016626950 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + sha256: d13fb49d4c8262bf2c44ffb2c77bb2b5d0f85fc6de76bdb75208efeccb29fce6 + md5: 20717343fb30798ab7c23c2e92b748c1 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 418890 + timestamp: 1737016751326 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + name: markupsafe + version: 2.1.5 + sha256: ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + sha256: 459092c4e9305e00a0207b764a266c9caa14d82196322b2a74c96028c563a809 + md5: efe4a3f62320156f68579362314009f3 + depends: + - __glibc >=2.17,<3.0.a0 + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 340540 + timestamp: 1724954755987 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + sha256: f93627c78d1f86f593350196699b462c334542477aa55fe0212edf45392c9ab4 + md5: 642c63b684ce5614f157572b04816983 + depends: + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 341428 + timestamp: 1724954862644 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + sha256: d19a1c8b3fd44414657066becba960143e7115a385fb71b941f7e9c74f066a32 + md5: fd83a478d686df79aa394b9db1ad20b5 + depends: + - __osx >=11.0 + - dill >=0.3.8 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 342831 + timestamp: 1724954807776 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + name: networkx + version: '3.3' + sha256: 28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + requires_dist: + - numpy>=1.23 ; extra == 'default' + - scipy>=1.9,!=1.11.0,!=1.11.1 ; extra == 'default' + - matplotlib>=3.6 ; extra == 'default' + - pandas>=1.4 ; extra == 'default' + - changelist==0.5 ; extra == 'developer' + - pre-commit>=3.2 ; extra == 'developer' + - mypy>=1.1 ; extra == 'developer' + - rtoml ; extra == 'developer' + - sphinx>=7 ; extra == 'doc' + - pydata-sphinx-theme>=0.14 ; extra == 'doc' + - sphinx-gallery>=0.14 ; extra == 'doc' + - numpydoc>=1.7 ; extra == 'doc' + - pillow>=9.4 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - myst-nb>=1.0 ; extra == 'doc' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.12 ; extra == 'extra' + - pydot>=2.0 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + purls: [] + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=compressed-mapping + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.5-hb9d3cd8_0.conda + sha256: 04677caac29ec64a5d41d0cca8dbec5f60fa166d5458ff5a4393e4dc08a4799e + md5: 9af0e7981755f09c81421946c4bcea04 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 186921 + timestamp: 1728886721623 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.5-h86ecc28_0.conda + sha256: 82f3555c8f4fa76faf111622766457a8d17755bf493c0ac72ee59f4dad71d994 + md5: 93bac703d92dafc337db454e6e93a520 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 201958 + timestamp: 1728886717057 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.5-h7ab814d_0.conda + sha256: e6a3e9dbfcb5ad5d69a20c8ac237d37a282a95983314a28912fc54208c5db391 + md5: 352b210f81798ae1e2f25a98ef4b3b54 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 177240 + timestamp: 1728886815751 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=hash-mapping + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + name: setuptools + version: 70.2.0 + sha256: b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest>=6,!=8.1.* ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.10.0 ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35857 + timestamp: 1733502172664 +- pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + name: sympy + version: 1.13.1 + sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 1931389 + timestamp: 1732734727624 +- pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + name: torch + version: 2.5.1 + sha256: 36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - sympy==1.12.1 ; python_full_version == '3.8.*' + - setuptools ; python_full_version >= '3.12' + - sympy==1.13.1 ; python_full_version >= '3.9' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.12.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/transformers?source=hash-mapping + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda + sha256: 8cd972048f297b8e0601158ce352f5ca9510dda9f2706a46560220aa58b9f038 + md5: 92cdb6fe54b78739ad70637e4f0deb07 + depends: + - brotli-python >=1.0.9 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 95016 + timestamp: 1718653149133 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + sha256: 532d3623961e34c53aba98db2ad0a33b7a52ff90d6960e505fb2d2efc06bb7da + md5: 02e4e2fa41a6528afba2e54cbc4280ff + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 567419 + timestamp: 1740255350233 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_1.conda + sha256: a8e9a9e19ec3778594d9746e308cdba096f3019c0c0a62f552d0d299b35c343f + md5: d98196f3502425e14f82bdfc8eb4ae27 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 550364 + timestamp: 1740255370714 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_1.conda + sha256: f49bbeeb3a8ead81920e6c695fff1260cbd221e2cfcdf9fb34207260fbd60816 + md5: 66e5c4b02aa97230459efdd4f64c8ce6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 399981 + timestamp: 1740255382232 diff --git a/examples/inference/bert-mojo-torchscript/magic.lock b/examples/inference/bert-mojo-torchscript/magic.lock new file mode 100644 index 0000000000..092e126f9f --- /dev/null +++ b/examples/inference/bert-mojo-torchscript/magic.lock @@ -0,0 +1,7480 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + indexes: + - https://pypi.org/simple + - https://download.pytorch.org/whl/cpu + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + - pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + - pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + - pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + - pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + - pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + - pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + - pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=compressed-mapping + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + sha256: 06109a3de7a977424d960b75cdb307f8d769eae87c53e33a64e706171199997a + md5: c2f904077afe3a8246c26576f555a6af + depends: + - aiohttp + - dill >=0.3.0,<0.3.9 + - filelock + - fsspec >=2023.1.0,<=2024.12.0 + - huggingface_hub >=0.24.0 + - multiprocess <0.70.17 + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=15.0.0 + - python >=3.9 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.32.2 + - tqdm >=4.66.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 335311 + timestamp: 1740153561620 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 78745f157d56877a2c6e7b386f66f3e2 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 88169 + timestamp: 1706434833883 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + sha256: f75ca9436fe11d0def6e575d29e0614033c45c90f37895a3b2bb3536612b251c + md5: 0bbbf72b600a1df32666a084769bf240 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=compressed-mapping + size: 287974 + timestamp: 1740068383431 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + name: jinja2 + version: 3.1.4 + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + purls: [] + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + purls: [] + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + purls: [] + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + name: markupsafe + version: 2.1.5 + sha256: ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + sha256: 459092c4e9305e00a0207b764a266c9caa14d82196322b2a74c96028c563a809 + md5: efe4a3f62320156f68579362314009f3 + depends: + - __glibc >=2.17,<3.0.a0 + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 340540 + timestamp: 1724954755987 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + sha256: f93627c78d1f86f593350196699b462c334542477aa55fe0212edf45392c9ab4 + md5: 642c63b684ce5614f157572b04816983 + depends: + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 341428 + timestamp: 1724954862644 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + sha256: d19a1c8b3fd44414657066becba960143e7115a385fb71b941f7e9c74f066a32 + md5: fd83a478d686df79aa394b9db1ad20b5 + depends: + - __osx >=11.0 + - dill >=0.3.8 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 342831 + timestamp: 1724954807776 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + name: networkx + version: '3.3' + sha256: 28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + requires_dist: + - numpy>=1.23 ; extra == 'default' + - scipy>=1.9,!=1.11.0,!=1.11.1 ; extra == 'default' + - matplotlib>=3.6 ; extra == 'default' + - pandas>=1.4 ; extra == 'default' + - changelist==0.5 ; extra == 'developer' + - pre-commit>=3.2 ; extra == 'developer' + - mypy>=1.1 ; extra == 'developer' + - rtoml ; extra == 'developer' + - sphinx>=7 ; extra == 'doc' + - pydata-sphinx-theme>=0.14 ; extra == 'doc' + - sphinx-gallery>=0.14 ; extra == 'doc' + - numpydoc>=1.7 ; extra == 'doc' + - pillow>=9.4 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - myst-nb>=1.0 ; extra == 'doc' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.12 ; extra == 'extra' + - pydot>=2.0 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + purls: [] + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=compressed-mapping + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=hash-mapping + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + name: setuptools + version: 70.2.0 + sha256: b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest>=6,!=8.1.* ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.10.0 ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35857 + timestamp: 1733502172664 +- pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + name: sympy + version: 1.13.1 + sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 1931389 + timestamp: 1732734727624 +- pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + name: torch + version: 2.5.1 + sha256: 36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - sympy==1.12.1 ; python_full_version == '3.8.*' + - setuptools ; python_full_version >= '3.12' + - sympy==1.13.1 ; python_full_version >= '3.9' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.12.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/transformers?source=hash-mapping + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 405089 + timestamp: 1714723101397 diff --git a/examples/inference/bert-python-torchscript/magic.lock b/examples/inference/bert-python-torchscript/magic.lock new file mode 100644 index 0000000000..092e126f9f --- /dev/null +++ b/examples/inference/bert-python-torchscript/magic.lock @@ -0,0 +1,7480 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + indexes: + - https://pypi.org/simple + - https://download.pytorch.org/whl/cpu + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + - pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + - pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + - pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + - pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + - pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + - pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + - pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=compressed-mapping + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + sha256: 06109a3de7a977424d960b75cdb307f8d769eae87c53e33a64e706171199997a + md5: c2f904077afe3a8246c26576f555a6af + depends: + - aiohttp + - dill >=0.3.0,<0.3.9 + - filelock + - fsspec >=2023.1.0,<=2024.12.0 + - huggingface_hub >=0.24.0 + - multiprocess <0.70.17 + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=15.0.0 + - python >=3.9 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.32.2 + - tqdm >=4.66.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 335311 + timestamp: 1740153561620 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 78745f157d56877a2c6e7b386f66f3e2 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 88169 + timestamp: 1706434833883 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + sha256: f75ca9436fe11d0def6e575d29e0614033c45c90f37895a3b2bb3536612b251c + md5: 0bbbf72b600a1df32666a084769bf240 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=compressed-mapping + size: 287974 + timestamp: 1740068383431 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + name: jinja2 + version: 3.1.4 + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + purls: [] + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + purls: [] + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + purls: [] + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + name: markupsafe + version: 2.1.5 + sha256: ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + sha256: 459092c4e9305e00a0207b764a266c9caa14d82196322b2a74c96028c563a809 + md5: efe4a3f62320156f68579362314009f3 + depends: + - __glibc >=2.17,<3.0.a0 + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 340540 + timestamp: 1724954755987 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + sha256: f93627c78d1f86f593350196699b462c334542477aa55fe0212edf45392c9ab4 + md5: 642c63b684ce5614f157572b04816983 + depends: + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 341428 + timestamp: 1724954862644 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + sha256: d19a1c8b3fd44414657066becba960143e7115a385fb71b941f7e9c74f066a32 + md5: fd83a478d686df79aa394b9db1ad20b5 + depends: + - __osx >=11.0 + - dill >=0.3.8 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 342831 + timestamp: 1724954807776 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + name: networkx + version: '3.3' + sha256: 28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + requires_dist: + - numpy>=1.23 ; extra == 'default' + - scipy>=1.9,!=1.11.0,!=1.11.1 ; extra == 'default' + - matplotlib>=3.6 ; extra == 'default' + - pandas>=1.4 ; extra == 'default' + - changelist==0.5 ; extra == 'developer' + - pre-commit>=3.2 ; extra == 'developer' + - mypy>=1.1 ; extra == 'developer' + - rtoml ; extra == 'developer' + - sphinx>=7 ; extra == 'doc' + - pydata-sphinx-theme>=0.14 ; extra == 'doc' + - sphinx-gallery>=0.14 ; extra == 'doc' + - numpydoc>=1.7 ; extra == 'doc' + - pillow>=9.4 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - myst-nb>=1.0 ; extra == 'doc' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.12 ; extra == 'extra' + - pydot>=2.0 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + purls: [] + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=compressed-mapping + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=hash-mapping + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + name: setuptools + version: 70.2.0 + sha256: b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest>=6,!=8.1.* ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.10.0 ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35857 + timestamp: 1733502172664 +- pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + name: sympy + version: 1.13.1 + sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 1931389 + timestamp: 1732734727624 +- pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + name: torch + version: 2.5.1 + sha256: 36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - sympy==1.12.1 ; python_full_version == '3.8.*' + - setuptools ; python_full_version >= '3.12' + - sympy==1.13.1 ; python_full_version >= '3.9' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.12.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/transformers?source=hash-mapping + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 405089 + timestamp: 1714723101397 diff --git a/examples/inference/resnet50-python-torchscript/magic.lock b/examples/inference/resnet50-python-torchscript/magic.lock new file mode 100644 index 0000000000..87999c426a --- /dev/null +++ b/examples/inference/resnet50-python-torchscript/magic.lock @@ -0,0 +1,8098 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + indexes: + - https://pypi.org/simple + - https://download.pytorch.org/whl/cpu + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + - pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + - pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + - pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + - pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + - pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + - pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=compressed-mapping + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + sha256: 06109a3de7a977424d960b75cdb307f8d769eae87c53e33a64e706171199997a + md5: c2f904077afe3a8246c26576f555a6af + depends: + - aiohttp + - dill >=0.3.0,<0.3.9 + - filelock + - fsspec >=2023.1.0,<=2024.12.0 + - huggingface_hub >=0.24.0 + - multiprocess <0.70.17 + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=15.0.0 + - python >=3.9 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.32.2 + - tqdm >=4.66.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 335311 + timestamp: 1740153561620 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 78745f157d56877a2c6e7b386f66f3e2 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 88169 + timestamp: 1706434833883 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + purls: [] + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + purls: [] + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + purls: [] + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + sha256: f75ca9436fe11d0def6e575d29e0614033c45c90f37895a3b2bb3536612b251c + md5: 0bbbf72b600a1df32666a084769bf240 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=compressed-mapping + size: 287974 + timestamp: 1740068383431 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + name: jinja2 + version: 3.1.4 + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + sha256: 47cf6a4780dc41caa9bc95f020eed485b07010c9ccc85e9ef44b538fedb5341d + md5: b87b1abd2542cf65a00ad2e2461a3083 + depends: + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287007 + timestamp: 1739161069194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + purls: [] + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + purls: [] + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + purls: [] + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + sha256: 3861a65106a5f876eff3fc19042c3edb528216114b9f8e64b37aebf003deda11 + md5: c4b1ba0d7cef5002759d2f156722feee + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + purls: [] + size: 291536 + timestamp: 1739957375872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + purls: [] + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + purls: [] + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + purls: [] + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + purls: [] + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + purls: [] + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + name: markupsafe + version: 2.1.5 + sha256: ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + sha256: 459092c4e9305e00a0207b764a266c9caa14d82196322b2a74c96028c563a809 + md5: efe4a3f62320156f68579362314009f3 + depends: + - __glibc >=2.17,<3.0.a0 + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 340540 + timestamp: 1724954755987 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + sha256: f93627c78d1f86f593350196699b462c334542477aa55fe0212edf45392c9ab4 + md5: 642c63b684ce5614f157572b04816983 + depends: + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 341428 + timestamp: 1724954862644 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py312h024a12e_1.conda + sha256: d19a1c8b3fd44414657066becba960143e7115a385fb71b941f7e9c74f066a32 + md5: fd83a478d686df79aa394b9db1ad20b5 + depends: + - __osx >=11.0 + - dill >=0.3.8 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 342831 + timestamp: 1724954807776 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.1-pyhd8ed1ab_0.conda + sha256: 6b955c8530985fa727ad3323653a54af44ecf453cfdb1b549b3edff609bd3728 + md5: 254f787d5068bc89f578bf63893ce8b4 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/networkx?source=hash-mapping + size: 1459994 + timestamp: 1680693050542 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d + md5: 04231368e4af50d11184b50e14250993 + depends: + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 377796 + timestamp: 1733816683252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 + md5: d3894405f05b2c0f351d5de3ae26fa9c + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42749785 + timestamp: 1735929845390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + sha256: 7559556ffc44bda777f85c2e5acd6b5756fa5822c0271b329b7b9a3c6bb20349 + md5: 77e0ec0a6fc847d317f204aa15b59f6b + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: aarch64 + platform: linux + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41362848 + timestamp: 1735932311857 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee + md5: 94d6ba8cd468668a9fb04193b0f4b36e + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42852329 + timestamp: 1735930118976 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + purls: [] + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=compressed-mapping + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=hash-mapping + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + name: setuptools + version: 70.2.0 + sha256: b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest>=6,!=8.1.* ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.10.0 ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35857 + timestamp: 1733502172664 +- pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + name: sympy + version: 1.13.1 + sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 1931389 + timestamp: 1732734727624 +- pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + name: torch + version: 2.5.1 + sha256: 36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - sympy==1.12.1 ; python_full_version == '3.8.*' + - setuptools ; python_full_version >= '3.12' + - sympy==1.13.1 ; python_full_version >= '3.9' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.12.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/transformers?source=hash-mapping + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 405089 + timestamp: 1714723101397 diff --git a/examples/inference/stable-diffusion-mojo-onnx/magic.lock b/examples/inference/stable-diffusion-mojo-onnx/magic.lock new file mode 100644 index 0000000000..9220a3345d --- /dev/null +++ b/examples/inference/stable-diffusion-mojo-onnx/magic.lock @@ -0,0 +1,8173 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + indexes: + - https://pypi.org/simple + - https://download.pytorch.org/whl/cpu + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312h287a98d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py312hc0f7016_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + - pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + - pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + - pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + - pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + - pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + - pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + - pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h39b1d8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=compressed-mapping + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: 3e087f072ce03c43a9b60522f5d0ca2f + depends: + - aiohttp + - dill >=0.3.0,<0.3.8 + - fsspec >=2021.11.1 + - huggingface_hub >=0.14.0,<1.0.0 + - importlib-metadata + - multiprocess + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=8.0.0 + - python >=3.8.0 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.19.0 + - tqdm >=4.62.1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 347303 + timestamp: 1691593908658 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + sha256: 06109a3de7a977424d960b75cdb307f8d769eae87c53e33a64e706171199997a + md5: c2f904077afe3a8246c26576f555a6af + depends: + - aiohttp + - dill >=0.3.0,<0.3.9 + - filelock + - fsspec >=2023.1.0,<=2024.12.0 + - huggingface_hub >=0.24.0 + - multiprocess <0.70.17 + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=15.0.0 + - python >=3.9 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.32.2 + - tqdm >=4.66.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 335311 + timestamp: 1740153561620 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 5e4f3466526c52bc9af2d2353a1460bd + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 87553 + timestamp: 1690101185422 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 78745f157d56877a2c6e7b386f66f3e2 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 88169 + timestamp: 1706434833883 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + purls: [] + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + purls: [] + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + purls: [] + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + sha256: 7433b8469074985b651693778ec6f03d2a23fad9919a515e3b8545996b5e721a + md5: d9ea16b71920b03beafc17fcca16df90 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 138186 + timestamp: 1738501352608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + sha256: 000b32aa2b960fe1e39aecdd3e5b0eea0f9b1e9d622188c7bd8a6f86c244233d + md5: 9a8208360743187a5eabc2b2b05cb74f + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.8 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=hash-mapping + size: 259655 + timestamp: 1726154689209 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + name: jinja2 + version: 3.1.4 + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + sha256: 47cf6a4780dc41caa9bc95f020eed485b07010c9ccc85e9ef44b538fedb5341d + md5: b87b1abd2542cf65a00ad2e2461a3083 + depends: + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287007 + timestamp: 1739161069194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + purls: [] + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + purls: [] + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + purls: [] + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + sha256: 3861a65106a5f876eff3fc19042c3edb528216114b9f8e64b37aebf003deda11 + md5: c4b1ba0d7cef5002759d2f156722feee + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + purls: [] + size: 291536 + timestamp: 1739957375872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + purls: [] + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + purls: [] + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + purls: [] + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + purls: [] + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + purls: [] + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + name: markupsafe + version: 2.1.5 + sha256: ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + sha256: bb612a921fafda6375a2204ffebd8811db8dd3b8f25ac9886cc9bcbff7e3664e + md5: 5a64b9f44790d9a187a85366dd0ffa8d + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 335666 + timestamp: 1695459025249 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + sha256: f93627c78d1f86f593350196699b462c334542477aa55fe0212edf45392c9ab4 + md5: 642c63b684ce5614f157572b04816983 + depends: + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 341428 + timestamp: 1724954862644 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 + md5: 910ef2223c71902175418d9163152788 + depends: + - dill >=0.3.6 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 335147 + timestamp: 1695459275360 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + name: networkx + version: '3.3' + sha256: 28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + requires_dist: + - numpy>=1.23 ; extra == 'default' + - scipy>=1.9,!=1.11.0,!=1.11.1 ; extra == 'default' + - matplotlib>=3.6 ; extra == 'default' + - pandas>=1.4 ; extra == 'default' + - changelist==0.5 ; extra == 'developer' + - pre-commit>=3.2 ; extra == 'developer' + - mypy>=1.1 ; extra == 'developer' + - rtoml ; extra == 'developer' + - sphinx>=7 ; extra == 'doc' + - pydata-sphinx-theme>=0.14 ; extra == 'doc' + - sphinx-gallery>=0.14 ; extra == 'doc' + - numpydoc>=1.7 ; extra == 'doc' + - pillow>=9.4 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - myst-nb>=1.0 ; extra == 'doc' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.12 ; extra == 'extra' + - pydot>=2.0 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d + md5: 04231368e4af50d11184b50e14250993 + depends: + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 377796 + timestamp: 1733816683252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312h287a98d_1.conda + sha256: e1a2426f23535fc15e577d799685229a93117b645734e5cca60597bb23cef09e + md5: b1325cda3f250f9f842180607054e6ed + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41702764 + timestamp: 1718833930009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py312hc0f7016_1.conda + sha256: a55086ded25a27a0f6f7ec3bd82dfc6d594e7e119ad6a1e2dd9c449b4931e3e0 + md5: fe73c159f45d5660035ae21a3c799227 + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: aarch64 + platform: linux + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42558380 + timestamp: 1718835195362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h39b1d8d_1.conda + sha256: 37907cdfdb8765d26cb239098fcb053b0b55216945d8bedc9429023ba8db11ab + md5: 4d3a01b6c6df5cc761adb1f3da5b99c2 + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42691135 + timestamp: 1718834038233 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + purls: [] + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=compressed-mapping + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=hash-mapping + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + name: setuptools + version: 70.2.0 + sha256: b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest>=6,!=8.1.* ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.10.0 ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35857 + timestamp: 1733502172664 +- pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + name: sympy + version: 1.13.1 + sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 1931389 + timestamp: 1732734727624 +- pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + name: torch + version: 2.5.1 + sha256: 36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - sympy==1.12.1 ; python_full_version == '3.8.*' + - setuptools ; python_full_version >= '3.12' + - sympy==1.13.1 ; python_full_version >= '3.9' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.12.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/transformers?source=hash-mapping + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 405089 + timestamp: 1714723101397 diff --git a/examples/inference/stable-diffusion-python-onnx/magic.lock b/examples/inference/stable-diffusion-python-onnx/magic.lock new file mode 100644 index 0000000000..38419fcd65 --- /dev/null +++ b/examples/inference/stable-diffusion-python-onnx/magic.lock @@ -0,0 +1,8272 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + indexes: + - https://pypi.org/simple + - https://download.pytorch.org/whl/cpu + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/diffusers-0.27.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312h287a98d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py312hc0f7016_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + - pypi: https://files.pythonhosted.org/packages/75/c5/3b84fd731dd93c549a0c25657e4ce5a957aeccd32d60dba2958cd3cdac23/diffusers-0.27.2-py3-none-any.whl + - pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + - pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + - pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + - pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + - pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + - pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + - pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/diffusers-0.27.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h39b1d8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=compressed-mapping + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: 3e087f072ce03c43a9b60522f5d0ca2f + depends: + - aiohttp + - dill >=0.3.0,<0.3.8 + - fsspec >=2021.11.1 + - huggingface_hub >=0.14.0,<1.0.0 + - importlib-metadata + - multiprocess + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=8.0.0 + - python >=3.8.0 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.19.0 + - tqdm >=4.62.1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 347303 + timestamp: 1691593908658 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.3.2-pyhd8ed1ab_0.conda + sha256: 06109a3de7a977424d960b75cdb307f8d769eae87c53e33a64e706171199997a + md5: c2f904077afe3a8246c26576f555a6af + depends: + - aiohttp + - dill >=0.3.0,<0.3.9 + - filelock + - fsspec >=2023.1.0,<=2024.12.0 + - huggingface_hub >=0.24.0 + - multiprocess <0.70.17 + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=15.0.0 + - python >=3.9 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.32.2 + - tqdm >=4.66.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/datasets?source=hash-mapping + size: 335311 + timestamp: 1740153561620 +- pypi: https://files.pythonhosted.org/packages/75/c5/3b84fd731dd93c549a0c25657e4ce5a957aeccd32d60dba2958cd3cdac23/diffusers-0.27.2-py3-none-any.whl + name: diffusers + version: 0.27.2 + sha256: 85da5cd1098ab428535d592136973ec0c3f12f78148c94b379cb9f02d2414e75 + requires_dist: + - importlib-metadata + - filelock + - huggingface-hub>=0.20.2 + - numpy + - regex!=2019.12.17 + - requests + - safetensors>=0.3.1 + - pillow + - urllib3<=2.0.0 ; extra == 'dev' + - isort>=5.5.4 ; extra == 'dev' + - ruff==0.1.5 ; extra == 'dev' + - hf-doc-builder>=0.3.0 ; extra == 'dev' + - compel==0.1.8 ; extra == 'dev' + - gitpython<3.1.19 ; extra == 'dev' + - datasets ; extra == 'dev' + - jinja2 ; extra == 'dev' + - invisible-watermark>=0.2.0 ; extra == 'dev' + - k-diffusion>=0.0.12 ; extra == 'dev' + - librosa ; extra == 'dev' + - parameterized ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-timeout ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - requests-mock==1.10.0 ; extra == 'dev' + - safetensors>=0.3.1 ; extra == 'dev' + - sentencepiece>=0.1.91,!=0.1.92 ; extra == 'dev' + - scipy ; extra == 'dev' + - torchvision ; extra == 'dev' + - transformers>=4.25.1 ; extra == 'dev' + - accelerate>=0.11.0 ; extra == 'dev' + - protobuf>=3.20.3,<4 ; extra == 'dev' + - tensorboard ; extra == 'dev' + - peft>=0.6.0 ; extra == 'dev' + - torch>=1.4 ; extra == 'dev' + - jax>=0.4.1 ; extra == 'dev' + - jaxlib>=0.4.1 ; extra == 'dev' + - flax>=0.4.1 ; extra == 'dev' + - hf-doc-builder>=0.3.0 ; extra == 'docs' + - jax>=0.4.1 ; extra == 'flax' + - jaxlib>=0.4.1 ; extra == 'flax' + - flax>=0.4.1 ; extra == 'flax' + - urllib3<=2.0.0 ; extra == 'quality' + - isort>=5.5.4 ; extra == 'quality' + - ruff==0.1.5 ; extra == 'quality' + - hf-doc-builder>=0.3.0 ; extra == 'quality' + - compel==0.1.8 ; extra == 'test' + - gitpython<3.1.19 ; extra == 'test' + - datasets ; extra == 'test' + - jinja2 ; extra == 'test' + - invisible-watermark>=0.2.0 ; extra == 'test' + - k-diffusion>=0.0.12 ; extra == 'test' + - librosa ; extra == 'test' + - parameterized ; extra == 'test' + - pytest ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - requests-mock==1.10.0 ; extra == 'test' + - safetensors>=0.3.1 ; extra == 'test' + - sentencepiece>=0.1.91,!=0.1.92 ; extra == 'test' + - scipy ; extra == 'test' + - torchvision ; extra == 'test' + - transformers>=4.25.1 ; extra == 'test' + - torch>=1.4 ; extra == 'torch' + - accelerate>=0.11.0 ; extra == 'torch' + - accelerate>=0.11.0 ; extra == 'training' + - datasets ; extra == 'training' + - protobuf>=3.20.3,<4 ; extra == 'training' + - tensorboard ; extra == 'training' + - jinja2 ; extra == 'training' + - peft>=0.6.0 ; extra == 'training' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/conda-forge/noarch/diffusers-0.27.2-pyhd8ed1ab_0.conda + sha256: 5720260b1bce855f98323ec18a19903f05e53551f2b26bc17cc59346043328ab + md5: 9c2cd89e6c0b3c2ee1e2d118a00d7e96 + depends: + - filelock + - huggingface_hub + - importlib-metadata + - numpy + - pillow + - python >=3.6 + - pytorch >=1.4 + - regex !=2019.12.17 + - requests + - safetensors + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/diffusers?source=hash-mapping + size: 578830 + timestamp: 1712100797027 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 5e4f3466526c52bc9af2d2353a1460bd + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 87553 + timestamp: 1690101185422 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 78745f157d56877a2c6e7b386f66f3e2 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 88169 + timestamp: 1706434833883 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + purls: [] + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + purls: [] + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + purls: [] + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + sha256: 7433b8469074985b651693778ec6f03d2a23fad9919a515e3b8545996b5e721a + md5: d9ea16b71920b03beafc17fcca16df90 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 138186 + timestamp: 1738501352608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.24.7-pyhd8ed1ab_0.conda + sha256: 000b32aa2b960fe1e39aecdd3e5b0eea0f9b1e9d622188c7bd8a6f86c244233d + md5: 9a8208360743187a5eabc2b2b05cb74f + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.8 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=hash-mapping + size: 259655 + timestamp: 1726154689209 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + name: jinja2 + version: 3.1.4 + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + sha256: 47cf6a4780dc41caa9bc95f020eed485b07010c9ccc85e9ef44b538fedb5341d + md5: b87b1abd2542cf65a00ad2e2461a3083 + depends: + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 287007 + timestamp: 1739161069194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + purls: [] + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + purls: [] + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + purls: [] + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + purls: [] + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + sha256: 3861a65106a5f876eff3fc19042c3edb528216114b9f8e64b37aebf003deda11 + md5: c4b1ba0d7cef5002759d2f156722feee + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + purls: [] + size: 291536 + timestamp: 1739957375872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + purls: [] + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + purls: [] + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + purls: [] + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + purls: [] + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + purls: [] + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + purls: [] + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- pypi: https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + name: markupsafe + version: 2.1.5 + sha256: ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- pypi: https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl#sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + sha256: bb612a921fafda6375a2204ffebd8811db8dd3b8f25ac9886cc9bcbff7e3664e + md5: 5a64b9f44790d9a187a85366dd0ffa8d + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 335666 + timestamp: 1695459025249 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda + sha256: f93627c78d1f86f593350196699b462c334542477aa55fe0212edf45392c9ab4 + md5: 642c63b684ce5614f157572b04816983 + depends: + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 341428 + timestamp: 1724954862644 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 + md5: 910ef2223c71902175418d9163152788 + depends: + - dill >=0.3.6 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 335147 + timestamp: 1695459275360 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- pypi: https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + name: networkx + version: '3.3' + sha256: 28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 + requires_dist: + - numpy>=1.23 ; extra == 'default' + - scipy>=1.9,!=1.11.0,!=1.11.1 ; extra == 'default' + - matplotlib>=3.6 ; extra == 'default' + - pandas>=1.4 ; extra == 'default' + - changelist==0.5 ; extra == 'developer' + - pre-commit>=3.2 ; extra == 'developer' + - mypy>=1.1 ; extra == 'developer' + - rtoml ; extra == 'developer' + - sphinx>=7 ; extra == 'doc' + - pydata-sphinx-theme>=0.14 ; extra == 'doc' + - sphinx-gallery>=0.14 ; extra == 'doc' + - numpydoc>=1.7 ; extra == 'doc' + - pillow>=9.4 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - myst-nb>=1.0 ; extra == 'doc' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.12 ; extra == 'extra' + - pydot>=2.0 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d + md5: 04231368e4af50d11184b50e14250993 + depends: + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 377796 + timestamp: 1733816683252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312h287a98d_1.conda + sha256: e1a2426f23535fc15e577d799685229a93117b645734e5cca60597bb23cef09e + md5: b1325cda3f250f9f842180607054e6ed + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41702764 + timestamp: 1718833930009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py312hc0f7016_1.conda + sha256: a55086ded25a27a0f6f7ec3bd82dfc6d594e7e119ad6a1e2dd9c449b4931e3e0 + md5: fe73c159f45d5660035ae21a3c799227 + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: aarch64 + platform: linux + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42558380 + timestamp: 1718835195362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h39b1d8d_1.conda + sha256: 37907cdfdb8765d26cb239098fcb053b0b55216945d8bedc9429023ba8db11ab + md5: 4d3a01b6c6df5cc761adb1f3da5b99c2 + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42691135 + timestamp: 1718834038233 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + purls: [] + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=compressed-mapping + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/xxhash?source=hash-mapping + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=hash-mapping + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + purls: + - pkg:pypi/safetensors?source=compressed-mapping + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- pypi: https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl#sha256=b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + name: setuptools + version: 70.2.0 + sha256: b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest>=6,!=8.1.* ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.10.0 ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35857 + timestamp: 1733502172664 +- pypi: https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl#sha256=db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + name: sympy + version: 1.13.1 + sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tokenizers?source=hash-mapping + size: 1931389 + timestamp: 1732734727624 +- pypi: https://download.pytorch.org/whl/cpu/torch-2.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + name: torch + version: 2.5.1 + sha256: 36d1be99281b6f602d9639bd0af3ee0006e7aab16f6718d86f709d395b6f262c + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - sympy==1.12.1 ; python_full_version == '3.8.*' + - setuptools ; python_full_version >= '3.12' + - sympy==1.13.1 ; python_full_version >= '3.9' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.12.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/transformers?source=hash-mapping + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 405089 + timestamp: 1714723101397 diff --git a/examples/inference/yolo-python-onnx/magic.lock b/examples/inference/yolo-python-onnx/magic.lock new file mode 100644 index 0000000000..59433dc061 --- /dev/null +++ b/examples/inference/yolo-python-onnx/magic.lock @@ -0,0 +1,2220 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda + sha256: da8c8888de10c1e4234ebcaa1550ac2b4b5408ac20f093fe641e4bc8c9c9f3eb + md5: 04e691b9fadd93a8a9fad87a81d4fd8f + depends: + - python >=3.9,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + size: 1245116 + timestamp: 1734466348103 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + sha256: 91d664ace7c22e787775069418daa9f232ee8bafdd0a6a080a5ed2395a6fa6b2 + md5: 9bddfdbf4e061821a1a443f93223be61 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 777736 + timestamp: 1740654030775 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + md5: 75cb7132eb58d97896e173ef12ac9986 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 62931 + timestamp: 1733130309598 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/mojo/life/magic.lock b/examples/mojo/life/magic.lock new file mode 100644 index 0000000000..1aec52b09f --- /dev/null +++ b/examples/mojo/life/magic.lock @@ -0,0 +1,5402 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fluidsynth-2.3.7-hd992666_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.3.0-h76408a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h7c63dc7_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-hf3231e4_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.71-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmad-0.15.1b-h0b41bf4_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.3-h3dc2cb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.3-h9a4d06a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.9-h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.27-h520f47e_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.0-hc4a0caf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opusfile-0.12-h3358134_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/portaudio-19.6.0-h7c63dc7_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/portmidi-2.0.4-h7c63dc7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pygame-2.6.1-py312h4fcb14b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.50-h9b8e6db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2_image-2.8.2-h06ee604_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2_mixer-2.6.3-h8830914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2_ttf-2.24.0-h287479f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.4-h3083f51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.0-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.13-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.2-h83712da_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fluidsynth-2.3.7-h4f58cef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-0.23.1-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-tools-0.23.1-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-10.3.0-hb5e3f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h5c6c0ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.23.1-h5e0f5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-devel-0.23.1-h5e0f5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.1.1-h0430067_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.71-h51d75a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdb-6.2.32-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.124-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcrypt-lib-1.11.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgettextpo-0.23.1-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgettextpo-devel-0.23.1-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgpg-error-1.51-h05609ea_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmad-0.15.1b-hb4cce97_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libogg-1.3.5-h0b9eccb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.3-h27834fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.3-h1187dce_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunwind-1.6.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.9-h17cf362_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libusb-1.0.27-hfa5f0b2_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvorbis-1.3.7-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.8.0-h2ef6bd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opusfile-0.12-hf55b2d5_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.44.2-h86a87f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portaudio-19.6.0-h5c6c0ed_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portmidi-2.0.4-h5c6c0ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-client-17.0-h729494f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pygame-2.6.1-py312hb2c8110_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rav1e-0.6.6-h1d8f897_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2-2.32.50-h7851d19_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2_image-2.8.2-hd95cb85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2_mixer-2.6.3-h422cae6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2_ttf-2.24.0-hb1608df_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.2.4-h9cc03ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/svt-av1-3.0.0-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.43-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.5-h0808dbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.11-hca56bd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxcursor-1.2.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.1-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.2-h6a3b0d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dbus-1.13.6-h3818c69_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fluidsynth-2.3.7-h80fea77_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.23.1-h3dcc1bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-10.3.0-hb72c1af_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-devel-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.1.1-hf9d1e0e_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libflac-1.4.3-hb765f3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-hdff4504_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.23.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmad-0.15.1b-h1a8c8d9_1001.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsndfile-1.2.2-h9739721_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libusb-1.0.27-h93a5062_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h9f76cd9_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpg123-1.32.9-hf642e45_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/opusfile-0.12-h5643135_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.44.2-h2f9eb0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/portaudio-19.6.0-h13dd4ca_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/portmidi-2.0.4-h13dd4ca_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pygame-2.6.1-py312hb14fe3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rav1e-0.6.6-h69fbcac_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.32.50-h994913f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2_image-2.8.2-h376e2e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2_mixer-2.6.3-h4fe3bdc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2_ttf-2.24.0-h443c5de_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl3-3.2.4-he842692_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-3.0.0-h8ab69cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda + sha256: f507b58f77eabc0cc133723cb7fc45c053d551f234df85e70fb3ede082b0cd53 + md5: ae1370588aa6a5157c34c73e9bbb36a0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: GPL + size: 560238 + timestamp: 1731489643707 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.13-h86ecc28_0.conda + sha256: 4141180b0304559fefa8ca66f1cc217a1d957b03aa959f955daf33718162042f + md5: f643bb02c4bbcfe7de161a8ca5df530b + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + license_family: GPL + size: 591318 + timestamp: 1731489774660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + sha256: b08ef033817b5f9f76ce62dfcac7694e7b6b4006420372de22494503decac855 + md5: 346722a0be40f6edc53f12640d301338 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 2706396 + timestamp: 1718551242397 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda + sha256: ac438ce5d3d3673a9188b535fc7cda413b479f0d52536aeeac1bd82faa656ea0 + md5: cc744ac4efe5bcaa8cca51ff5b850df0 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 3250813 + timestamp: 1718551360260 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda + sha256: ec238f18ce8140485645252351a0eca9ef4f7a1c568a420f240a585229bc12ef + md5: 7adba36492a1bb22d98ffffe4f6fc6de + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 2235747 + timestamp: 1718551382432 +- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + md5: d9c69a24ad678ffce24c6543a0176b00 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 71042 + timestamp: 1660065501192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + sha256: 2c793b48e835a8fac93f1664c706442972a0206963bf8ca202e83f7f4d29a7d7 + md5: 1ef6c06fec1b6f5ee99ffe2152e53568 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 74992 + timestamp: 1660065534958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda + sha256: de7d0d094e53decc005cb13e527be2635b8f604978da497d4c0d282c7dc08385 + md5: b34c2833a1f56db610aeb27f206d800d + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-only or MPL-1.1 + size: 978868 + timestamp: 1733790976384 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.2-h83712da_1.conda + sha256: 0353e175859c4989251628e4c8f9fb2dc52546b0c031ffe4541eb087ac586573 + md5: e7b46975d2c9a4666da0e9bb8a087f28 + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: aarch64 + platform: linux + license: LGPL-2.1-only or MPL-1.1 + size: 980455 + timestamp: 1733791018944 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.2-h6a3b0d2_1.conda + sha256: 9a28344e806b89c87fda0cdabd2fb961e5d2ff97107dba25bac9f5dc57220cc3 + md5: 8e3666c3f6e2c3e57aa261ab103a3600 + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libcxx >=18 + - libexpat >=2.6.4,<3.0a0 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + arch: arm64 + platform: osx + license: LGPL-2.1-only or MPL-1.1 + size: 894517 + timestamp: 1733791145035 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 + md5: 418c6ca5929a611cbd69204907a83995 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 760229 + timestamp: 1685695754230 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda + sha256: 33fe66d025cf5bac7745196d1a3dd7a437abcf2dbce66043e9745218169f7e17 + md5: 6e5a87182d66b2d1328a96b61ca43a62 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 347363 + timestamp: 1685696690003 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda + sha256: 93e077b880a85baec8227e8c72199220c7f87849ad32d02c14fb3807368260b8 + md5: 5a74cdee497e6b65173e10d94582fae6 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 316394 + timestamp: 1685695959391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 618596 + timestamp: 1640112124844 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 + sha256: 5fe76bdf27a142cfb9da0fb3197c562e528d2622b573765bee5c9904cf5e6b6b + md5: f3d63805602166bac09386741e00935e + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 672759 + timestamp: 1640113663539 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dbus-1.13.6-h3818c69_3.tar.bz2 + sha256: fb21c1e677b43f5de8462f15bfbd0dce271cfe60cf1e6df50bc057b11feb52e1 + md5: 23730a06679644276233a5894eb2ef00 + depends: + - expat >=2.4.2,<3.0a0 + - libglib >=2.70.2,<3.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-or-later + license_family: GPL + size: 574595 + timestamp: 1640112246560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda + sha256: 1848c7db9e264e3b8036ee133d570dd880422983cd20dd9585a505289606d276 + md5: 1d6afef758879ef5ee78127eb4cd2c4a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat 2.6.4 h5888daf_0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 138145 + timestamp: 1730967050578 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.4-h5ad3122_0.conda + sha256: 13905ad49c2f43776bac0e464ffd3c9ec10ef35cc7dd7e187af6f66f843fa29a + md5: e8f1d587055376ea2419cc78696abd0b + depends: + - libexpat 2.6.4 h5ad3122_0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 130354 + timestamp: 1730967212801 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.4-h286801f_0.conda + sha256: e621a088b762a8aa99bd8f3ef10e2efe923713bc476babb90e7919f6c13a358b + md5: a37ffeecc1b8a62205bdd8319652758b + depends: + - __osx >=11.0 + - libexpat 2.6.4 h286801f_0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 124765 + timestamp: 1730967188116 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fluidsynth-2.3.7-hd992666_0.conda + sha256: 0bf26d25ae79e6f5f01a49a00e9ba3b60b10dd4c12ec43bdba51055c26bc9dd6 + md5: dd6c7b8a1b217ef7522ca987c465651d + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.12,<1.3.0a0 + - jack >=1.9.22,<1.10.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libstdcxx >=13 + - portaudio >=19.6.0,<19.7.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - readline >=8.2,<9.0a0 + - sdl2 >=2.30.7,<3.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: LGPL + size: 279996 + timestamp: 1729590344462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fluidsynth-2.3.7-h4f58cef_0.conda + sha256: e557d4fcb40f224180d61cc5e57fe3d5d5793a255c7d5a29546e524ef2ffa298 + md5: 0207cc67431f4d12605cae60d8d323d7 + depends: + - alsa-lib >=1.2.12,<1.3.0a0 + - jack >=1.9.22,<1.10.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libstdcxx >=13 + - portaudio >=19.6.0,<19.7.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - readline >=8.2,<9.0a0 + - sdl2 >=2.30.7,<3.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-or-later + license_family: LGPL + size: 292770 + timestamp: 1729590405853 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fluidsynth-2.3.7-h80fea77_0.conda + sha256: e4c39119797493d4f085cd6274e123372bec77e05ef93203ccf5dee714bfd9c3 + md5: dc2fc082a05af6a790d3e8e3e6489e6c + depends: + - __osx >=11.0 + - libcxx >=17 + - libglib >=2.82.2,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - portaudio >=19.6.0,<19.7.0a0 + - readline >=8.2,<9.0a0 + - sdl2 >=2.30.7,<3.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-or-later + license_family: LGPL + size: 234967 + timestamp: 1729590579216 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 265599 + timestamp: 1730283881107 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda + sha256: fe023bb8917c8a3138af86ef537b70c8c5d60c44f93946a87d1e8bb1a6634b55 + md5: 112b71b6af28b47c624bcbeefeea685b + depends: + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 277832 + timestamp: 1730284967179 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda + sha256: f79d3d816fafbd6a2b0f75ebc3251a30d3294b08af9bb747194121f5efa364bc + md5: 7b29f48742cea5d1ccb5edd839cb5621 + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 234227 + timestamp: 1730284037572 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + size: 4102 + timestamp: 1566932280397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda + sha256: 9d93e75a63a8ca8f86d1be09f68f1211754e6f1e9ee4fa6d90b9d46ee0f1dabb + md5: 0754038c806eae440582da1c3af85577 + depends: + - __glibc >=2.17,<3.0.a0 + - gettext-tools 0.23.1 h5888daf_0 + - libasprintf 0.23.1 h8e693c7_0 + - libasprintf-devel 0.23.1 h8e693c7_0 + - libgcc >=13 + - libgettextpo 0.23.1 h5888daf_0 + - libgettextpo-devel 0.23.1 h5888daf_0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 484344 + timestamp: 1739038829530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-0.23.1-h5ad3122_0.conda + sha256: fae61ce07f930c00de83d7bc3b5bfc1d981d500517894434632c1565b9a6e579 + md5: 6a8190d3f7d7a171aeacf7d01bb9b14f + depends: + - gettext-tools 0.23.1 h5ad3122_0 + - libasprintf 0.23.1 h5e0f5ae_0 + - libasprintf-devel 0.23.1 h5e0f5ae_0 + - libgcc >=13 + - libgettextpo 0.23.1 h5ad3122_0 + - libgettextpo-devel 0.23.1 h5ad3122_0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 479395 + timestamp: 1739038679347 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.23.1-h3dcc1bd_0.conda + sha256: 9311cd9e64f0ae3bccae58b5b68a4804abd8b3c49f4f327b9573b50b026b317e + md5: 123c4d62e1bcba6274511af8c7cf40d5 + depends: + - __osx >=11.0 + - gettext-tools 0.23.1 h493aca8_0 + - libasprintf 0.23.1 h493aca8_0 + - libasprintf-devel 0.23.1 h493aca8_0 + - libcxx >=18 + - libgettextpo 0.23.1 h493aca8_0 + - libgettextpo-devel 0.23.1 h493aca8_0 + - libiconv >=1.17,<2.0a0 + - libintl 0.23.1 h493aca8_0 + - libintl-devel 0.23.1 h493aca8_0 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 484476 + timestamp: 1739039461682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda + sha256: dd2b54a823ea994c2a7908fcce40e1e612ca00cb9944f2382624ff2d3aa8db03 + md5: 2f659535feef3cfb782f7053c8775a32 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 2967824 + timestamp: 1739038787800 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-tools-0.23.1-h5ad3122_0.conda + sha256: 01f55fbf243f471ef426751de914b62fa21418ca3d0aa7a6983f0f87f6ec84e4 + md5: ba6d592245d2c0eb497cd11f70b50df7 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 3232815 + timestamp: 1739038646552 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.23.1-h493aca8_0.conda + sha256: c26b38bcff84b3af52f061f55de27a45fb2e9a0544c32b3cbddf8be97c80c296 + md5: 4086817e75778198f96c9b2ed4bc5a6e + depends: + - __osx >=11.0 + - libiconv >=1.17,<2.0a0 + - libintl 0.23.1 h493aca8_0 + arch: arm64 + platform: osx + license: GPL-3.0-or-later + license_family: GPL + size: 2890553 + timestamp: 1739039406578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + md5: f87c7b7c2cb45f323ffbce941c78ab7c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.0-or-later + license_family: LGPL + size: 96855 + timestamp: 1711634169756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda + sha256: c7585e1fb536120583790080f3b3875c04d5f2d64eafbc87e9aa39895e4118c0 + md5: f33009add6a08358bc12d114ceec1304 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.0-or-later + license_family: LGPL + size: 99453 + timestamp: 1711634223220 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda + sha256: 2eadafbfc52f5e7df3da3c3b7e5bbe34d970bea1d645ffe60b0b1c3a216657f5 + md5: 339991336eeddb70076d8ca826dac625 + depends: + - libcxx >=16 + arch: arm64 + platform: osx + license: LGPL-2.0-or-later + license_family: LGPL + size: 79774 + timestamp: 1711634444608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.3.0-h76408a6_0.conda + sha256: fbccddfbbfaf139102e5513a2a053010338809348ade18bbf16cb6b92a53d294 + md5: 0a06f278e5d9242057673b1358a75e8f + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.2,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1671633 + timestamp: 1740154398990 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-10.3.0-hb5e3f52_0.conda + sha256: 687fbb17d8303b956ff917247e41ad8c864ed029b2349c0409cc905e11d9257d + md5: 4575cba227f2e4b5d0f23c9adc390f83 + depends: + - cairo >=1.18.2,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1727792 + timestamp: 1740157913844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-10.3.0-hb72c1af_0.conda + sha256: eb9cc0c8e61a9ce1236fdfa5d426ae31ffd9fd1d6b154e2e7318694eaed6c24e + md5: d77e5f42ec2a35950710f57868885683 + depends: + - __osx >=11.0 + - cairo >=1.18.2,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=75.1,<76.0a0 + - libcxx >=18 + - libexpat >=2.6.4,<3.0a0 + - libglib >=2.82.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1378165 + timestamp: 1740155007314 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h7c63dc7_2.conda + sha256: 5e44a3a4b9791d1268636811628555ad40d4a8dd5c3be3334062df75580ae25b + md5: f56277b7f079f1b13cbf7fb9b4f194c4 + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libdb >=6.2.32,<6.3.0a0 + - libgcc-ng >=12 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.0-only + license_family: LGPL + size: 464144 + timestamp: 1693879949990 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h5c6c0ed_2.conda + sha256: 4b5714f0798fb38e19d0aced7e5a9069eebf3c8ee9f541d643d4e6d0edcf388f + md5: e6abd2a51bd727a1b62a54524f760864 + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libdb >=6.2.32,<6.3.0a0 + - libgcc-ng >=12 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.0-only + license_family: LGPL + size: 489040 + timestamp: 1693881455137 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 + sha256: 2502904a42df6d94bd743f7b73915415391dd6d31d5f50cb57c0a54a108e7b0a + md5: ab05bcf82d8509b4243f07e93bada144 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.0-only + license_family: LGPL + size: 604863 + timestamp: 1664997611416 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2 + sha256: f40ce7324b2cf5338b766d4cdb8e0453e4156a4f83c2f31bbfff750785de304c + md5: bff0e851d66725f78dc2fd8b032ddb7e + arch: arm64 + platform: osx + license: LGPL-2.0-only + license_family: LGPL + size: 528805 + timestamp: 1664996399305 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda + sha256: 13b863584fccbb9089de73a2442e540703ce4873e4719c9d98c98e4a8e12f9d1 + md5: 988f4937281a66ca19d1adb3b5e3f859 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 43179 + timestamp: 1739038705987 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.23.1-h5e0f5ae_0.conda + sha256: f80d436462d78c459758176d59b0231c3cce99502408c2e4af03bacee786fc94 + md5: b34cfd925b96e72b99286e0cff036e82 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 43700 + timestamp: 1739038595159 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.23.1-h493aca8_0.conda + sha256: 2b27d2ede7867fd362f94644aac1d7fb9af7f7fc3f122cb014647b47ffd402a4 + md5: baf9e4423f10a15ca7eab26480007639 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + size: 41679 + timestamp: 1739039255705 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda + sha256: b05a859fe5a2b43574f3a5d93552061232b92d17017b27ecab1eccca1dbb2fe4 + md5: 2827e722a963b779ce878ef9b5474534 + depends: + - __glibc >=2.17,<3.0.a0 + - libasprintf 0.23.1 h8e693c7_0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 34282 + timestamp: 1739038733352 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-devel-0.23.1-h5e0f5ae_0.conda + sha256: 35829ce5805229b83e9b660ec6579b04c5ec83ac82ef72d93b31ea47def1ac09 + md5: ec789924a13fcd14c53cbf90ea1b8551 + depends: + - libasprintf 0.23.1 h5e0f5ae_0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 34348 + timestamp: 1739038610428 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-devel-0.23.1-h493aca8_0.conda + sha256: 25999d3c78270440e7e9e06c2e6f4a2e1ac11d2df84ac7b24280c6f530eed06f + md5: 13d4d79418eb3137fc94fe61e9e572e7 + depends: + - __osx >=11.0 + - libasprintf 0.23.1 h493aca8_0 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + size: 34641 + timestamp: 1739039285881 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-hf3231e4_3.conda + sha256: fdc5519fd91ebfe713561792365a1e86e0e9a1579b32f7df5d4136e97e01e30f + md5: 57983929fd533126e9bd71754f0d25f5 + depends: + - __glibc >=2.17,<3.0.a0 + - aom >=3.9.1,<3.10.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - libgcc >=13 + - rav1e >=0.6.6,<1.0a0 + - svt-av1 >=3.0.0,<3.0.1.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 117659 + timestamp: 1740443336123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.1.1-h0430067_3.conda + sha256: f414adc92127560abe135d7ae56d15d734732186fd0ceea408ab7be6415abb6d + md5: f7ecf6b6fbea3f1f6f4efe97b7e4ce4e + depends: + - aom >=3.9.1,<3.10.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - libgcc >=13 + - rav1e >=0.6.6,<1.0a0 + - svt-av1 >=3.0.0,<3.0.1.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 117519 + timestamp: 1740443361559 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.1.1-hf9d1e0e_3.conda + sha256: 35f411fb4a9c7dfcf47affed864066ccdaa45969d05403f80134a41cdf7159b6 + md5: 8d1a6e4e698ca66e953622764733803a + depends: + - __osx >=11.0 + - aom >=3.9.1,<3.10.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - rav1e >=0.6.6,<1.0a0 + - svt-av1 >=3.0.0,<3.0.1.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 98685 + timestamp: 1740443620556 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.71-h39aace5_0.conda + sha256: 2bbefac94f4ab8ff7c64dc843238b6c8edcc9ff1f2b5a0a48407a904dc7ccfb2 + md5: dd19e4e3043f6948bd7454b946ee0983 + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 102268 + timestamp: 1729940917945 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.71-h51d75a7_0.conda + sha256: 2b66e66e6a0768e833e7edc764649679881ec0a6b37d9bf254b1ceb3b8b434ef + md5: 29f6092b6e938516ca0b042837e64fa5 + depends: + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 106877 + timestamp: 1729940936697 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2 + sha256: 21fac1012ff05b131d4b5d284003dbbe7b5c4c652aa9e401b46279ed5a784372 + md5: 3f3258d8f841fbac63b36b75bdac1afd + depends: + - libgcc-ng >=9.3.0 + - libstdcxx-ng >=9.3.0 + arch: x86_64 + platform: linux + license: AGPL-3.0-only + license_family: AGPL + size: 24409456 + timestamp: 1609539093147 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdb-6.2.32-h01db608_0.tar.bz2 + sha256: 1f74d30c72d95c39315c6b5c3f1b328d00c4d5a2feff1e871fe5b71b4cb26811 + md5: 7cbfba14d5adfa65db945d5112909394 + depends: + - libgcc-ng >=9.3.0 + - libstdcxx-ng >=9.3.0 + arch: aarch64 + platform: linux + license: AGPL-3.0-only + license_family: AGPL + size: 24449415 + timestamp: 1609538998176 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda + sha256: f0d5ffbdf3903a7840184d14c14154b503e1a96767c328f61d99ad24b6963e52 + md5: 8bc89311041d7fcb510238cf0848ccae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpciaccess >=0.18,<0.19.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 242533 + timestamp: 1733424409299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.124-h86ecc28_0.conda + sha256: a0a89edcd142942ec5730f2b7d3b3f3e702b9be2d4c675fea3a8b62d40e6adc3 + md5: a8058bcb6b4fa195aaa20452437c7727 + depends: + - libgcc >=13 + - libpciaccess >=0.18,<0.19.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 246299 + timestamp: 1733424417343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 44840 + timestamp: 1731330973553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda + sha256: 8962abf38a58c235611ce356b9899f6caeb0352a8bce631b0bcc59352fda455e + md5: cf105bce884e4ef8c8ccdca9fe6695e7 + depends: + - libglvnd 1.7.0 hd24410f_2 + arch: aarch64 + platform: linux + license: LicenseRef-libglvnd + size: 53551 + timestamp: 1731330990477 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda + sha256: b54935360349d3418b0663d787f20b3cba0b7ce3fcdf3ba5e7ef02b884759049 + md5: 520b12eab32a92e19b1f239ac545ec03 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 371550 + timestamp: 1687765491794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libflac-1.4.3-hb765f3a_0.conda + sha256: 3990b52782fe7207ab642df25368ed443094f6d1a7ea61854935c24192b388aa + md5: 356faba64411660f6c4d24ea31640733 + depends: + - gettext >=0.21.1,<1.0a0 + - libcxx >=15.0.7 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 314408 + timestamp: 1687766236790 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda + sha256: ffc3602f9298da248786f46b00d0594d26a18feeb1b07ce88f3d7d61075e39e6 + md5: e55712ff40a054134d51b89afca57dbc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgpg-error >=1.51,<2.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 586185 + timestamp: 1732523190369 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcrypt-lib-1.11.0-h86ecc28_2.conda + sha256: 7b0b59e11511e1c20e4d1b89ac458b4a0799da2ef10980302a5f033ecc434dee + md5: 07c1e27a75b217e5502bff34cd23c353 + depends: + - libgcc >=13 + - libgpg-error >=1.51,<2.0a0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 635094 + timestamp: 1732523317415 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda + sha256: 190097140d9c16637aa516757d8087f17e8c22cc844c87288da64404b81ef43c + md5: a09ce5decdef385bcce78c32809fa794 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 166867 + timestamp: 1739038720211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgettextpo-0.23.1-h5ad3122_0.conda + sha256: 5fe9ea0f19d4f89c5f5030a5aad853e05d1fe001ee003e102e4a2a01b0e157cc + md5: 04aa6b35d4581b59aafb2683345579d7 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 207214 + timestamp: 1739038603075 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.23.1-h493aca8_0.conda + sha256: 4dbd3f698d027330033f06778567eda5b985e2348ca92900083654a114ddd051 + md5: 18ad77def4cb7326692033eded9c815d + depends: + - __osx >=11.0 + - libiconv >=1.17,<2.0a0 + - libintl 0.23.1 h493aca8_0 + arch: arm64 + platform: osx + license: GPL-3.0-or-later + license_family: GPL + size: 166929 + timestamp: 1739039303132 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda + sha256: 90f29ec7a7e2d758cb61459e643dcb54933dcf92194be6c29b0a1591fcbb163e + md5: 7a5d5c245a6807deab87558e9efd3ef0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgettextpo 0.23.1 h5888daf_0 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 36818 + timestamp: 1739038746565 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgettextpo-devel-0.23.1-h5ad3122_0.conda + sha256: e56df439c17f8a273ba7e9719def4ac3ff7aaadf37cad92179f4437d753e81a6 + md5: cb0245a67410b455cb8ee80f407f185f + depends: + - libgcc >=13 + - libgettextpo 0.23.1 h5ad3122_0 + arch: aarch64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 37031 + timestamp: 1739038617604 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.23.1-h493aca8_0.conda + sha256: 6031e57ba3c03ca34422b847b98fb70e697a5c10556c8d7b30410a96754c25d8 + md5: e6f75805f4b533d449a5a6d60cbc9a71 + depends: + - __osx >=11.0 + - libgettextpo 0.23.1 h493aca8_0 + - libiconv >=1.17,<2.0a0 + - libintl 0.23.1 h493aca8_0 + arch: arm64 + platform: osx + license: GPL-3.0-or-later + license_family: GPL + size: 37264 + timestamp: 1739039332924 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 134712 + timestamp: 1731330998354 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda + sha256: 3e954380f16255d1c8ae5da3bd3044d3576a0e1ac2e3c3ff2fe8f2f1ad2e467a + md5: 0d00176464ebb25af83d40736a2cd3bb + depends: + - libglvnd 1.7.0 hd24410f_2 + - libglx 1.7.0 hd24410f_2 + arch: aarch64 + platform: linux + license: LicenseRef-libglvnd + size: 145442 + timestamp: 1731331005019 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda + sha256: f0804a9e46ae7b32ca698d26c1c95aa82a91f71b6051883d4a46bea725be9ea4 + md5: 37d1af619d999ee8f1f73cf5a06f4e2f + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_1 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 3923974 + timestamp: 1737037491054 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_1.conda + sha256: aed7967aaea90b5649eb7eb0eab2ed2270323245eb0832b228e876fbeaae7f76 + md5: 6dfc5a88cfd58288999ab5081f57de9c + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_1 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 4004134 + timestamp: 1737037535030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-hdff4504_1.conda + sha256: d002aeaa51424e331f8504a54b6ba4388a6011a0ebcac29296f3d14282bf733b + md5: 849da57c370384ce48bef2e050488882 + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - libiconv >=1.17,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_1 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + size: 3643364 + timestamp: 1737037789629 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 132463 + timestamp: 1731330968309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda + sha256: 57ec3898a923d4bcc064669e90e8abfc4d1d945a13639470ba5f3748bd3090da + md5: 9e115653741810778c9a915a2f8439e7 + arch: aarch64 + platform: linux + license: LicenseRef-libglvnd + size: 152135 + timestamp: 1731330986070 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 75504 + timestamp: 1731330988898 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda + sha256: 6591af640cb05a399fab47646025f8b1e1a06a0d4bbb4d2e320d6629b47a1c61 + md5: 1d4269e233636148696a67e2d30dad2a + depends: + - libglvnd 1.7.0 hd24410f_2 + - xorg-libx11 >=1.8.9,<2.0a0 + arch: aarch64 + platform: linux + license: LicenseRef-libglvnd + size: 77736 + timestamp: 1731330998960 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda + sha256: 9e0c09c1faf2151ade3ccb64e52d3c1f2dde85c00e37c6a3e6a8bced2aba68be + md5: 168cc19c031482f83b23c4eebbb94e26 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 268740 + timestamp: 1731920927644 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgpg-error-1.51-h05609ea_1.conda + sha256: e819b3ba47dc7e195e8e8a9c874d0b45690cccb2fa741f1abd55b28323f9fc43 + md5: 9cabbbc1c3c8e9fa30e90748f14534dd + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 277785 + timestamp: 1731920977846 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.23.1-h493aca8_0.conda + sha256: 30d2a8a37070615a61777ce9317968b54c2197d04e9c6c2eea6cdb46e47f94dc + md5: 7b8faf3b5fc52744bda99c4cd1d6438d + depends: + - __osx >=11.0 + - libiconv >=1.17,<2.0a0 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + size: 78921 + timestamp: 1739039271409 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.23.1-h493aca8_0.conda + sha256: 5db07fa57b8cb916784353aa035fbf32aa7ee2905e38a8e70b168160372833f0 + md5: f9c6d5edc5951ef4010be8cbde9f12d4 + depends: + - __osx >=11.0 + - libiconv >=1.17,<2.0a0 + - libintl 0.23.1 h493aca8_0 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + size: 39774 + timestamp: 1739039317742 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmad-0.15.1b-h0b41bf4_1001.conda + sha256: 9e94cec54c4baadaa652c761179b8d32771fe7fa55faf6c78c2e35f942367f74 + md5: dc5cc4700f02ffeecc48253c9f29025b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-only + license_family: GPL + size: 78561 + timestamp: 1670815547616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmad-0.15.1b-hb4cce97_1001.conda + sha256: f39c36ce40bc75bc2eb101e8569caf166d6a02e0b1ef95403146b4f9310df0e3 + md5: 10814f7a570b160cea0c885bc1c5e8d5 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: GPL-2.0-only + license_family: GPL + size: 79598 + timestamp: 1673354561940 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmad-0.15.1b-h1a8c8d9_1001.conda + sha256: 8e9209acf4bf6865760e61dc0d86116ffc9efc3e13c7f559eb1ea78532a3a625 + md5: 1eb30852ed396fbe6e301fe6d715aef9 + arch: arm64 + platform: osx + license: GPL-2.0-only + license_family: GPL + size: 77255 + timestamp: 1670815732700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda + sha256: 5eda3fe92b99b25dd4737226a9485078ab405672d9f621be75edcb68f1e9026d + md5: 601bfb4b3c6f0b844443bb81a56651e0 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 205914 + timestamp: 1719301575771 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libogg-1.3.5-h0b9eccb_0.conda + sha256: e65acc318b7535fb8f2b5e994fe6eac3ae0be3bdb2acbe6037841d033c51f290 + md5: 15cb67b1b9dd0d4b37c81daba785e6ad + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 208233 + timestamp: 1719301637185 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h99b78c6_0.conda + sha256: 685f73b7241978007dfe0cecb9cae46c6a26d87d192b6f85a09eb65023c0b99e + md5: 57b668b9b78dea2c08e44bb2385d57c0 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 205451 + timestamp: 1719301708541 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + md5: 15345e56d527b330e1cacbdf58676e8f + depends: + - libgcc-ng >=9.3.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 260658 + timestamp: 1606823578035 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.3.1-hf897c2e_1.tar.bz2 + sha256: 92a87ade11af2cff41c35cf941f1a79390fde1f113f8e51e1cce30d31b7c8305 + md5: ac7534c50934ed25e4749d74b04c667a + depends: + - libgcc-ng >=9.3.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 328825 + timestamp: 1606823775764 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.3.1-h27ca646_1.tar.bz2 + sha256: e9912101a58cbc609a1917c5289f3bd1f600c82ed3a1c90a6dd4ca02df77958a + md5: 3d0dbee0ccd2f6d6781d270313627b62 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 252854 + timestamp: 1606823635137 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + sha256: c0a30ac74eba66ea76a4f0a39acc7833f5ed783a632ca3bb6665b2d81aabd2fb + md5: 48f4330bfcd959c3cfb704d424903c82 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 28361 + timestamp: 1707101388552 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h31becfc_0.conda + sha256: 0c6806dcd53da457c472cf22ad7793aef074cb198a10677a91b02c7dceeee770 + md5: 6d48179630f00e8c9ad9e30879ce1e54 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 29211 + timestamp: 1707101477910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + sha256: 3861a65106a5f876eff3fc19042c3edb528216114b9f8e64b37aebf003deda11 + md5: c4b1ba0d7cef5002759d2f156722feee + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + size: 291536 + timestamp: 1739957375872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda + sha256: 8fcd5e45d6fb071e8baf492ebb8710203fd5eedf0cb791e007265db373c89942 + md5: ad8e62c0faec46b1442f960489c80b49 + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 396501 + timestamp: 1695747749825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsndfile-1.2.2-h9739721_1.conda + sha256: e559f2f72bb03a554aa5b74230fa19160d33c7981ed385294f1eea9a5871cc03 + md5: 77d552455cbc52e089cdb9df5b283199 + depends: + - lame >=3.100,<3.101.0a0 + - libcxx >=15.0.7 + - libflac >=1.4.3,<1.5.0a0 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + license_family: LGPL + size: 317185 + timestamp: 1695747981394 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.3-h3dc2cb9_0.conda + sha256: dd566e2ef4a83b27d2b26d988cbbed50456294892744639f30f19954d2ee3287 + md5: df057752e83bd254f6d65646eb67cd2e + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.71,<2.72.0a0 + - libgcc >=13 + - libgcrypt-lib >=1.11.0,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 487271 + timestamp: 1739569869860 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.3-h27834fc_0.conda + sha256: 707567df4c23c3c62ba97845bc130378526b2ff7ed0800c899bff7a19cf67e1d + md5: c5887d8cb34661658118cc7951772335 + depends: + - libcap >=2.71,<2.72.0a0 + - libgcc >=13 + - libgcrypt-lib >=1.11.0,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 509851 + timestamp: 1739569947167 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.3-h9a4d06a_0.conda + sha256: 35bdafc4b02f61a327f82bb11263c31466367e50b4e5efab3d413509315cb0a7 + md5: e7817c912b25f7599a50eba270e1a463 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.71,<2.72.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 142897 + timestamp: 1739569881116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.3-h1187dce_0.conda + sha256: 996a477ced74941583c88417b5a341ce036b58662981d3792799d4d9ec93071e + md5: 7bcdab7b8ee62692770d292969d6cef2 + depends: + - libcap >=2.71,<2.72.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 154046 + timestamp: 1739569955486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2 + sha256: f2ac872920833960e514ce9efd8f7c08ce66dd870738d73839d1bce1ac497de6 + md5: a730b2badd586580c5752cc73842e068 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 75491 + timestamp: 1638450786937 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunwind-1.6.2-h01db608_0.tar.bz2 + sha256: 7862d36ffc9f6b2ed3381ce77c78b9e5691d7353a19dd2050630868e192adf6f + md5: 93b7bbf9099cfe09e67c0abe34bb7885 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 90479 + timestamp: 1638452154070 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.9-h84d6215_0.conda + sha256: bfa34a5a929d792dfcfbbe2d9ee21bd870d73d646512e21c871dab0b80194468 + md5: ecd409e7bfcf4ee73f74d7a2cc91a4c3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 121336 + timestamp: 1738604403935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.9-h17cf362_0.conda + sha256: 2922ab8ac4cdd966c1b13dad6ccc4c07c7db2054400843ee443ffd5e7b3f292e + md5: 8eef9430276ab3dbe6ad5b8f23ff5e26 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 123614 + timestamp: 1738605619021 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.27-h520f47e_100.conda + sha256: c641cdf5c398441df9863291c20574c37b1e4a6113b18a41c6a43ccc1df1b92c + md5: 82e46dc001ab1ef291554ead981b0cde + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libudev1 >=255 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 86196 + timestamp: 1706828413450 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libusb-1.0.27-hfa5f0b2_100.conda + sha256: c3ad82698430b627de6773fa82120cf659405a957c975639f41b3922d4219d9e + md5: ff95dc61e4f11520aa3158979c776c78 + depends: + - libgcc-ng >=12 + - libudev1 >=255 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 89408 + timestamp: 1706828386412 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libusb-1.0.27-h93a5062_100.conda + sha256: 37c377ee456eb77a4f4b15e289ef6c2d213786d2f4c11c7320fd2f654e7642d6 + md5: 711b8190e3e1e30a6598f5f76e0f8a20 + arch: arm64 + platform: osx + license: LGPL-2.1-or-later + size: 80917 + timestamp: 1706828785473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + sha256: 53080d72388a57b3c31ad5805c93a7328e46ff22fab7c44ad2a86d712740af33 + md5: 309dec04b70a3cc0f1e84a4013683bc0 + depends: + - libgcc-ng >=9.3.0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=9.3.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 286280 + timestamp: 1610609811627 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvorbis-1.3.7-h01db608_0.tar.bz2 + sha256: 1ade4727be5c52b287001b8094d02af66342dfe0ba13ef69222aaaf2e9be4342 + md5: c2863ff72c6d8a59054f8b9102c206e9 + depends: + - libgcc-ng >=9.3.0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=9.3.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 292082 + timestamp: 1610616294416 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h9f76cd9_0.tar.bz2 + sha256: 60457217e20d8b24a8390c81338a8fa69c8656b440c067cd82f802a09da93cb9 + md5: 92a1a88d1a1d468c19d9e1659ac8d3df + depends: + - libcxx >=11.0.0 + - libogg >=1.3.4,<1.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 254839 + timestamp: 1610609991029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.0-hc4a0caf_0.conda + sha256: 583203155abcfb03938d8473afbf129156b5b30301a0f796c8ecca8c5b7b2ed2 + md5: f1656760dbf05f47f962bfdc59fc3416 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.5,<3.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + arch: x86_64 + platform: linux + license: MIT/X11 Derivative + license_family: MIT + size: 642349 + timestamp: 1738735301999 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.8.0-h2ef6bd0_0.conda + sha256: d43a637fd237e77b9e72fe0723a06aa998779cf3f88bbe8260c31a9098340374 + md5: 90d998781d2895f73671bba13339d109 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.5,<3.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + arch: aarch64 + platform: linux + license: MIT/X11 Derivative + license_family: MIT + size: 652340 + timestamp: 1738735348944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: LGPL + size: 491140 + timestamp: 1730581373280 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda + sha256: d65d5a00278544639ba4f99887154be00a1f57afb0b34d80b08e5cba40a17072 + md5: cdf140c7690ab0132106d3bc48bce47d + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: LGPL + size: 558708 + timestamp: 1730581372400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpg123-1.32.9-hf642e45_0.conda + sha256: 070bbbbb96856c325c0b6637638ce535afdc49adbaff306e2238c6032d28dddf + md5: d2b4857bdc3b76c36e23236172d09840 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: LGPL-2.1-only + license_family: LGPL + size: 360712 + timestamp: 1730581491116 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opusfile-0.12-h3358134_2.conda + sha256: f4df9df880e405e5c856383f869d5b9d434f78fb7c234c9e7b099ab604fb7fc3 + md5: 5931bcae00b98f952696b6bcdd0be34b + depends: + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - openssl >=3.0.7,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 65901 + timestamp: 1670387479735 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opusfile-0.12-hf55b2d5_2.conda + sha256: a0ffa8054df68fad5f3533338557c7b985480ee3cf39f0e251ee6b03ff6896cf + md5: a9a71d77aec174e4532f91f560bc413b + depends: + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - openssl >=3.0.7,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 91662 + timestamp: 1673436651852 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/opusfile-0.12-h5643135_2.conda + sha256: 108dbee936a8e3c21d2aa5618326343844df8f1fe14067c4dc5a731d7945ecc0 + md5: e34e472ae04beeb642c5e937a2aeeebf + depends: + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - openssl >=3.0.7,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 80128 + timestamp: 1670387790769 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d + md5: df359c09c41cd186fffb93a2d87aa6f5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 952308 + timestamp: 1723488734144 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda + sha256: e9f4b912e48514771d477f2ee955f59d4ff4ef799c3d4d16e4d0f335ce91df67 + md5: 94022de9682cb1a0bb18a99cbc3541b3 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 884590 + timestamp: 1723488793100 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_2.conda + sha256: 83153c7d8fd99cab33c92ce820aa7bfed0f1c94fc57010cf227b6e3c50cb7796 + md5: 147c83e5e44780c7492998acbacddf52 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 618973 + timestamp: 1723488853807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + sha256: 747c58db800d5583fee78e76240bf89cbaeedf7ab1ef339c2990602332b9c4be + md5: 5e2a7acfa2c24188af39e7944e1b3604 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 381072 + timestamp: 1733698987122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.44.2-h86a87f0_0.conda + sha256: 289c88d26530e427234adf7a8eb11e762d2beaf3c0a337c1c9887f60480e33e1 + md5: 95689fc369832398e82d17c56ff5df8a + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 288697 + timestamp: 1733700860569 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.44.2-h2f9eb0b_0.conda + sha256: 28855d4cb2d9fc9a6bd9196dadbaecd6868ec706394cec2f88824a61ba4b1bc0 + md5: fa8e429fdb9e5b757281f69b8cc4330b + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 201076 + timestamp: 1733699127167 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/portaudio-19.6.0-h7c63dc7_9.conda + sha256: c09ae032d0303abfea34c0957834538b48133b0431283852741ed3e0f66fdb36 + md5: 893f2c33af6b03cfd04820a8c31f5798 + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 115512 + timestamp: 1693868383 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portaudio-19.6.0-h5c6c0ed_9.conda + sha256: a73e31c5fe9d717cd42470b394018f4e48eed4a439b9371d2c6d380c86aed591 + md5: ab049f8223bccc6f621975beaa75c624 + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 118203 + timestamp: 1693868376750 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/portaudio-19.6.0-h13dd4ca_9.conda + sha256: 5ff2b55d685c29dfe632ef856796a4b862305088543d4982f0b807e8d9bb756e + md5: d325d46394b6c46d15718c855fb20b4a + depends: + - libcxx >=15.0.7 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 78863 + timestamp: 1693868663440 +- conda: https://conda.anaconda.org/conda-forge/linux-64/portmidi-2.0.4-h7c63dc7_2.conda + sha256: f4e1245409e97b5b46e655ba301da5e9bc1d6ae64f5ae46004583dae31214868 + md5: 5b2518aa80f149ee6881f5ad959f5d59 + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 43765 + timestamp: 1693881734349 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portmidi-2.0.4-h5c6c0ed_2.conda + sha256: 64ed7bdebe45af7987f65402506fa5ad6f9fd339a93f8fe7a57c6bcce497022f + md5: 8ee28835da08f915cba9317fccb6396d + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 45266 + timestamp: 1693882668197 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/portmidi-2.0.4-h13dd4ca_2.conda + sha256: b948bea6ef3203d049997ca348ba0d751a3d891579388e53d323693b20896af6 + md5: fe77195a950275fe63e560b1b855e818 + depends: + - libcxx >=15.0.7 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 47319 + timestamp: 1693882007724 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda + sha256: b27c0c8671bd95c205a61aeeac807c095b60bc76eb5021863f919036d7a964fc + md5: 07f45f1be1c25345faddb8db0de8039b + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=12 + - libglib >=2.78.3,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=255 + constrains: + - pulseaudio 17.0 *_0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 757633 + timestamp: 1705690081905 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-client-17.0-h729494f_0.conda + sha256: 209eac3123ee2c84a35401626941c4aa64e04e2c9854084ddeba6432c6078a41 + md5: f35f57712d5c2abca98c85a51a408bc1 + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=12 + - libglib >=2.78.3,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=255 + constrains: + - pulseaudio 17.0 *_0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 766184 + timestamp: 1705690164726 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pygame-2.6.1-py312h4fcb14b_0.conda + sha256: 7a5582c3eed17d0223cbd79dfb25ebae1ec7f8b06eb550fb65e163adb5f1c75b + md5: 80c4be6aac23ad6dfc2aeca1b1ab7d1f + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - portmidi >=2.0.4,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - sdl2 >=2.30.7,<3.0a0 + - sdl2_image >=2.8.2,<3.0a0 + - sdl2_mixer >=2.6.3,<3.0a0 + - sdl2_ttf >=2.22.0,<3.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 2984508 + timestamp: 1727636750824 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pygame-2.6.1-py312hb2c8110_0.conda + sha256: 347dc650cbcb5b25f632ae62c87357c15db79849ff582887f6910ae245dc7d4f + md5: f4a1a0e1e2a435699366317ffeabd1bc + depends: + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - portmidi >=2.0.4,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - sdl2 >=2.30.7,<3.0a0 + - sdl2_image >=2.8.2,<3.0a0 + - sdl2_mixer >=2.6.3,<3.0a0 + - sdl2_ttf >=2.22.0,<3.0a0 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + size: 2979554 + timestamp: 1727636776938 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pygame-2.6.1-py312hb14fe3b_0.conda + sha256: 78b91e7b4cee736829f96ec8445674d03b60c03cc51da6f74cac1a14286fe686 + md5: 3a2a4db46a57a51f36f4d79f9f9b6c97 + depends: + - __osx >=11.0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - libcxx >=17 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - portmidi >=2.0.4,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - sdl2 >=2.30.7,<3.0a0 + - sdl2_image >=2.8.2,<3.0a0 + - sdl2_mixer >=2.6.3,<3.0a0 + - sdl2_ttf >=2.22.0,<3.0a0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + size: 2932509 + timestamp: 1727636775263 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda + sha256: 91b3c1ced90d04ee2eded1f72cf3cbc19ff05a25e41876ef0758266a5bab009f + md5: 77d9955b4abddb811cb8ab1aa7d743e4 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 15423721 + timestamp: 1694329261357 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rav1e-0.6.6-h1d8f897_2.conda + sha256: 093f21277dc5763cf0397e016e8291c2b796926ebbb173428dc9cdf5d012f328 + md5: 12c850a42b1ad1ed46a284a93959ee6a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 14347236 + timestamp: 1694329141875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rav1e-0.6.6-h69fbcac_2.conda + sha256: be6174970193cb4d0ffa7d731a93a4c9542881dbc7ab24e74b460ef312161169 + md5: e309ae86569b1cd55a0285fa4e939844 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 1526706 + timestamp: 1694329743011 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.50-h9b8e6db_1.conda + sha256: c253ddeafdc46bb53cdac722d1305a94bbbd9905e6a112e295ce7bb9e7a2f7e7 + md5: 0d27110a2f613abc268e31b3c1d5fb4f + depends: + - __glibc >=2.17,<3.0.a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - sdl3 >=3.2.4,<4.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 513266 + timestamp: 1740516135153 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2-2.32.50-h7851d19_1.conda + sha256: d2c1d0baf85f3484fa8630f3067f7411c8abcb8fee0ad67342d82e706c59230e + md5: 83f2b36f187b0269471774983ecfa39f + depends: + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - sdl3 >=3.2.4,<4.0a0 + arch: aarch64 + platform: linux + license: Zlib + size: 523908 + timestamp: 1740516151246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.32.50-h994913f_1.conda + sha256: 0a6ad048f2f311bebc05fc7a31d26373b693949ad0887edf48909b0acb849b5e + md5: ff589d08171ffeb5867e9c6a68ec913d + depends: + - __osx >=11.0 + - libcxx >=18 + - sdl3 >=3.2.4,<4.0a0 + arch: arm64 + platform: osx + license: Zlib + size: 493998 + timestamp: 1740516182244 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2_image-2.8.2-h06ee604_1.conda + sha256: f18184e016e2e57306d1540dea584d38f4617d7ddb6aad4af6b5f21c52fa39ea + md5: 65e113270b460dcdfc4dc0a80bb3d11c + depends: + - libavif16 >=1.0.4,<2.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - sdl2 >=2.30.2,<3.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 152110 + timestamp: 1716857107234 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2_image-2.8.2-hd95cb85_1.conda + sha256: 8bdd72e4789616b0db5fc8e756a4156d3bd7fd35cf96c1cb892d9f6bff3f6508 + md5: 45fbcda052d64b07fa601d965a41cb69 + depends: + - libavif16 >=1.0.4,<2.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - sdl2 >=2.30.2,<3.0a0 + arch: aarch64 + platform: linux + license: Zlib + size: 151138 + timestamp: 1716858240454 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2_image-2.8.2-h376e2e1_1.conda + sha256: 8c385478a7b6a6e34b3b3f3d48ed48f504698544987ad331f03a7b43b11d689a + md5: 247d2c5a873901ef51f378c69a2c708e + depends: + - __osx >=11.0 + - libavif16 >=1.0.4,<2.0a0 + - libcxx >=16 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - sdl2 >=2.30.2,<3.0a0 + arch: arm64 + platform: osx + license: Zlib + size: 118041 + timestamp: 1716857215118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2_mixer-2.6.3-h8830914_1.conda + sha256: c3e99e222b091f26cfd1d6be22c5a2973df9e7caa020262f9d9523f340344a95 + md5: 1a2b60be4d860a0c419a87176c85c3ad + depends: + - fluidsynth >=2.3.4,<2.4.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libmad >=0.15.1b,<0.16.0a0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + - opusfile >=0.12,<0.13.0a0 + - sdl2 >=2.28.3,<3.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 202966 + timestamp: 1695761744535 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2_mixer-2.6.3-h422cae6_1.conda + sha256: 8fa4580bddd4d33f5fbddf5c54873613a7f8fcd9f781656fbf9fd1b27975b196 + md5: 75e56f84030bd1244d8bff3c55e8418e + depends: + - fluidsynth >=2.3.4,<2.4.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libmad >=0.15.1b,<0.16.0a0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + - opusfile >=0.12,<0.13.0a0 + - sdl2 >=2.28.3,<3.0a0 + arch: aarch64 + platform: linux + license: Zlib + size: 238285 + timestamp: 1695761803447 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2_mixer-2.6.3-h4fe3bdc_1.conda + sha256: fcaaf1b589aed11498f5b9735b996fb92ff18e4673a4c804bbfa28eb00264e06 + md5: b92222911d46f08faa583df51191bd7f + depends: + - fluidsynth >=2.3.4,<2.4.0a0 + - libcxx >=15.0.7 + - libflac >=1.4.3,<1.5.0a0 + - libmad >=0.15.1b,<0.16.0a0 + - libogg >=1.3.4,<1.4.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + - opusfile >=0.12,<0.13.0a0 + - sdl2 >=2.28.3,<3.0a0 + arch: arm64 + platform: osx + license: Zlib + size: 188504 + timestamp: 1695762176058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2_ttf-2.24.0-h287479f_0.conda + sha256: 431d19b666db6e7a4f09c37c43c83f115176a006b2ac321853ca26bee888c519 + md5: bccd5b74eb55a523dfcc66b857555714 + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - harfbuzz >=10.1.0,<11.0a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - sdl2 >=2.30.10,<3.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 61954 + timestamp: 1736117956977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2_ttf-2.24.0-hb1608df_0.conda + sha256: f9ee162a8efbd9cb0131500c57807e470b95f454aedb921dbf5960176b505ee4 + md5: 63b580a2a1005d91ffcb06a7e58d75f8 + depends: + - freetype >=2.12.1,<3.0a0 + - harfbuzz >=10.1.0,<11.0a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - sdl2 >=2.30.10,<3.0a0 + arch: aarch64 + platform: linux + license: Zlib + size: 55411 + timestamp: 1736119336293 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2_ttf-2.24.0-h443c5de_0.conda + sha256: 5dc56fd1de51dec2f7b63b1a9069ab35ab0494d9cd5af164ab0019cbd9564cf6 + md5: 3cf5cf83deccb663b4e932d3d4b28f57 + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - harfbuzz >=10.1.0,<11.0a0 + - sdl2 >=2.30.10,<3.0a0 + arch: arm64 + platform: osx + license: Zlib + size: 45429 + timestamp: 1736118165229 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.4-h3083f51_0.conda + sha256: d19f33b8c73cf461698b3f6d81aa354aed68d50f8d64f72c0cccc507d183803c + md5: c0d92f268209e0a0fd27954a5667c11d + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.13.6,<2.0a0 + - jack >=1.9.22,<1.10.0a0 + - libdrm >=2.4.124,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - libudev1 >=256.7 + - libunwind >=1.6.2,<1.7.0a0 + - liburing >=2.9,<2.10.0a0 + - libusb >=1.0.27,<2.0a0 + - libxkbcommon >=1.8.0,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - wayland >=1.23.1,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 1728090 + timestamp: 1739801388543 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.2.4-h9cc03ad_0.conda + sha256: af6e96ddbf53a52f06714b715851f4cc0a684e26011da93974525535cc3a1da7 + md5: ecc9ec84f3a1d4d903a12d8b5c68e077 + depends: + - dbus >=1.13.6,<2.0a0 + - jack >=1.9.22,<1.10.0a0 + - libdrm >=2.4.124,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - libudev1 >=256.7 + - libunwind >=1.6.2,<1.7.0a0 + - liburing >=2.9,<2.10.0a0 + - libusb >=1.0.27,<2.0a0 + - libxkbcommon >=1.8.0,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - wayland >=1.23.1,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + arch: aarch64 + platform: linux + license: Zlib + size: 1655503 + timestamp: 1739553425173 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl3-3.2.4-he842692_0.conda + sha256: a9ab414a0432f256e4643f87aa97eaef31778990e7004d4e6dcf5a7a59c2047a + md5: 09a67fad3bcd67851f14082d80fe9b51 + depends: + - __osx >=11.0 + - dbus >=1.13.6,<2.0a0 + - libcxx >=18 + - libusb >=1.0.27,<2.0a0 + arch: arm64 + platform: osx + license: Zlib + size: 1258052 + timestamp: 1739553733611 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.0-h5888daf_0.conda + sha256: 01ae1e86f79e05b9e687ef3b963e7f4f8a7554ac9f5af4dc1e3dc11ed79548b2 + md5: d86fc7eb811593abc06b328d3d72c001 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 2746763 + timestamp: 1740096577511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/svt-av1-3.0.0-h5ad3122_0.conda + sha256: dd730fe6914a748f2466ac077f3b5b219fec4e49b9e05454af856e42ffe46c58 + md5: 65e68986e59b0e1272af76e6356828a9 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 1920727 + timestamp: 1740099395955 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-3.0.0-h8ab69cd_0.conda + sha256: 94802f002ec504c4a8a8dc5bb59d992a53eaa41379d7258a409939f9bb84547d + md5: 419e4ba326a85ce687a6b038e442c744 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 1447364 + timestamp: 1740096672763 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + sha256: 0884b2023a32d2620192cf2e2fc6784b8d1e31cf9f137e49e00802d4daf7d1c1 + md5: 0a732427643ae5e0486a727927791da1 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=13 + - libstdcxx-ng >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 321561 + timestamp: 1724530461598 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_0.conda + sha256: 71c591803459e1f68f9ad206a4f2fa3971147502bad8791e94fd18d8362f8ce6 + md5: 2661f9252065051914f1cdf5835e7430 + depends: + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=13 + - libstdcxx-ng >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 324815 + timestamp: 1724530528414 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + sha256: 0d89b5873515a1f05d311f37ea4e087bbccc0418afa38f2f6189e97280db3179 + md5: f725c7425d6d7c15e31f3b99a88ea02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 389475 + timestamp: 1727840188958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.43-h86ecc28_0.conda + sha256: b3f09cc99b6b7707aa8812bbc7556fd431999ad3a48292e4ff82335b5fda976c + md5: a809b8e3776fbc05696c82f8cf6f5a92 + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 391011 + timestamp: 1727840308426 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda + sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 + md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 60433 + timestamp: 1734229908988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda + sha256: 760f43df6c2ce8cbbbcb8f2f3b7fc0f306716c011e28d1d340f3dfa8ccf29185 + md5: 4c3e9fab69804ec6077697922d70c6e2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 27198 + timestamp: 1734229639785 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.5-h0808dbd_0.conda + sha256: 2749a32a00ccd8feaab6039d7848ed875880c13d3b2601afd1788600ce5f9075 + md5: 3983c253f53f67a9d8710fc96646950f + depends: + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 28061 + timestamp: 1734232077988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda + sha256: a0e7fca9e341dc2455b20cd320fc1655e011f7f5f28367ecf8617cccd4bb2821 + md5: b6eb6d0cb323179af168df8fe16fb0a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 835157 + timestamp: 1738613163812 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.11-hca56bd8_0.conda + sha256: 351ce88b3c2df30520721d45e3d32127a0f7f406be234c25a224ed46f082d2e5 + md5: b4f818a0a4e60cffe755381166c82888 + depends: + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 864226 + timestamp: 1738613196126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxcursor-1.2.3-h86ecc28_0.conda + sha256: c5d3692520762322a9598e7448492309f5ee9d8f3aff72d787cf06e77c42507f + md5: f2054759c2203d12d0007005e1f1296d + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 34596 + timestamp: 1730908388714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 50060 + timestamp: 1727752228921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda + sha256: 8e216b024f52e367463b4173f237af97cf7053c77d9ce3e958bc62473a053f71 + md5: bd1e86dd8aa3afd78a4bfdb4ef918165 + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 50746 + timestamp: 1727754268156 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19575 + timestamp: 1727794961233 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.1-h57736b2_0.conda + sha256: f5c71e0555681a82a65c483374b91d91b2cb9a9903b3a22ddc00f36719fce549 + md5: 78f8715c002cc66991d7c11e3cf66039 + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 20289 + timestamp: 1727796500830 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda + sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f + md5: ae2c2dd0e2d38d249887727db2af960e + depends: + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 33649 + timestamp: 1734229123157 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + sha256: 58e8fc1687534124832d22e102f098b5401173212ac69eb9fd96b16a3e2c8cb2 + md5: 303f7a0e9e0cd7d250bb6b952cecda90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14412 + timestamp: 1727899730073 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + sha256: 532d3623961e34c53aba98db2ad0a33b7a52ff90d6960e505fb2d2efc06bb7da + md5: 02e4e2fa41a6528afba2e54cbc4280ff + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 567419 + timestamp: 1740255350233 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_1.conda + sha256: a8e9a9e19ec3778594d9746e308cdba096f3019c0c0a62f552d0d299b35c343f + md5: d98196f3502425e14f82bdfc8eb4ae27 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 550364 + timestamp: 1740255370714 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_1.conda + sha256: f49bbeeb3a8ead81920e6c695fff1260cbd221e2cfcdf9fb34207260fbd60816 + md5: 66e5c4b02aa97230459efdd4f64c8ce6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 399981 + timestamp: 1740255382232 diff --git a/examples/mojo/magic.lock b/examples/mojo/magic.lock new file mode 100644 index 0000000000..c06e7e4f53 --- /dev/null +++ b/examples/mojo/magic.lock @@ -0,0 +1,2185 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-h074ec65_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py311hf886319_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.11-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py311h826da9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h7028846_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py311h5c441b1_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py311h5487e9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.11-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py311h01f2145_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-hf736513_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py311hb1a73f2_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + sha256: 3f4365e11b28e244c95ba8579942b0802761ba7bb31c026f50d1a9ea9c728149 + md5: a502d7aad449a1206efb366d6a12c52d + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 8065890 + timestamp: 1707225944355 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda + sha256: 88800a1d9d11c2fccab09d40d36f7001616f5119eaf0ec86186562f33564e651 + md5: 3fd00dd400c8d3f9da12bf33061dd28d + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7234391 + timestamp: 1707225781489 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + sha256: 160a52a01fea44fe9753a2ed22cf13d7b55c8a89ea0b8738546fdbf4795d6514 + md5: 3160b93669a0def35a7a8158ebb33816 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6652352 + timestamp: 1707226297967 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda + build_number: 1 + sha256: b29ce0836fce55bdff8d5c5b71c4921a23f87d3b950aea89a9e75784120b06b0 + md5: 8387070aa413ce9a8cc35a509fae938b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 30624804 + timestamp: 1733409665928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.11-h1683364_1_cpython.conda + build_number: 1 + sha256: b39a2253510b26213093cb29e27722cb33782aec213c020dfd17cd74d58f68e7 + md5: 7e8786cbe7b83e7011e681a4780c9b7f + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 15234582 + timestamp: 1733407838276 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.11-hc22306f_1_cpython.conda + build_number: 1 + sha256: 94e198f6a5affa1431401fca7e3b27fda68c59f5ee726083288bff1f6bed8c7f + md5: 8d81dcd0be5bdcdd98e0f2482bf63784 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: Python-2.0 + size: 14647146 + timestamp: 1733409012105 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda + build_number: 5 + sha256: 2660b8059b3ee854bc5d3c6b1fce946e5bd2fe8fbca7827de2c5885ead6209de + md5: 139a8d40c8a2f430df31048949e450de + constrains: + - python 3.11.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6211 + timestamp: 1723823324668 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.11-5_cp311.conda + build_number: 5 + sha256: 76974c2732919ace87b5f3a634eac93fed6900d557fcae0575787ec0a33c370e + md5: c2078141f21872cc34d9305123ba08f2 + constrains: + - python 3.11.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6300 + timestamp: 1723823316891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda + build_number: 5 + sha256: adc05729b7e0aca7b436e60a86f10822a92185dfcb48d66d6444e3629d3a1f6a + md5: 3b855e3734344134cb56c410f729c340 + constrains: + - python 3.11.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6308 + timestamp: 1723823096865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda + sha256: bd6309ef4629744aaaccd9b33d6389dfe879e9864386137e6e4ecc7e1b9ed0f3 + md5: 52457fbaa0aef8136d5dd7bb8a36db9e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 392547 + timestamp: 1738271109731 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py311h826da9f_0.conda + sha256: 09783a354a64324ed363a3c9de0f98d088f74f009d1a6fdd263c3758c4924992 + md5: 919dc1bfa979c20c6358f06e4ee8529f + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 386832 + timestamp: 1738273148939 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py311h01f2145_0.conda + sha256: 29255e5ca9f0b50d551fce4d5b7745fa11b4e672418a6d88a4c3f1a974dd4e44 + md5: 4c5daee5a983fb515460a2714b612126 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 370170 + timestamp: 1738271259321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-h074ec65_10.conda + sha256: 1c7b8a24296bf1309f866d363a1152a796d495f97a87d0c6f35b845e6c153250 + md5: 4b2fa94e6d42231ffee6707dfe578915 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.11.* *_cp311 + - sentencepiece-python 0.2.0 py311hf886319_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19473 + timestamp: 1735628355599 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h7028846_10.conda + sha256: a8b4437185e91d858566be18830fe93148a6335005349db08f60859c4ac413ad + md5: 64c3bcdf9faa00799dd2ed3f16044c26 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.11.* *_cp311 + - sentencepiece-python 0.2.0 py311h5c441b1_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19719 + timestamp: 1735628704628 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-hf736513_10.conda + sha256: 16826ce65b4a391990fa85dd2af7d0cd98549be9e993181f18e6d633185a0bd9 + md5: 4b55d377c0ba17934ab1515b608b8276 + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.11.* *_cp311 + - sentencepiece-python 0.2.0 py311hb1a73f2_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19753 + timestamp: 1735628583443 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py311hf886319_10.conda + sha256: 6d92d183dbe714d2b2b042542b36e1a875f307c83bde4324f24a6a1ea62400b6 + md5: 90c0c6f0d4d58d2383373e3ab7bc4d19 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2350779 + timestamp: 1735627954130 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py311h5c441b1_10.conda + sha256: 27f130942401ad16fc41417747cdc31cb2e579d8586335ddae7ee03b156ab3d8 + md5: df5020e8701d1a3eccfb5740c1e7af23 + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2516036 + timestamp: 1735628059861 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py311hb1a73f2_10.conda + sha256: 877e5831eb93d1b18c2218284806d8e6fb623a484c368bb0de785ca8586d97bf + md5: 2c13a5b72d87bad8a5af1f4b100e6a36 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2498193 + timestamp: 1735628323682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda + sha256: afa3489113154b5cb0724b0bf120b62df91f426dabfe5d02f2ba09e90d346b28 + md5: df3aee9c3e44489257a840b8354e77b9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 855653 + timestamp: 1732616048886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py311h5487e9b_0.conda + sha256: 0619169eb95f8d7285dd267be3559d3f71af071954792cdd9591a90602992cee + md5: fe331d12b7fccca2348a114c4742a0e0 + depends: + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 859892 + timestamp: 1732616872562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py311h917b07b_0.conda + sha256: 80b79a7d4ed8e16019b8c634cca66935d18fc98be358c76a6ead8c611306ee14 + md5: 183b74c576dc7f920dae168997dbd1dd + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 858954 + timestamp: 1732616142626 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/mojo/operators/magic.lock b/examples/mojo/operators/magic.lock new file mode 100644 index 0000000000..9473097321 --- /dev/null +++ b/examples/mojo/operators/magic.lock @@ -0,0 +1,2182 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/mojo/testing/magic.lock b/examples/mojo/testing/magic.lock new file mode 100644 index 0000000000..9473097321 --- /dev/null +++ b/examples/mojo/testing/magic.lock @@ -0,0 +1,2182 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/examples/notebooks/magic.lock b/examples/notebooks/magic.lock index a9ee6e08a6..ee529cc1e2 100644 --- a/examples/notebooks/magic.lock +++ b/examples/notebooks/magic.lock @@ -8,10 +8,6 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py312h66e93f0_5.conda @@ -19,75 +15,38 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.28.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.31.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda @@ -99,7 +58,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda @@ -107,171 +66,96 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.0-h00a82cf_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.0-hcb10f89_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.0-hcb10f89_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.0-h08228c5_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.34.0-h2b5623c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.34.0-h0121fbd_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.0-h081d1f1_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025013105-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025013105-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025013105-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025013105-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025013105-release.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py312h1d6d2e6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.1-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.0-py312h01725c0_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.1-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.2-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py312h3b7be25_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda @@ -279,33 +163,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.2-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.11-py312hcc812fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/argon2-cffi-bindings-21.2.0-py312hb2c0f52_5.conda @@ -313,76 +182,38 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py312h6f74592_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.28.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.31.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda @@ -394,7 +225,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda @@ -402,171 +233,96 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.0-h03ebaaf_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.0-h3b568fd_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.0-h3b568fd_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.0-h1e9d426_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-28_h1a9f1db_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-28_hab92f65_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.11.1-h6702fde_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20240808-pl5321h976ea20_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.34.0-hccf9d24_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.34.0-hb9b2b65_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-28_h411afd4_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.3-h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.0-hfc78867_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.46-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.5-h2e0c361_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025013105-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025013105-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025013105-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025013105-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025013105-release.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.2-py312h14eacfc_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.1-py312hb2c0f52_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.0-py312h8025657_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.0-py312h66f7834_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.1-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.8-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py312ha4e36d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.2-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.23.1-py312he7a34ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda @@ -574,32 +330,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.2-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.11-py312h998013c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda @@ -608,76 +349,38 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.12-py312hd8f9ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.28.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.31.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda @@ -689,172 +392,98 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.0-h819e3af_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.0-hf07054f_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.0-hf07054f_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.0-h4239455_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-28_h10e41b3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-28_hb3479ef_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.34.0-hdbe95d5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.34.0-h7081f7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-28_hc9a63f6_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.0-h636d7b7_8_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.46-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.48.0-h3f77e49_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025013105-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025013105-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025013105-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025013105-release.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025013105-release.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py312h8ae5369_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.1-py312hea69d52_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.0-py312h1f38498_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.0-py312hc40f475_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.1-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py312hb9d441b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.0-py312hb9d441b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.8-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312h024a12e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.22.3-py312hcd83bfe_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.2-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.23.1-py312hd60eec9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda @@ -862,25 +491,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.2-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda packages: @@ -921,98 +539,6 @@ packages: license_family: BSD size: 23712 timestamp: 1650670790230 -- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda - sha256: 95d4713e49ea92ae50cf42393683ede706b7875af5f7cb14c253438180afa732 - md5: 296b403617bafa89df4971567af79013 - depends: - - python >=3.9 - license: PSF-2.0 - license_family: PSF - size: 19351 - timestamp: 1733332029649 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda - sha256: 2e817805e8a4fed33f23f116ff5649f8651af693328e9ed82d9d11a951338693 - md5: 8219afa093757bbe07b9825eb1973ed9 - depends: - - __glibc >=2.17,<3.0.a0 - - aiohappyeyeballs >=2.3.0 - - aiosignal >=1.1.2 - - attrs >=17.3.0 - - frozenlist >=1.1.1 - - libgcc >=13 - - multidict >=4.5,<7.0 - - propcache >=0.2.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - yarl >=1.17.0,<2.0 - arch: x86_64 - platform: linux - license: MIT AND Apache-2.0 - license_family: Apache - size: 915358 - timestamp: 1734597073870 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.11-py312hcc812fe_0.conda - sha256: f28e81e458d19df4ca0002f8a92d7f647fa25e8179887a8676801dfe44edb1f2 - md5: 11fa88136d9bf39d2136b2378f7c10be - depends: - - aiohappyeyeballs >=2.3.0 - - aiosignal >=1.1.2 - - attrs >=17.3.0 - - frozenlist >=1.1.1 - - libgcc >=13 - - multidict >=4.5,<7.0 - - propcache >=0.2.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - yarl >=1.17.0,<2.0 - arch: aarch64 - platform: linux - license: MIT AND Apache-2.0 - license_family: Apache - size: 902422 - timestamp: 1734597104529 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.11-py312h998013c_0.conda - sha256: 446f078e7a7b892894d7f4851a278b7834ffb4f5632313646a55c3abe13690d4 - md5: c69c904691364cfb27d15aa7153e9c29 - depends: - - __osx >=11.0 - - aiohappyeyeballs >=2.3.0 - - aiosignal >=1.1.2 - - attrs >=17.3.0 - - frozenlist >=1.1.1 - - multidict >=4.5,<7.0 - - propcache >=0.2.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - yarl >=1.17.0,<2.0 - arch: arm64 - platform: osx - license: MIT AND Apache-2.0 - license_family: Apache - size: 875711 - timestamp: 1734597277258 -- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda - sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 - md5: 1a3981115a398535dbe3f6d5faae3d36 - depends: - - frozenlist >=1.1.0 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 13229 - timestamp: 1734342253061 -- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 - md5: 2934f256a8acfe48f6ebb4fce6cde29c - depends: - - python >=3.9 - - typing-extensions >=4.0.0 - license: MIT - license_family: MIT - size: 18074 - timestamp: 1733247158254 - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda sha256: f1455d2953e3eb6d71bc49881c8558d8e01888469dfd21061dd48afb6183e836 md5: 848d25bfbadf020ee4d4ba90e5668252 @@ -1137,2790 +663,1031 @@ packages: license_family: MIT size: 56370 timestamp: 1737819298139 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda - sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 - md5: 9c500858e88df50af3cc883d194de78a +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 108111 - timestamp: 1737509831651 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda - sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 - md5: 2630f030652970a5531e492f6b2a6dd3 - depends: - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - - libgcc >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 112658 - timestamp: 1737509863269 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda - sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a - md5: 0abd67c0f7b60d50348fbb32fef50b65 + - python >=3.9 + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + size: 6938256 + timestamp: 1738490268466 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + sha256: 4ce42860292a57867cfc81a5d261fb9886fc709a34eca52164cc8bbf6d03de9f + md5: 373374a3ed20141090504031dc7b693e depends: - - __osx >=11.0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 92562 - timestamp: 1737509877079 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda - sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 - md5: 55a8561fdbbbd34f50f57d9be12ed084 + - python >=3.9 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + size: 145482 + timestamp: 1738740460562 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + sha256: a05971bb80cca50ce9977aad3f7fc053e54ea7d5321523efc7b9a6e12901d3cd + md5: f0b4c8e370446ef89797608d60a564b3 + depends: + - python >=3.9 + - webencodings + - python + constrains: + - tinycss >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + size: 141405 + timestamp: 1737382993425 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + sha256: 0aba699344275b3972bd751f9403316edea2ceb942db12f9f493b63c74774a46 + md5: a30e9406c873940383555af4c873220d + depends: + - bleach ==6.2.0 pyh29332c3_4 + - tinycss2 + license: Apache-2.0 AND MIT + size: 4213 + timestamp: 1737382993425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf depends: - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - libgcc >=13 - - openssl >=3.3.1,<4.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 arch: x86_64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 47601 - timestamp: 1733991564405 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda - sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a - md5: 57ed2c445d7ef01d121b9bcea0522913 + license: MIT + license_family: MIT + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - libgcc >=13 - - openssl >=3.3.1,<4.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 arch: aarch64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 50036 - timestamp: 1733991581303 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda - sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 - md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + license: MIT + license_family: MIT + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d depends: - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - openssl >=3.3.1,<4.0a0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 arch: arm64 platform: osx - license: Apache-2.0 - license_family: Apache - size: 39925 - timestamp: 1733991649383 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda - sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 - md5: d7d4680337a14001b0e043e96529409b + license: MIT + license_family: MIT + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc-ng >=12 arch: x86_64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 236574 - timestamp: 1733975453350 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda - sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab - md5: fef806a0f6de853670c746bbece01966 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 depends: - - libgcc >=13 + - libgcc-ng >=12 arch: aarch64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 259031 - timestamp: 1733975520465 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda - sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a - md5: 145e5b4c9702ed279d7d68aaf096f77d + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab depends: - __osx >=11.0 arch: arm64 platform: osx - license: Apache-2.0 - license_family: Apache - size: 221863 - timestamp: 1733975576886 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda - sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b - md5: 3f4c1197462a6df2be6dc8241828fe93 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 arch: x86_64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 19086 - timestamp: 1733991637424 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda - sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 - md5: 3a1421d12435df5b4c412cc4c8fac64d - depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 arch: aarch64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 19740 - timestamp: 1733991625201 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda - sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 - md5: a8b6c17732d14ed49d0e9b59c43186bc - depends: - - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 arch: arm64 platform: osx - license: Apache-2.0 - license_family: Apache - size: 18068 - timestamp: 1733991869211 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda - sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 - md5: 9b3fb60fe57925a92f399bc3fc42eccf + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + noarch: python + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + md5: 9b347a7ec10940d3f7941ff6c460b551 + depends: + - cached_property >=1.5.2,<1.5.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4134 + timestamp: 1615209571450 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + md5: 576d629e47797577ab0f1b351297ef4a + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + size: 11065 + timestamp: 1615209567874 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 depends: - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 + - libffi >=3.4,<4.0a0 - libgcc >=13 - - libstdcxx >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 arch: x86_64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 54003 - timestamp: 1734024480949 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda - sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 - md5: e0772c59af4243a9b2565baa5d79e5b6 - depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 + license: MIT + license_family: MIT + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 - libgcc >=13 - - libstdcxx >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 arch: aarch64 platform: linux - license: Apache-2.0 - license_family: Apache - size: 55207 - timestamp: 1734024546663 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda - sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d - md5: ba41238f8e653998d7d2f42e3a8db054 + license: MIT + license_family: MIT + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e depends: - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - - libcxx >=18 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 arch: arm64 platform: osx - license: Apache-2.0 - license_family: Apache - size: 47078 - timestamp: 1734024749727 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda - sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 - md5: 5ce4df662d32d3123ea8da15571b6f51 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-compression >=0.3.0,<0.3.1.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 197731 - timestamp: 1734008380764 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda - sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e - md5: 28f00aa7fd9556c4c461328cf146c20b - depends: - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-compression >=0.3.0,<0.3.1.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - libgcc >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 190586 - timestamp: 1734008442362 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda - sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 - md5: 495c93a4f08b17deb3c04894512330e6 - depends: - - __osx >=11.0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-compression >=0.3.0,<0.3.1.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 152983 - timestamp: 1734008451473 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda - sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 - md5: 9a063178f1af0a898526cc24ba7be486 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 - - s2n >=1.5.11,<1.5.12.0a0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 157263 - timestamp: 1737207617838 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda - sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 - md5: 4e6771b45cb2b035c62d023dbf0dc000 - depends: - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 - - s2n >=1.5.11,<1.5.12.0a0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 160933 - timestamp: 1737207637279 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda - sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 - md5: d02e8f40ff69562903e70a1c6c48b009 - depends: - - __osx >=11.0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 136048 - timestamp: 1737207681224 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda - sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a - md5: 96c3e0221fa2da97619ee82faa341a73 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 194672 - timestamp: 1734025626798 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda - sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 - md5: 031ca33115d4b1eeb43f435d6215778c - depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - libgcc >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 169516 - timestamp: 1734025167885 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda - sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd - md5: c072045a6206f88015d02fcba1705ea1 - depends: - - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 134371 - timestamp: 1734025379525 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda - sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 - md5: caafc32928a5f7f3f7ef67d287689144 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-auth >=0.8.1,<0.8.2.0a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - - libgcc >=13 - - openssl >=3.4.0,<4.0a0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 115413 - timestamp: 1737558687616 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda - sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 - md5: e0a2869195f069db88b8932f5b00bee5 - depends: - - aws-c-auth >=0.8.1,<0.8.2.0a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - - libgcc >=13 - - openssl >=3.4.0,<4.0a0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 117875 - timestamp: 1737558720047 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda - sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 - md5: de65f5e4ab5020103fe70a0eba9432a0 - depends: - - __osx >=11.0 - - aws-c-auth >=0.8.1,<0.8.2.0a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 98731 - timestamp: 1737558731831 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda - sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc - md5: dcd498d493818b776a77fbc242fbf8e4 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 55911 - timestamp: 1736535960724 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda - sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 - md5: a78928881c652facde2a13ec6e776f3c - depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 58221 - timestamp: 1736536003041 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda - sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 - md5: e7b5498ac7b7ab921a907be38f3a8080 - depends: - - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 49872 - timestamp: 1736536152332 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda - sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 - md5: 74e8c3e4df4ceae34aa2959df4b28101 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 72762 - timestamp: 1733994347547 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda - sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da - md5: 3bd35b0adab3d743f09e0252cc441d6b - depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - - libgcc >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 72154 - timestamp: 1733994384415 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda - sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c - md5: e70e88a357a3749b67679c0788c5b08a - depends: - - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 70186 - timestamp: 1733994496998 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda - sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc - md5: 8a4e6fc8a3b285536202b5456a74a940 + license: MIT + license_family: MIT + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-auth >=0.8.1,<0.8.2.0a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-mqtt >=0.11.0,<0.11.1.0a0 - - aws-c-s3 >=0.7.9,<0.7.10.0a0 - - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - - libgcc >=13 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 353222 - timestamp: 1737565463079 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda - sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d - md5: 875968ebffe992b68faf2caebbf32f02 - depends: - - aws-c-auth >=0.8.1,<0.8.2.0a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-mqtt >=0.11.0,<0.11.1.0a0 - - aws-c-s3 >=0.7.9,<0.7.10.0a0 - - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - - libgcc >=13 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 283812 - timestamp: 1737565480034 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda - sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 - md5: c9c034d3239bf25687ca4dd985007ecd + - python >=3.9 + license: MIT + license_family: MIT + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 depends: - - __osx >=11.0 - - aws-c-auth >=0.8.1,<0.8.2.0a0 - - aws-c-cal >=0.8.1,<0.8.2.0a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - - aws-c-http >=0.9.2,<0.9.3.0a0 - - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-mqtt >=0.11.0,<0.11.1.0a0 - - aws-c-s3 >=0.7.9,<0.7.10.0a0 - - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - - libcxx >=18 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 235976 - timestamp: 1737565563139 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda - sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 - md5: b775e9f46dfa94b228a81d8e8c6d8b1d + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - - aws-crt-cpp >=0.29.9,<0.29.10.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 3144364 - timestamp: 1737576036746 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda - sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e - md5: e725d8fa77a6a5f38a78c5de914a5f40 - depends: - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - - aws-crt-cpp >=0.29.9,<0.29.10.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 3015109 - timestamp: 1737575993030 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda - sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c - md5: 156cfb45a1bb8cffc81e59047bb34f51 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + sha256: 7e87ef7c91574d9fac19faedaaee328a70f718c9b4ddadfdc0ba9ac021bd64af + md5: 74673132601ec2b7fc592755605f4c1b depends: - - __osx >=11.0 - - aws-c-common >=0.10.6,<0.10.7.0a0 - - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - - aws-checksums >=0.2.2,<0.2.3.0a0 - - aws-crt-cpp >=0.29.9,<0.29.10.0a0 - - libcurl >=8.11.1,<9.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 2874126 - timestamp: 1737577023623 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda - sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a - md5: 0a8838771cc2e985cd295e01ae83baf1 + - python >=3.9 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 12103 + timestamp: 1733503053903 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda + sha256: f88c3a7ff384d1726aea2cb2342cf67f1502915391860335c40ab81d7e381e30 + md5: 6be6dcb4bffd1d456bdad28341d507bd depends: - __glibc >=2.17,<3.0.a0 - - libcurl >=8.10.1,<9.0a0 - libgcc >=13 - libstdcxx >=13 - - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 arch: x86_64 platform: linux license: MIT license_family: MIT - size: 345117 - timestamp: 1728053909574 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda - sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 - md5: e0c3a906a41be769f0ae20ca3e31cfc0 + size: 2646757 + timestamp: 1737269937348 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py312h6f74592_0.conda + sha256: ae9ce5415b25c74bea70224822b3c3b12d7d670dbf1f2d63b6995575e05af38b + md5: f54f7b0bad14e9bbba256a21238d2630 depends: - - libcurl >=8.10.1,<9.0a0 - libgcc >=13 - libstdcxx >=13 - - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 arch: aarch64 platform: linux license: MIT license_family: MIT - size: 338650 - timestamp: 1728055589907 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda - sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e - md5: f093a11dcf3cdcca010b20a818fcc6dc + size: 2583530 + timestamp: 1737269969753 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.12-py312hd8f9ff3_0.conda + sha256: 0ba7ba5f5529bd9cf103d4684e2e9af8a7791a8732c3a0ac689f2d6f2223feca + md5: 92ebf61ce320b7060ead08666dbc9369 depends: - __osx >=11.0 - - libcurl >=8.10.1,<9.0a0 - - libcxx >=17 - - openssl >=3.3.2,<4.0a0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 arch: arm64 platform: osx license: MIT license_family: MIT - size: 294299 - timestamp: 1728054014060 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda - sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de - md5: 73f73f60854f325a55f1d31459f2ab73 + size: 2564438 + timestamp: 1737270030625 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 + md5: 9ce473d1d1be1cc3810856a48b3fab32 depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.3.2,<4.0a0 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 232351 - timestamp: 1728486729511 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda - sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 - md5: 94e73a7877743a85c57091d8afab2348 + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 14129 + timestamp: 1740385067843 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 depends: - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.3.2,<4.0a0 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 217132 - timestamp: 1728488096615 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda - sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a - md5: d7b71593a937459f2d4b67e1a4727dc2 + - python >=3.6 + license: PSF-2.0 + license_family: PSF + size: 24062 + timestamp: 1615232388757 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e depends: - - __osx >=11.0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - libcxx >=17 - - openssl >=3.3.2,<4.0a0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 166907 - timestamp: 1728486882502 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda - sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 - md5: 7eb66060455c7a47d9dcdbfa9f46579b + - python >=3.9 + license: MIT and PSF-2.0 + size: 20486 + timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + sha256: 28d25ea375ebab4bf7479228f8430db20986187b04999136ff5c722ebd32eb60 + md5: ef8b5fca76806159fc25b4f48d8737eb depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - arch: x86_64 - platform: linux + - python >=3.9 license: MIT license_family: MIT - size: 549342 - timestamp: 1728578123088 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda - sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 - md5: 221e1e5ecb2643e113f32b3229d5ba33 - depends: - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 502934 - timestamp: 1728580241002 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda - sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 - md5: 704238ef05d46144dae2e6b5853df8bc + size: 28348 + timestamp: 1733569440265 +- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 + md5: d3549fd50d450b6d9e7dddff25dd2110 depends: - - __osx >=11.0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 - - libcxx >=17 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 438636 - timestamp: 1728578216193 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda - sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba - md5: 13de36be8de3ae3f05ba127631599213 + - cached-property >=1.3.0 + - python >=3.9,<4 + license: MPL-2.0 + license_family: MOZILLA + size: 16705 + timestamp: 1733327494780 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + sha256: 622516185a7c740d5c7f27016d0c15b45782c1501e5611deec63fd70344ce7c8 + md5: 7ee49e89531c0dcbba9466f6d115d585 depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libxml2 >=2.12.7,<3.0a0 - - openssl >=3.3.2,<4.0a0 - arch: x86_64 - platform: linux + - python >=3.9 + - typing_extensions license: MIT license_family: MIT - size: 149312 - timestamp: 1728563338704 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda - sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 - md5: 793b1080ab2d958980f137a8643cd6e8 + size: 51846 + timestamp: 1733327599467 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 depends: - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libxml2 >=2.12.7,<3.0a0 - - openssl >=3.3.2,<4.0a0 - arch: aarch64 - platform: linux + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 license: MIT license_family: MIT - size: 140832 - timestamp: 1728565334900 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda - sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 - md5: 7a187cd7b1445afc80253bb186a607cc + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e depends: - - __osx >=11.0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - libcxx >=17 - - libxml2 >=2.12.7,<3.0a0 - - openssl >=3.3.2,<4.0a0 - arch: arm64 - platform: osx + - python >=3.9 license: MIT license_family: MIT - size: 121278 - timestamp: 1728563418777 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda - sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 - md5: 7c1980f89dd41b097549782121a73490 + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + sha256: c84d012a245171f3ed666a8bf9319580c269b7843ffa79f26468842da3abd5df + md5: 2ca8e6dbc86525c8b95e3c0ffa26442e depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 - - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 287366 - timestamp: 1728729530295 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda - sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc - md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 - depends: - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 - - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 - - libgcc >=13 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 260547 - timestamp: 1728730924071 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda - sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d - md5: c49fbc5233fcbaa86391162ff1adef38 + - python >=3.8 + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=3.0,<5.0 + - certifi + license: BSD-3-Clause + license_family: BSD + size: 48959 + timestamp: 1731707562362 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 depends: - - __osx >=11.0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 - - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 - - libcxx >=17 - arch: arm64 - platform: osx + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 license: MIT license_family: MIT - size: 196032 - timestamp: 1728729672889 -- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - sha256: f6205d3a62e87447e06e98d911559be0208d824976d77ab092796c9176611fcb - md5: 3e23f7db93ec14c80525257d8affac28 + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 depends: - python >=3.9 - - pytz >=2015.7 license: BSD-3-Clause license_family: BSD - size: 6551057 - timestamp: 1733236466015 -- conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda - sha256: f334115c6b0c6c2cd0d28595365f205ec7eaa60bcc5ff91a75d7245f728be820 - md5: a38b801f2bcc12af80c2e02a9e4ce7d9 + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c depends: - python >=3.9 - license: MIT - license_family: MIT - size: 18816 - timestamp: 1733771192649 -- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda - sha256: fca842ab7be052eea1037ebee17ac25cc79c626382dd2187b5c6e007b9d9f65f - md5: d48f7e9fdec44baf6d1da416fe402b04 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 depends: - python >=3.9 - - soupsieve >=1.2 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + size: 33781 + timestamp: 1736252433366 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + sha256: 33cfd339bb4efac56edf93474b37ddc049e08b1b4930cf036c893cc1f5a1f32a + md5: b40131ab6a36ac2c09b7c57d4d3fbf99 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil + - python >=3.8 + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + size: 119084 + timestamp: 1719845605084 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda + sha256: 072534d4d379225b2c3a4e38bc7730b65ae171ac7f0c2d401141043336e97980 + md5: 9eb15d654daa0ef5a98802f586bb4ffc + depends: + - __osx + - appnope + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil + - python >=3.8 + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + size: 119568 + timestamp: 1719845667420 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda + sha256: b1b940cfe85d5f0aaed83ef8c9f07ee80daa68acb05feeb5142d620472b01e0d + md5: 9de86472b8f207fb098c69daaad50e67 + depends: + - __unix + - pexpect >4.3 + - python >=3.10 + - decorator + - exceptiongroup + - jedi >=0.16 + - matplotlib-inline + - pickleshare + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.4.0 + - stack_data + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - python + license: BSD-3-Clause + license_family: BSD + size: 636676 + timestamp: 1738421264236 +- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed + md5: 0b0154421989637d424ccf0f104be51a + depends: + - arrow >=0.15.0 + - python >=3.9 license: MIT license_family: MIT - size: 118042 - timestamp: 1733230951790 -- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - sha256: a05971bb80cca50ce9977aad3f7fc053e54ea7d5321523efc7b9a6e12901d3cd - md5: f0b4c8e370446ef89797608d60a564b3 + size: 19832 + timestamp: 1733493720346 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 + md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 depends: + - parso >=0.8.3,<0.9.0 - python >=3.9 - - webencodings - - python - constrains: - - tinycss >=1.1.0,<1.5 license: Apache-2.0 AND MIT - size: 141405 - timestamp: 1737382993425 -- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - sha256: 0aba699344275b3972bd751f9403316edea2ceb942db12f9f493b63c74774a46 - md5: a30e9406c873940383555af4c873220d + size: 843646 + timestamp: 1733300981994 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd depends: - - bleach ==6.2.0 pyh29332c3_4 - - tinycss2 - license: Apache-2.0 AND MIT - size: 4213 - timestamp: 1737382993425 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda - sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f - md5: b0b867af6fc74b2a0aa206da29c0f3cf + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda + sha256: 61bca2dac194c44603446944745566d7b4e55407280f6f6cea8bbe4de26b558f + md5: cd170f82d8e5b355dfdea6adab23e4af + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 31573 + timestamp: 1733272196759 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda + sha256: 76ccb7bffc7761d1d3133ffbe1f7f1710a0f0d9aaa9f7ea522652e799f3601f4 + md5: 6b51f7459ea4073eeb5057207e2e1e3d depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 hb9d3cd8_2 arch: x86_64 platform: linux - license: MIT - license_family: MIT - size: 349867 - timestamp: 1725267732089 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda - sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d - md5: e1e9727063057168d95f27a032acd0a4 - depends: - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 h86ecc28_2 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 356878 - timestamp: 1725267878508 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda - sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af - md5: a83c2ef76ccb11bc2349f4f17696b15d + license: BSD-3-Clause + license_family: BSD + size: 17277 + timestamp: 1725303032027 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_1.conda + sha256: 908448e2946c8fd8e28f5c7de4ed52548d227fae2994febf1050179b2590dbdc + md5: 2257c5f33024274faadf6a88a7d62807 depends: - - __osx >=11.0 - - libcxx >=17 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 hd74edd7_2 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 339360 - timestamp: 1725268143995 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d - md5: 62ee74e96c5ebb0af99386de58cf9553 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: bzip2-1.0.6 - license_family: BSD - size: 252783 - timestamp: 1720974456583 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb - md5: 56398c28220513b9ea13d7b450acfb20 - depends: - - libgcc-ng >=12 arch: aarch64 platform: linux - license: bzip2-1.0.6 - license_family: BSD - size: 189884 - timestamp: 1720974504976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: bzip2-1.0.6 + license: BSD-3-Clause license_family: BSD - size: 122909 - timestamp: 1720974522888 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda - sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 - md5: e2775acf57efd5af15b8e3d1d74d72d3 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 206085 - timestamp: 1734208189009 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda - sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe - md5: 356da36f35d36dcba16e43f1589d4e39 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 215979 - timestamp: 1734208193181 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda - sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f - md5: c1c999a38a4303b29d75c636eaa13cf9 + size: 17821 + timestamp: 1725303138276 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py312h81bd7bf_1.conda + sha256: f6fb3734e967d1cd0cde32844ee952809f6c0a49895da7ec1c8cfdf97739b947 + md5: 80f403c03290e1662be03e026fb5f8ab depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 179496 - timestamp: 1734208291879 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda - sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 - md5: 19f3a56f68d2fd06c516076bff482c52 - arch: x86_64 - platform: linux - license: ISC - size: 158144 - timestamp: 1738298224464 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda - sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec - md5: 462cb166cd2e26a396f856510a3aff67 - arch: aarch64 - platform: linux - license: ISC - size: 158290 - timestamp: 1738299057652 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda - sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 - md5: 3569d6a9141adc64d2fe4797f3289e06 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 arch: arm64 platform: osx - license: ISC - size: 158425 - timestamp: 1738298167688 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - noarch: python - sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 - md5: 9b347a7ec10940d3f7941ff6c460b551 - depends: - - cached_property >=1.5.2,<1.5.3.0a0 - license: BSD-3-Clause - license_family: BSD - size: 4134 - timestamp: 1615209571450 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 - md5: 576d629e47797577ab0f1b351297ef4a - depends: - - python >=3.6 license: BSD-3-Clause license_family: BSD - size: 11065 - timestamp: 1615209567874 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - sha256: 048c16a9cbcb1fbad02083414d3bc7c1d0eea4b39aee6aa6bf8d1d5089ca8bad - md5: 6feb87357ecd66733be3279f16a8c400 + size: 17865 + timestamp: 1725303130815 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + sha256: be992a99e589146f229c58fe5083e0b60551d774511c494f91fe011931bd7893 + md5: a3cead9264b331b32fe8f0aabc967522 depends: + - attrs >=22.2.0 + - importlib_resources >=1.4.0 + - jsonschema-specifications >=2023.03.6 + - pkgutil-resolve-name >=1.3.10 - python >=3.9 - license: ISC - size: 161642 - timestamp: 1734380604767 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 - md5: a861504bbea4161a9170b85d4d2be840 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 294403 - timestamp: 1725560714366 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda - sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 - md5: 1a256e5581b1099e9295cb84d53db3ea - depends: - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux + - referencing >=0.28.4 + - rpds-py >=0.7.1 license: MIT license_family: MIT - size: 312892 - timestamp: 1725561779888 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f - md5: 19a5456f72f505881ba493979777b24e + size: 74256 + timestamp: 1733472818764 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + sha256: 37127133837444cf0e6d1a95ff5a505f8214ed4e89e8e9343284840e674c6891 + md5: 3b519bc21bc80e60b456f1e62962a766 depends: - - __osx >=11.0 - - libffi >=3.4,<4.0a0 - - pycparser - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx + - python >=3.9 + - referencing >=0.31.0 license: MIT license_family: MIT - size: 281206 - timestamp: 1725560813378 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b - md5: e83a31202d1c0a000fce3e9cf3825875 + size: 16170 + timestamp: 1733493624968 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda + sha256: 6e0184530011961a0802fda100ecdfd4b0eca634ed94c37e553b72e21c26627d + md5: a5b1a8065857cc4bd8b7a38d063bb728 depends: - - python >=3.9 + - fqdn + - idna + - isoduration + - jsonpointer >1.13 + - jsonschema >=4.23.0,<4.23.1.0a0 + - rfc3339-validator + - rfc3986-validator >0.1.0 + - uri-template + - webcolors >=24.6.0 license: MIT license_family: MIT - size: 47438 - timestamp: 1735929811779 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab - md5: f22f4d4970e09d68a10b922cbb0408d3 + size: 7135 + timestamp: 1733472820035 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda + sha256: 1565c8b1423a37fca00fe0ab2a17cd8992c2ecf23e7867a1c9f6f86a9831c196 + md5: 0b4c3908e5a38ea22ebb98ee5888c768 depends: - - __unix + - importlib-metadata >=4.8.3 + - jupyter_server >=1.1.2 - python >=3.9 license: BSD-3-Clause license_family: BSD - size: 84705 - timestamp: 1734858922844 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 + size: 55221 + timestamp: 1733493006611 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 license: BSD-3-Clause license_family: BSD - size: 27011 - timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda - sha256: 7e87ef7c91574d9fac19faedaaee328a70f718c9b4ddadfdc0ba9ac021bd64af - md5: 74673132601ec2b7fc592755605f4c1b + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 depends: - - python >=3.9 + - __unix + - platformdirs >=2.5 + - python >=3.8 - traitlets >=5.3 license: BSD-3-Clause license_family: BSD - size: 12103 - timestamp: 1733503053903 -- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda - sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f - md5: 3e087f072ce03c43a9b60522f5d0ca2f - depends: - - aiohttp - - dill >=0.3.0,<0.3.8 - - fsspec >=2021.11.1 - - huggingface_hub >=0.14.0,<1.0.0 - - importlib-metadata - - multiprocess - - numpy >=1.17 + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + sha256: 37e6ac3ccf7afcc730c3b93cb91a13b9ae827fd306f35dd28f958a74a14878b5 + md5: f56000b36f09ab7533877e695e4e8cb0 + depends: + - jsonschema-with-format-nongpl >=4.18.0 - packaging - - pandas - - pyarrow >=8.0.0 - - python >=3.8.0 - - python-xxhash - - pyyaml >=5.1 - - requests >=2.19.0 - - tqdm >=4.62.1 - license: Apache-2.0 - license_family: Apache - size: 347303 - timestamp: 1691593908658 -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda - sha256: f88c3a7ff384d1726aea2cb2342cf67f1502915391860335c40ab81d7e381e30 - md5: 6be6dcb4bffd1d456bdad28341d507bd - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 2646757 - timestamp: 1737269937348 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.12-py312h6f74592_0.conda - sha256: ae9ce5415b25c74bea70224822b3c3b12d7d670dbf1f2d63b6995575e05af38b - md5: f54f7b0bad14e9bbba256a21238d2630 - depends: - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 2583530 - timestamp: 1737269969753 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.12-py312hd8f9ff3_0.conda - sha256: 0ba7ba5f5529bd9cf103d4684e2e9af8a7791a8732c3a0ac689f2d6f2223feca - md5: 92ebf61ce320b7060ead08666dbc9369 - depends: - - __osx >=11.0 - - libcxx >=18 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 2564438 - timestamp: 1737270030625 -- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda - sha256: 84e5120c97502a3785e8c3241c3bf51f64b4d445f13b4d2445db00d9816fe479 - md5: d622d8d7ee8868870f9cbe259f381181 - depends: - - python >=3.9 - license: BSD-2-Clause - license_family: BSD - size: 14068 - timestamp: 1733236549190 -- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be - md5: 961b3a227b437d82ad7054484cfa71b2 - depends: - - python >=3.6 - license: PSF-2.0 - license_family: PSF - size: 24062 - timestamp: 1615232388757 -- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda - sha256: d614bcff10696f1efc714df07651b50bf3808401fcc03814309ecec242cc8870 - md5: 0cef44b1754ae4d6924ac0eef6b9fdbe - depends: - - python >=3.9 - - wrapt <2,>=1.10 - license: MIT - license_family: MIT - size: 14382 - timestamp: 1737987072859 -- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda - sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 - md5: 5e4f3466526c52bc9af2d2353a1460bd - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - size: 87553 - timestamp: 1690101185422 -- conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda - sha256: 3ec40ccf63f2450c5e6c7dd579e42fc2e97caf0d8cd4ba24aa434e6fc264eda0 - md5: 5fbd60d61d21b4bd2f9d7a48fe100418 - depends: - - python >=3.9,<4.0.0 - - sniffio - constrains: - - aioquic >=1.0.0 - - wmi >=1.5.1 - - httpx >=0.26.0 - - trio >=0.23 - - cryptography >=43 - - httpcore >=1.0.0 - - idna >=3.7 - - h2 >=4.1.0 - license: ISC - license_family: OTHER - size: 172172 - timestamp: 1733256829961 -- conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda - sha256: b91a19eb78edfc2dbb36de9a67f74ee2416f1b5273dd7327abe53f2dbf864736 - md5: da16dd3b0b71339060cd44cb7110ddf9 - depends: - - dnspython >=2.0.0 - - idna >=2.0.0 - - python >=3.9 - license: Unlicense - size: 44401 - timestamp: 1733300827551 -- conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda - sha256: e0d0fdf587aa0ed0ff08b2bce3ab355f46687b87b0775bfba01cc80a859ee6a2 - md5: 0794f8807ff2c6f020422cacb1bd7bfa - depends: - - email-validator >=2.2.0,<2.2.1.0a0 - license: Unlicense - size: 6552 - timestamp: 1733300828176 -- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda - sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 - md5: a16662747cdeb9abbac74d0057cc976e - depends: - - python >=3.9 - license: MIT and PSF-2.0 - size: 20486 - timestamp: 1733208916977 -- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda - sha256: 28d25ea375ebab4bf7479228f8430db20986187b04999136ff5c722ebd32eb60 - md5: ef8b5fca76806159fc25b4f48d8737eb - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 28348 - timestamp: 1733569440265 -- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda - sha256: 5e1e3d5cf306d9b3b5fe0d45a9e8440e8770ba7e4a5fac1ac847ca693b0dc064 - md5: 753382711adab47269f0bfe994906bc4 - depends: - python >=3.9 - - starlette >=0.40.0,<0.46.0 - - typing_extensions >=4.8.0 - - pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 - - email_validator >=2.0.0 - - fastapi-cli >=0.0.5 - - httpx >=0.23.0 - - jinja2 >=3.1.5 - - python-multipart >=0.0.18 - - uvicorn-standard >=0.12.0 + - python-json-logger >=2.0.4 + - pyyaml >=5.3 + - referencing + - rfc3339-validator + - rfc3986-validator >=0.1.1 + - traitlets >=5.3 - python - license: MIT - license_family: MIT - size: 77940 - timestamp: 1738326226051 -- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda - sha256: 300683731013b7221922339cd40430bb3c2ddeeb658fd7e37f5099ffe64e4db0 - md5: d960e0ea9e1c561aa928f6c4439f04c7 - depends: - - python >=3.9 - - rich-toolkit >=0.11.1 - - typer >=0.12.3 - - uvicorn-standard >=0.15.0 - license: MIT - license_family: MIT - size: 15546 - timestamp: 1734302408607 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda - sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 - md5: 7f402b4a1007ee355bc50ce4d24d4a57 - depends: - - python >=3.9 - license: Unlicense - size: 17544 - timestamp: 1737517924333 -- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 - md5: d3549fd50d450b6d9e7dddff25dd2110 - depends: - - cached-property >=1.3.0 - - python >=3.9,<4 - license: MPL-2.0 - license_family: MOZILLA - size: 16705 - timestamp: 1733327494780 -- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 - md5: 9ae35c3d96db2c94ce0cef86efdfa2cb - depends: - - libgcc-ng >=12 - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - arch: x86_64 - platform: linux - license: GPL-2.0-only OR FTL - size: 634972 - timestamp: 1694615932610 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 - md5: a5ab74c5bd158c3d5532b66d8d83d907 - depends: - - libgcc-ng >=12 - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - arch: aarch64 - platform: linux - license: GPL-2.0-only OR FTL - size: 642092 - timestamp: 1694617858496 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 - md5: e6085e516a3e304ce41a8ee08b9b89ad - depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - arch: arm64 - platform: osx - license: GPL-2.0-only OR FTL - size: 596430 - timestamp: 1694616332835 -- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda - sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f - md5: fb986e1c089021979dc79606af78ef8f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 60939 - timestamp: 1737645356438 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda - sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d - md5: 9090bf5c43e8011fb2e9a82a1db20cc3 - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 60472 - timestamp: 1737645511278 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda - sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d - md5: 5eb3715c7e3fa9b533361375bfefe6ee - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 57256 - timestamp: 1737645503377 -- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda - sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 - md5: e041ad4c43ab5e10c74587f95378ebc7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 137756 - timestamp: 1734650349242 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a - md5: d411fc29e338efb48c5fd4576d71d881 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 119654 - timestamp: 1726600001928 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda - sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa - md5: 4ff634d515abbf664774b5e1168a9744 - depends: - - libgcc >=13 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 106638 - timestamp: 1726599967617 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 - md5: 57a511a5905caa37540eb914dfcbf1fb - depends: - - __osx >=11.0 - - libcxx >=17 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 82090 - timestamp: 1726600145480 -- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda - sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 - md5: ff862eebdfeb2fd048ae9dc92510baca - depends: - - gflags >=2.2.2,<2.3.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD - size: 143452 - timestamp: 1718284177264 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda - sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 - md5: 08940a32c6ced3703d1412dd37df4f62 + size: 23647 + timestamp: 1738765986736 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda + sha256: be5f9774065d94c4a988f53812b83b67618bec33fcaaa005a98067d506613f8a + md5: 6ba8c206b5c6f52b82435056cf74ee46 depends: - - gflags >=2.2.2,<2.3.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: aarch64 - platform: linux + - anyio >=3.1.0 + - argon2-cffi >=21.1 + - jinja2 >=3.0.3 + - jupyter_client >=7.4.4 + - jupyter_core >=4.12,!=5.0.* + - jupyter_events >=0.11.0 + - jupyter_server_terminals >=0.4.4 + - nbconvert-core >=6.4.4 + - nbformat >=5.3.0 + - overrides >=5.0 + - packaging >=22.0 + - prometheus_client >=0.9 + - python >=3.9 + - pyzmq >=24 + - send2trash >=1.8.2 + - terminado >=0.8.3 + - tornado >=6.2.0 + - traitlets >=5.6.0 + - websocket-client >=1.7 license: BSD-3-Clause license_family: BSD - size: 145811 - timestamp: 1718284208668 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda - sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 - md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + size: 327747 + timestamp: 1734702771032 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda + sha256: 0890fc79422191bc29edf17d7b42cff44ba254aa225d31eb30819f8772b775b8 + md5: 2d983ff1b82a1ccb6f2e9d8784bdd6bd depends: - - __osx >=11.0 - - gflags >=2.2.2,<2.3.0a0 - - libcxx >=16 - arch: arm64 - platform: osx + - python >=3.9 + - terminado >=0.8.3 license: BSD-3-Clause license_family: BSD - size: 112215 - timestamp: 1718284365403 -- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda - sha256: d8d19575a827f2c62500949b9536efdd6b5406c9f546a73b6a87ac90b03a5875 - md5: 4861e30ff0cd566ea6fb4593e3b7c22a - depends: - - protobuf >=3.20.2,<6.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 116522 - timestamp: 1731459019854 -- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda - sha256: 622516185a7c740d5c7f27016d0c15b45782c1501e5611deec63fd70344ce7c8 - md5: 7ee49e89531c0dcbba9466f6d115d585 - depends: - - python >=3.9 - - typing_extensions - license: MIT - license_family: MIT - size: 51846 - timestamp: 1733327599467 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda - sha256: 843ddad410c370672a8250470697027618f104153612439076d4d7b91eeb7b5c - md5: 825927dc7b0f287ef8d4d0011bb113b1 - depends: - - hpack >=4.0,<5 - - hyperframe >=6.0,<7 - - python >=3.9 - license: MIT - license_family: MIT - size: 52000 - timestamp: 1733298867359 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba - md5: 0a802cb9888dd14eeefc611f05c40b6e - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 30731 - timestamp: 1737618390337 -- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda - sha256: c84d012a245171f3ed666a8bf9319580c269b7843ffa79f26468842da3abd5df - md5: 2ca8e6dbc86525c8b95e3c0ffa26442e - depends: - - python >=3.8 - - h11 >=0.13,<0.15 - - h2 >=3,<5 - - sniffio 1.* - - anyio >=3.0,<5.0 - - certifi - license: BSD-3-Clause - license_family: BSD - size: 48959 - timestamp: 1731707562362 -- conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda - sha256: 621e7e050b888e5239d33e37ea72d6419f8367e5babcad38b755586f20264796 - md5: 8b1160b32557290b64d5be68db3d996d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 101872 - timestamp: 1732707756745 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda - sha256: 0bd1f30224af142711d11033a7469ae402a1147143f399f7341bbc1d8178c722 - md5: 5e70a6de59352f9a52e9caa7f3447390 - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 101255 - timestamp: 1732707891645 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda - sha256: 5e93cda79e32e8c0039e05ea1939e688da336187dab025f699b42ef529e848be - md5: e1747a8e8d2aca5499aaea9993bf31ff - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 85623 - timestamp: 1732707871414 -- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 - md5: d6989ead454181f4f9bc987d3dc4e285 - depends: - - anyio - - certifi - - httpcore 1.* - - idna - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 63082 - timestamp: 1733663449209 -- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.28.0-pyhd8ed1ab_0.conda - sha256: 3c48ffeb8a425eeba5dfa81a4da4b738a12d2104da0c3b443185029718dd6e48 - md5: 317f31a6fe151756ef10e7ed97a15f8a - depends: - - filelock - - fsspec >=2023.5.0 - - packaging >=20.9 - - python >=3.9 - - pyyaml >=5.1 - - requests - - tqdm >=4.42.1 - - typing-extensions >=3.7.4.3 - - typing_extensions >=3.7.4.3 - license: Apache-2.0 - license_family: APACHE - size: 284361 - timestamp: 1738349452337 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 17397 - timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 - md5: 268203e8b983fddb6412b36f2024e75c - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 12282786 - timestamp: 1720853454991 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 - md5: 5eb22c1d7b3fc4abb50d92d621583137 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 11857802 - timestamp: 1720853997952 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 - md5: 39a4f67be3286c86d696df570b1201b7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 49765 - timestamp: 1733211921194 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda - sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 - md5: 315607a3030ad5d5227e76e0733798ff - depends: - - python >=3.9 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - size: 28623 - timestamp: 1733223207185 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 - md5: c85c76dc67d75619a92f51dfbce06992 - depends: - - python >=3.9 - - zipp >=3.1.0 - constrains: - - importlib-resources >=6.5.2,<6.5.3.0a0 - license: Apache-2.0 - license_family: APACHE - size: 33781 - timestamp: 1736252433366 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda - sha256: 33cfd339bb4efac56edf93474b37ddc049e08b1b4930cf036c893cc1f5a1f32a - md5: b40131ab6a36ac2c09b7c57d4d3fbf99 - depends: - - __linux - - comm >=0.1.1 - - debugpy >=1.6.5 - - ipython >=7.23.1 - - jupyter_client >=6.1.12 - - jupyter_core >=4.12,!=5.0.* - - matplotlib-inline >=0.1 - - nest-asyncio - - packaging - - psutil - - python >=3.8 - - pyzmq >=24 - - tornado >=6.1 - - traitlets >=5.4.0 - license: BSD-3-Clause - license_family: BSD - size: 119084 - timestamp: 1719845605084 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda - sha256: 072534d4d379225b2c3a4e38bc7730b65ae171ac7f0c2d401141043336e97980 - md5: 9eb15d654daa0ef5a98802f586bb4ffc - depends: - - __osx - - appnope - - comm >=0.1.1 - - debugpy >=1.6.5 - - ipython >=7.23.1 - - jupyter_client >=6.1.12 - - jupyter_core >=4.12,!=5.0.* - - matplotlib-inline >=0.1 - - nest-asyncio - - packaging - - psutil - - python >=3.8 - - pyzmq >=24 - - tornado >=6.1 - - traitlets >=5.4.0 - license: BSD-3-Clause - license_family: BSD - size: 119568 - timestamp: 1719845667420 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.31.0-pyh707e725_0.conda - sha256: e10d1172ebf950f8f087f0d9310d215f5ddb8f3ad247bfa58ab5a909b3cabbdc - md5: 1d7fcd803dfa936a6c3bd051b293241c - depends: - - __unix - - decorator - - exceptiongroup - - jedi >=0.16 - - matplotlib-inline - - pexpect >4.3 - - pickleshare - - prompt-toolkit >=3.0.41,<3.1.0 - - pygments >=2.4.0 - - python >=3.10 - - stack_data - - traitlets >=5.13.0 - - typing_extensions >=4.6 - license: BSD-3-Clause - license_family: BSD - size: 600761 - timestamp: 1734788248334 -- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed - md5: 0b0154421989637d424ccf0f104be51a - depends: - - arrow >=0.15.0 - - python >=3.9 - license: MIT - license_family: MIT - size: 19832 - timestamp: 1733493720346 -- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 - md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 - depends: - - parso >=0.8.3,<0.9.0 - - python >=3.9 - license: Apache-2.0 AND MIT - size: 843646 - timestamp: 1733300981994 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda - sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 - md5: 2752a6ed44105bfb18c9bef1177d9dcd - depends: - - markupsafe >=2.0 - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 112561 - timestamp: 1734824044952 -- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.10.0-pyhd8ed1ab_1.conda - sha256: 61bca2dac194c44603446944745566d7b4e55407280f6f6cea8bbe4de26b558f - md5: cd170f82d8e5b355dfdea6adab23e4af - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 31573 - timestamp: 1733272196759 -- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda - sha256: 76ccb7bffc7761d1d3133ffbe1f7f1710a0f0d9aaa9f7ea522652e799f3601f4 - md5: 6b51f7459ea4073eeb5057207e2e1e3d - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 17277 - timestamp: 1725303032027 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jsonpointer-3.0.0-py312h996f985_1.conda - sha256: 908448e2946c8fd8e28f5c7de4ed52548d227fae2994febf1050179b2590dbdc - md5: 2257c5f33024274faadf6a88a7d62807 - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 17821 - timestamp: 1725303138276 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py312h81bd7bf_1.conda - sha256: f6fb3734e967d1cd0cde32844ee952809f6c0a49895da7ec1c8cfdf97739b947 - md5: 80f403c03290e1662be03e026fb5f8ab - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 17865 - timestamp: 1725303130815 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda - sha256: be992a99e589146f229c58fe5083e0b60551d774511c494f91fe011931bd7893 - md5: a3cead9264b331b32fe8f0aabc967522 - depends: - - attrs >=22.2.0 - - importlib_resources >=1.4.0 - - jsonschema-specifications >=2023.03.6 - - pkgutil-resolve-name >=1.3.10 - - python >=3.9 - - referencing >=0.28.4 - - rpds-py >=0.7.1 - license: MIT - license_family: MIT - size: 74256 - timestamp: 1733472818764 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda - sha256: 37127133837444cf0e6d1a95ff5a505f8214ed4e89e8e9343284840e674c6891 - md5: 3b519bc21bc80e60b456f1e62962a766 - depends: - - python >=3.9 - - referencing >=0.31.0 - license: MIT - license_family: MIT - size: 16170 - timestamp: 1733493624968 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.23.0-hd8ed1ab_1.conda - sha256: 6e0184530011961a0802fda100ecdfd4b0eca634ed94c37e553b72e21c26627d - md5: a5b1a8065857cc4bd8b7a38d063bb728 - depends: - - fqdn - - idna - - isoduration - - jsonpointer >1.13 - - jsonschema >=4.23.0,<4.23.1.0a0 - - rfc3339-validator - - rfc3986-validator >0.1.0 - - uri-template - - webcolors >=24.6.0 - license: MIT - license_family: MIT - size: 7135 - timestamp: 1733472820035 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_1.conda - sha256: 1565c8b1423a37fca00fe0ab2a17cd8992c2ecf23e7867a1c9f6f86a9831c196 - md5: 0b4c3908e5a38ea22ebb98ee5888c768 - depends: - - importlib-metadata >=4.8.3 - - jupyter_server >=1.1.2 - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 55221 - timestamp: 1733493006611 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a - md5: 4ebae00eae9705b0c3d6d1018a81d047 - depends: - - importlib-metadata >=4.8.3 - - jupyter_core >=4.12,!=5.0.* - - python >=3.9 - - python-dateutil >=2.8.2 - - pyzmq >=23.0 - - tornado >=6.2 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 106342 - timestamp: 1733441040958 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd - md5: 0a2980dada0dd7fd0998f0342308b1b1 - depends: - - __unix - - platformdirs >=2.5 - - python >=3.8 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 57671 - timestamp: 1727163547058 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.11.0-pyhd8ed1ab_0.conda - sha256: eeb32aa58d37b130387628d5c151092f6d3fcf0a6964294bef06d6bac117f3c4 - md5: 2d8876ca6bda213622dfbc3d1da56ecb - depends: - - jsonschema-with-format-nongpl >=4.18.0 - - packaging - - python >=3.9 - - python-json-logger >=2.0.4 - - pyyaml >=5.3 - - referencing - - rfc3339-validator - - rfc3986-validator >=0.1.1 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - size: 22160 - timestamp: 1734531779868 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.15.0-pyhd8ed1ab_0.conda - sha256: be5f9774065d94c4a988f53812b83b67618bec33fcaaa005a98067d506613f8a - md5: 6ba8c206b5c6f52b82435056cf74ee46 - depends: - - anyio >=3.1.0 - - argon2-cffi >=21.1 - - jinja2 >=3.0.3 - - jupyter_client >=7.4.4 - - jupyter_core >=4.12,!=5.0.* - - jupyter_events >=0.11.0 - - jupyter_server_terminals >=0.4.4 - - nbconvert-core >=6.4.4 - - nbformat >=5.3.0 - - overrides >=5.0 - - packaging >=22.0 - - prometheus_client >=0.9 - - python >=3.9 - - pyzmq >=24 - - send2trash >=1.8.2 - - terminado >=0.8.3 - - tornado >=6.2.0 - - traitlets >=5.6.0 - - websocket-client >=1.7 - license: BSD-3-Clause - license_family: BSD - size: 327747 - timestamp: 1734702771032 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - sha256: 0890fc79422191bc29edf17d7b42cff44ba254aa225d31eb30819f8772b775b8 - md5: 2d983ff1b82a1ccb6f2e9d8784bdd6bd - depends: - - python >=3.9 - - terminado >=0.8.3 - license: BSD-3-Clause - license_family: BSD - size: 19711 - timestamp: 1733428049134 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda - sha256: 9d033314060993522e1ad999ded9da316a8b928d11b7a58c254597382239a72e - md5: ec1f95d39ec862a7a87de0662a98ce3e - depends: - - async-lru >=1.0.0 - - httpx >=0.25.0 - - importlib-metadata >=4.8.3 - - ipykernel >=6.5.0 - - jinja2 >=3.0.3 - - jupyter-lsp >=2.0.0 - - jupyter_core - - jupyter_server >=2.4.0,<3 - - jupyterlab_server >=2.27.1,<3 - - notebook-shim >=0.2 - - packaging - - python >=3.9 - - setuptools >=40.8.0 - - tomli >=1.2.2 - - tornado >=6.2.0 - - traitlets - license: BSD-3-Clause - license_family: BSD - size: 7614652 - timestamp: 1738184813883 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 - md5: fd312693df06da3578383232528c468d - depends: - - pygments >=2.4.1,<3 - - python >=3.9 - constrains: - - jupyterlab >=4.0.8,<5.0.0 - license: BSD-3-Clause - license_family: BSD - size: 18711 - timestamp: 1733328194037 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - sha256: d03d0b7e23fa56d322993bc9786b3a43b88ccc26e58b77c756619a921ab30e86 - md5: 9dc4b2b0f41f0de41d27f3293e319357 - depends: - - babel >=2.10 - - importlib-metadata >=4.8.3 - - jinja2 >=3.0.3 - - json5 >=0.9.0 - - jsonschema >=4.18 - - jupyter_server >=1.21,<3 - - packaging >=21.3 - - python >=3.9 - - requests >=2.31 - constrains: - - openapi-core >=0.18.0,<0.19.0 - license: BSD-3-Clause - license_family: BSD - size: 49449 - timestamp: 1733599666357 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb - md5: 30186d27e2c9fa62b45fb1476b7200e3 - depends: - - libgcc-ng >=10.3.0 - arch: x86_64 - platform: linux - license: LGPL-2.1-or-later - size: 117831 - timestamp: 1646151697040 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 - sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b - md5: 1f24853e59c68892452ef94ddd8afd4b - depends: - - libgcc-ng >=10.3.0 - arch: aarch64 - platform: linux - license: LGPL-2.1-or-later - size: 112327 - timestamp: 1646166857935 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 - md5: 3f43953b7d3fb3aaa1d0d0723d91e368 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 1370023 - timestamp: 1719463201255 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 - md5: 29c10432a2ca1472b53f299ffb2ffa37 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 1474620 - timestamp: 1719463205834 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b - md5: c6dc8a0fdec13a0565936655c33069a1 - depends: - - __osx >=11.0 - - libcxx >=16 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.3.1,<4.0a0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 1155530 - timestamp: 1719463474401 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 - md5: 51bb7010fc86f70eee639b4bb7a894f5 - depends: - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 245247 - timestamp: 1701647787198 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda - sha256: be4847b1014d3cbbc524a53bdbf66182f86125775020563e11d914c8468dd97d - md5: ffdd8267a04c515e7ce69c727b051414 - depends: - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 296219 - timestamp: 1701647961116 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 - md5: 66f6c134e76fe13cce8a9ea5814b5dd5 - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 211959 - timestamp: 1701647962657 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe - md5: 048b02e3962f066da18efe3a21b77672 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - binutils_impl_linux-64 2.43 - arch: x86_64 - platform: linux - license: GPL-3.0-only - license_family: GPL - size: 669211 - timestamp: 1729655358674 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - sha256: 80ec7e8f006196808fac5bd4b3773a652847f97bbf08044cd87731424ac64f8b - md5: fcbde5ea19d55468953bf588770c0501 - constrains: - - binutils_impl_linux-aarch64 2.43 - arch: aarch64 - platform: linux - license: GPL-3.0-only - license_family: GPL - size: 698245 - timestamp: 1729655345825 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 - md5: 76bbff344f0134279f225174e9064c8f - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 281798 - timestamp: 1657977462600 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 - sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 - md5: 1a0ffc65e03ce81559dbcb0695ad1476 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 262096 - timestamp: 1657978241894 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 - md5: de462d5aacda3b30721b512c5da4e742 - depends: - - libcxx >=13.0.1 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 215721 - timestamp: 1657977558796 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda - sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 - md5: 488f260ccda0afaf08acb286db439c2f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - constrains: - - libabseil-static =20240722.0=cxx17* - - abseil-cpp =20240722.0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1311599 - timestamp: 1736008414161 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda - sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 - md5: 633b9fe454ffea2aaf29e191d946a83b - depends: - - libgcc >=13 - - libstdcxx >=13 - constrains: - - abseil-cpp =20240722.0 - - libabseil-static =20240722.0=cxx17* - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1334844 - timestamp: 1736008472455 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 - md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 - depends: - - __osx >=11.0 - - libcxx >=18 - constrains: - - libabseil-static =20240722.0=cxx17* - - abseil-cpp =20240722.0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 1178260 - timestamp: 1736008642885 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.0-h00a82cf_8_cpu.conda - build_number: 8 - sha256: dcac39be95b9afe42bc9b7bfcfa258e31e413a4cb79c49f6707edf2838e8d64c - md5: 51e31b59290c09b58d290f66b908999b - depends: - - __glibc >=2.17,<3.0.a0 - - aws-crt-cpp >=0.29.9,<0.29.10.0a0 - - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-identity-cpp >=1.10.0,<1.10.1.0a0 - - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 - - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 - - bzip2 >=1.0.8,<2.0a0 - - glog >=0.7.1,<0.8.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libbrotlidec >=1.1.0,<1.2.0a0 - - libbrotlienc >=1.1.0,<1.2.0a0 - - libgcc >=13 - - libgoogle-cloud >=2.34.0,<2.35.0a0 - - libgoogle-cloud-storage >=2.34.0,<2.35.0a0 - - libopentelemetry-cpp >=1.18.0,<1.19.0a0 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libre2-11 >=2024.7.2 - - libstdcxx >=13 - - libutf8proc >=2.10.0,<2.11.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.0.3,<2.0.4.0a0 - - re2 - - snappy >=1.2.1,<1.3.0a0 - - zstd >=1.5.6,<1.6.0a0 - constrains: - - parquet-cpp <0.0a0 - - arrow-cpp <0.0a0 - - apache-arrow-proc =*=cpu - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 8969999 - timestamp: 1737824740139 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.0-h03ebaaf_8_cpu.conda - build_number: 8 - sha256: ca5db2ba71de0c4fb54ee12e3b841e3e90b988ae7a5935fae3cce90111b5cb6d - md5: 1ac6f73a63d715590a7ad0113a578762 - depends: - - aws-crt-cpp >=0.29.9,<0.29.10.0a0 - - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-identity-cpp >=1.10.0,<1.10.1.0a0 - - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 - - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 - - bzip2 >=1.0.8,<2.0a0 - - glog >=0.7.1,<0.8.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libbrotlidec >=1.1.0,<1.2.0a0 - - libbrotlienc >=1.1.0,<1.2.0a0 - - libgcc >=13 - - libgoogle-cloud >=2.34.0,<2.35.0a0 - - libgoogle-cloud-storage >=2.34.0,<2.35.0a0 - - libopentelemetry-cpp >=1.18.0,<1.19.0a0 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libre2-11 >=2024.7.2 - - libstdcxx >=13 - - libutf8proc >=2.10.0,<2.11.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.0.3,<2.0.4.0a0 - - re2 - - snappy >=1.2.1,<1.3.0a0 - - zstd >=1.5.6,<1.6.0a0 - constrains: - - arrow-cpp <0.0a0 - - apache-arrow-proc =*=cpu - - parquet-cpp <0.0a0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 8213318 - timestamp: 1737808895185 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.0-h819e3af_8_cpu.conda - build_number: 8 - sha256: 825afabd1c998dfddce9600584c492296a15219d441c6e3029e6c6228200d695 - md5: fbe0ce0ef6d386ab832ee5cca2ab3048 - depends: - - __osx >=11.0 - - aws-crt-cpp >=0.29.9,<0.29.10.0a0 - - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 - - azure-core-cpp >=1.14.0,<1.14.1.0a0 - - azure-identity-cpp >=1.10.0,<1.10.1.0a0 - - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 - - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 - - bzip2 >=1.0.8,<2.0a0 - - glog >=0.7.1,<0.8.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libbrotlidec >=1.1.0,<1.2.0a0 - - libbrotlienc >=1.1.0,<1.2.0a0 - - libcxx >=18 - - libgoogle-cloud >=2.34.0,<2.35.0a0 - - libgoogle-cloud-storage >=2.34.0,<2.35.0a0 - - libopentelemetry-cpp >=1.18.0,<1.19.0a0 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libre2-11 >=2024.7.2 - - libutf8proc >=2.10.0,<2.11.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.0.3,<2.0.4.0a0 - - re2 - - snappy >=1.2.1,<1.3.0a0 - - zstd >=1.5.6,<1.6.0a0 - constrains: - - arrow-cpp <0.0a0 - - apache-arrow-proc =*=cpu - - parquet-cpp <0.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 5573619 - timestamp: 1737806044972 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.0-hcb10f89_8_cpu.conda - build_number: 8 - sha256: bf8f64403685eb3ab6ebc5a25cc3a70431a1f822469bf96b0ee80c169deec0ac - md5: dafba09929a58e10bb8231ff7966e623 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 19.0.0 h00a82cf_8_cpu - - libgcc >=13 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 637555 - timestamp: 1737824783456 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.0-h3b568fd_8_cpu.conda - build_number: 8 - sha256: 154fe9bee1a1e3c96497fcbf3c01191965d5c4e9718dcbf8502035d7ff633499 - md5: e015edb6317c81893f9ce4865bbd55f4 - depends: - - libarrow 19.0.0 h03ebaaf_8_cpu - - libgcc >=13 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 602892 - timestamp: 1737808980001 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.0-hf07054f_8_cpu.conda - build_number: 8 - sha256: 66ce35077dae435cd34644d53159af14afd62452eeec8f63cd55adb11e7f2780 - md5: 68cd272eccf7b4fcb0a3bab95e89e71e - depends: - - __osx >=11.0 - - libarrow 19.0.0 h819e3af_8_cpu - - libcxx >=18 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 500365 - timestamp: 1737806169385 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.0-hcb10f89_8_cpu.conda - build_number: 8 - sha256: dc4a0f13428c9bd9781e25b67f5f52a92b8c4beafa2435fe5127e9fac7969218 - md5: 66e19108e4597b9a35d0886607c2d8a8 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 19.0.0 h00a82cf_8_cpu - - libarrow-acero 19.0.0 hcb10f89_8_cpu - - libgcc >=13 - - libparquet 19.0.0 h081d1f1_8_cpu - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 604335 - timestamp: 1737824891062 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.0-h3b568fd_8_cpu.conda - build_number: 8 - sha256: f038f979b3357124a548dd83880f94284355a90e4736caaabd23c750cf06eaa9 - md5: 03f35d7f35dae0e05f5f4f747d7eb6e7 - depends: - - libarrow 19.0.0 h03ebaaf_8_cpu - - libarrow-acero 19.0.0 h3b568fd_8_cpu - - libgcc >=13 - - libparquet 19.0.0 hfc78867_8_cpu - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 579626 - timestamp: 1737809072479 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.0-hf07054f_8_cpu.conda - build_number: 8 - sha256: 6934ce0503472f002695d45ae12a8f2948e10e7a0b7430330a4d0d83f3e5ca27 - md5: 1a941d1ddc16b532790781a4becdc881 - depends: - - __osx >=11.0 - - libarrow 19.0.0 h819e3af_8_cpu - - libarrow-acero 19.0.0 hf07054f_8_cpu - - libcxx >=18 - - libparquet 19.0.0 h636d7b7_8_cpu - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 501001 - timestamp: 1737807214184 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.0-h08228c5_8_cpu.conda - build_number: 8 - sha256: e370ee738d3963120f715343a27cf041c62a3ee8bb19e25da9115ec4bae5f2de - md5: e5dd1926e5a4b23de8ba4eacc8eb9b2d - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libarrow 19.0.0 h00a82cf_8_cpu - - libarrow-acero 19.0.0 hcb10f89_8_cpu - - libarrow-dataset 19.0.0 hcb10f89_8_cpu - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 521475 - timestamp: 1737824942852 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.0-h1e9d426_8_cpu.conda - build_number: 8 - sha256: 92e1fea8557a931c273ea3bd3bf73a4f4f0c566844dcedf78b9a16e5cf6cab56 - md5: ef08fcb5c165cdc743336bd8f4cbed69 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libarrow 19.0.0 h03ebaaf_8_cpu - - libarrow-acero 19.0.0 h3b568fd_8_cpu - - libarrow-dataset 19.0.0 h3b568fd_8_cpu - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 516126 - timestamp: 1737809118915 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.0-h4239455_8_cpu.conda - build_number: 8 - sha256: 445d2ca20b07e57270f3b07b62c09794369413e5ff3716d9c73d0ad360969583 - md5: a39953d9b03b0463f4ccc187a8bcfcca - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libarrow 19.0.0 h819e3af_8_cpu - - libarrow-acero 19.0.0 hf07054f_8_cpu - - libarrow-dataset 19.0.0 hf07054f_8_cpu - - libcxx >=18 - - libprotobuf >=5.28.3,<5.28.4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 449672 - timestamp: 1737807386331 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda - build_number: 28 - sha256: 93fbcf2800b859b7ca5add3ab5d3aa11c6a6ff4b942a1cea4bf644f78488edb8 - md5: 73e2a99fdeb8531d50168987378fda8a - depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 - constrains: - - libcblas =3.9.0=28*_openblas - - blas =2.128=openblas - - liblapack =3.9.0=28*_openblas - - liblapacke =3.9.0=28*_openblas - arch: x86_64 - platform: linux + size: 19711 + timestamp: 1733428049134 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.5-pyhd8ed1ab_0.conda + sha256: 9d033314060993522e1ad999ded9da316a8b928d11b7a58c254597382239a72e + md5: ec1f95d39ec862a7a87de0662a98ce3e + depends: + - async-lru >=1.0.0 + - httpx >=0.25.0 + - importlib-metadata >=4.8.3 + - ipykernel >=6.5.0 + - jinja2 >=3.0.3 + - jupyter-lsp >=2.0.0 + - jupyter_core + - jupyter_server >=2.4.0,<3 + - jupyterlab_server >=2.27.1,<3 + - notebook-shim >=0.2 + - packaging + - python >=3.9 + - setuptools >=40.8.0 + - tomli >=1.2.2 + - tornado >=6.2.0 + - traitlets license: BSD-3-Clause license_family: BSD - size: 16621 - timestamp: 1738114033763 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-28_h1a9f1db_openblas.conda - build_number: 28 - sha256: a50dc7ed1f49789aab4ffb560d9a46b5dc3f059a925282f699c1a96fa566a1a0 - md5: 88dfbb3875d62b431aa676b4a54734bf - depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + size: 7614652 + timestamp: 1738184813883 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 constrains: - - liblapack =3.9.0=28*_openblas - - libcblas =3.9.0=28*_openblas - - blas =2.128=openblas - - liblapacke =3.9.0=28*_openblas - arch: aarch64 - platform: linux + - jupyterlab >=4.0.8,<5.0.0 license: BSD-3-Clause license_family: BSD - size: 16697 - timestamp: 1738114082682 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-28_h10e41b3_openblas.conda - build_number: 28 - sha256: 5bea855a1a7435ce2238535aa4b13db8af8ee301d99a42b083b63fa64c1ea144 - md5: 166166d84a0e9571dc50210baf993b46 - depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + size: 18711 + timestamp: 1733328194037 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda + sha256: d03d0b7e23fa56d322993bc9786b3a43b88ccc26e58b77c756619a921ab30e86 + md5: 9dc4b2b0f41f0de41d27f3293e319357 + depends: + - babel >=2.10 + - importlib-metadata >=4.8.3 + - jinja2 >=3.0.3 + - json5 >=0.9.0 + - jsonschema >=4.18 + - jupyter_server >=1.21,<3 + - packaging >=21.3 + - python >=3.9 + - requests >=2.31 constrains: - - liblapack =3.9.0=28*_openblas - - liblapacke =3.9.0=28*_openblas - - blas =2.128=openblas - - libcblas =3.9.0=28*_openblas - arch: arm64 - platform: osx + - openapi-core >=0.18.0,<0.19.0 license: BSD-3-Clause license_family: BSD - size: 16840 - timestamp: 1738114389937 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 - md5: 41b599ed2b02abcfdd84302bff174b23 + size: 49449 + timestamp: 1733599666357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc-ng >=10.3.0 arch: x86_64 platform: linux - license: MIT - license_family: MIT - size: 68851 - timestamp: 1725267660471 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda - sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 - md5: 3ee026955c688f551a9999840cff4c67 + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b depends: - - libgcc >=13 + - libgcc-ng >=10.3.0 arch: aarch64 platform: linux - license: MIT - license_family: MIT - size: 68982 - timestamp: 1725267774142 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 - md5: d0bf1dff146b799b319ea0434b93f779 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 68426 - timestamp: 1725267943211 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf - md5: 9566f0bd264fbd463002e759b8a82401 + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlicommon 1.1.0 hb9d3cd8_2 - - libgcc >=13 + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 arch: x86_64 platform: linux license: MIT license_family: MIT - size: 32696 - timestamp: 1725267669305 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda - sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c - md5: e64d0f3b59c7c4047446b97a8624a72d + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 depends: - - libbrotlicommon 1.1.0 h86ecc28_2 - - libgcc >=13 + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 arch: aarch64 platform: linux license: MIT license_family: MIT - size: 31708 - timestamp: 1725267783442 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 - md5: 55e66e68ce55523a6811633dd1ac74e2 + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 depends: - __osx >=11.0 - - libbrotlicommon 1.1.0 hd74edd7_2 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 arch: arm64 platform: osx license: MIT license_family: MIT - size: 28378 - timestamp: 1725267980316 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 - md5: 06f70867945ea6a84d35836af780f1de + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f depends: - __glibc >=2.17,<3.0.a0 - - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 arch: x86_64 platform: linux - license: MIT - license_family: MIT - size: 281750 - timestamp: 1725267679782 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda - sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c - md5: 0e9bd365480c72b25c71a448257b537d + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b depends: - - libbrotlicommon 1.1.0 h86ecc28_2 - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* arch: aarch64 platform: linux - license: MIT - license_family: MIT - size: 290230 - timestamp: 1725267792697 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 - md5: 4f3a434504c67b2c42565c0b85c1885c + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 depends: - __osx >=11.0 - - libbrotlicommon 1.1.0 hd74edd7_2 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 arch: arm64 platform: osx - license: MIT - license_family: MIT - size: 279644 - timestamp: 1725268003553 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda - build_number: 28 - sha256: de293e117db53e5d78b579136509c35a5e4ad11529c05f9af83cf89be4d30de1 - md5: 4e20a1c00b4e8a984aac0f6cce59e3ac - depends: - - libblas 3.9.0 28_h59b9bed_openblas + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 constrains: - - blas =2.128=openblas - - liblapack =3.9.0=28*_openblas - - liblapacke =3.9.0=28*_openblas + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas arch: x86_64 platform: linux license: BSD-3-Clause license_family: BSD - size: 16539 - timestamp: 1738114043618 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-28_hab92f65_openblas.conda - build_number: 28 - sha256: ed62f13a85726f568e17ad569b5cc01a49a6c7bd334802cf1c1b15e9d10e7e93 - md5: 8cff453f547365131be5647c7680ac6d - depends: - - libblas 3.9.0 28_h1a9f1db_openblas + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 constrains: - - liblapack =3.9.0=28*_openblas - - blas =2.128=openblas - - liblapacke =3.9.0=28*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas arch: aarch64 platform: linux license: BSD-3-Clause license_family: BSD - size: 16655 - timestamp: 1738114088527 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-28_hb3479ef_openblas.conda - build_number: 28 - sha256: f08adea59381babb3568e6d23e52aff874cbc25f299821647ab1127d1e1332ca - md5: 30942dea911ce333765003a8adec4e8a - depends: - - libblas 3.9.0 28_h10e41b3_openblas + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 constrains: - - blas =2.128=openblas - - liblapacke =3.9.0=28*_openblas - - liblapack =3.9.0=28*_openblas + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas arch: arm64 platform: osx license: BSD-3-Clause license_family: BSD - size: 16788 - timestamp: 1738114399962 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 - md5: c965a5aa0d5c1c37ffc62dff36e28400 + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 depends: - - libgcc-ng >=9.4.0 - - libstdcxx-ng >=9.4.0 + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas arch: x86_64 platform: linux license: BSD-3-Clause license_family: BSD - size: 20440 - timestamp: 1633683576494 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea - md5: 268ee639c17ada0002fb04dd21816cc2 + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 depends: - - libgcc-ng >=9.4.0 - - libstdcxx-ng >=9.4.0 + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas arch: aarch64 platform: linux license: BSD-3-Clause license_family: BSD - size: 18669 - timestamp: 1633683724891 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 - md5: 32bd82a6a625ea6ce090a81c3d34edeb + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 depends: - - libcxx >=11.1.0 + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas arch: arm64 platform: osx license: BSD-3-Clause license_family: BSD - size: 18765 - timestamp: 1633683992603 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - sha256: 3cd4075b2a7b5562e46c8ec626f6f9ca57aeecaa94ff7df57eca26daa94c9906 - md5: 2b3e0081006dc21e8bf53a91c83a055c - depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libnghttp2 >=1.64.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - zstd >=1.5.6,<1.6.0a0 - arch: x86_64 - platform: linux - license: curl - license_family: MIT - size: 423011 - timestamp: 1733999897624 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.11.1-h6702fde_0.conda - sha256: 9fc65d21a58f4aad1bc39dfb94a178893aeb035850c5cf0ed9736674279f390b - md5: 7dec1cd271c403d1636bda5aa388a55d - depends: - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libnghttp2 >=1.64.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - zstd >=1.5.6,<1.6.0a0 - arch: aarch64 - platform: linux - license: curl - license_family: MIT - size: 440737 - timestamp: 1733999835504 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - sha256: f47c35938144c23278987c7d12096f6a42d7c850ffc277222b032073412383b6 - md5: 46d7524cabfdd199bffe63f8f19a552b - depends: - - __osx >=11.0 - - krb5 >=1.21.3,<1.22.0a0 - - libnghttp2 >=1.64.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - zstd >=1.5.6,<1.6.0a0 - arch: arm64 - platform: osx - license: curl - license_family: MIT - size: 385098 - timestamp: 1734000160270 + size: 17032 + timestamp: 1740088127097 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 md5: 5b3e1610ff8bd5443476b91d618f5b77 @@ -3932,43 +1699,9 @@ packages: license_family: Apache size: 523505 timestamp: 1736877862502 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda - sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 - md5: 8dfae1d2e74767e9ce36d5fa0d8605db - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 72255 - timestamp: 1734373823254 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda - sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 - md5: 7e7ca2607b11b180120cefc2354fc0cb - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 69862 - timestamp: 1734373858306 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 - md5: 1d8b9588be14e71df38c525767a1ac30 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 54132 - timestamp: 1734373971372 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda - sha256: 4d0d69ddf9cc7d724a1ccf3a9852e44c8aea9825692582bac2c4e8d21ec95ccd - md5: 8247f80f3dc464d9322e85007e307fe8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b depends: - ncurses - __glibc >=2.17,<3.0.a0 @@ -3978,11 +1711,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 134657 - timestamp: 1736191912705 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20240808-pl5321h976ea20_0.conda - sha256: 031daea98cf278f858b7957ad5dc475f1b5673cd5e718850529401ced64cef2c - md5: 0be40129d3dd1a152fff29a85f0785d0 + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 depends: - ncurses - libgcc >=13 @@ -3991,87 +1724,21 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 148120 - timestamp: 1736192137151 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - sha256: fb934d7a03279ec8eae4bf1913ac9058fcf6fed35290d8ffa6e04157f396a3b1 - md5: af89aa84ffb5ee551ce0c137b951a3b5 + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b depends: - ncurses - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 107634 - timestamp: 1736192034117 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 - md5: 172bf1cd1ff8629f2b1179945ed45055 - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 112766 - timestamp: 1702146165126 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 - md5: a9a13cb143bbaa477b1ebaefbe47a302 - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 115123 - timestamp: 1702146237623 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f - md5: 36d33e440c31857372a72137f78bacf5 - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 107458 - timestamp: 1702146414478 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 - md5: a1cfcc585f0c42bf8d5546bb1dfb668d - depends: - - libgcc-ng >=12 - - openssl >=3.1.1,<4.0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 427426 - timestamp: 1685725977222 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 - md5: 96ae6083cd1ac9f6bc81631ac835b317 - depends: - - libgcc-ng >=12 - - openssl >=3.1.1,<4.0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 438992 - timestamp: 1685726046519 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 - md5: 1a109764bff3bdc7bdd84088347d71dc - depends: - - openssl >=3.1.1,<4.0a0 + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 arch: arm64 platform: osx - license: BSD-3-Clause + license: BSD-2-Clause license_family: BSD - size: 368167 - timestamp: 1685726248899 + size: 107691 + timestamp: 1738479560845 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 md5: db833e03127376d461e1e13e76f09b6c @@ -4112,28 +1779,29 @@ packages: license_family: MIT size: 64693 timestamp: 1730967175868 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 depends: - - libgcc-ng >=9.4.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 arch: x86_64 platform: linux license: MIT license_family: MIT - size: 58292 - timestamp: 1636488182923 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 - sha256: 7e9258a102480757fe3faeb225a3ca04dffd10fecd2a958c65cdb4cdf75f2c3c - md5: dddd85f4d52121fab0a8b099c5e06501 + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 depends: - - libgcc-ng >=9.4.0 + - libgcc >=13 arch: aarch64 platform: linux license: MIT license_family: MIT - size: 59450 - timestamp: 1636488255090 + size: 51513 + timestamp: 1739260449772 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca md5: 086914b672be056eb70fd4285b6783b6 @@ -4143,83 +1811,83 @@ packages: license_family: MIT size: 39020 timestamp: 1636488587153 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 - md5: 3cb76c3f10d3bc7f1105b2fc9db984df +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 depends: - - _libgcc_mutex 0.1 conda_forge + - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgomp 14.2.0 h77fa898_1 - - libgcc-ng ==14.2.0=*_1 + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 arch: x86_64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 848745 - timestamp: 1729027721139 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda - sha256: 5d56757ccad208c79214395b00d006d8d18929a4ba49c47bd9460789a7620943 - md5: 511b511c5445e324066c3377481bcab8 + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 depends: - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==14.2.0=*_1 - - libgomp 14.2.0 he277a41_1 + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 arch: aarch64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 535243 - timestamp: 1729089435134 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 - md5: e39480b9ca41323497b05492a63bc35b + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 depends: - - libgcc 14.2.0 h77fa898_1 + - libgcc 14.2.0 h767d61c_2 arch: x86_64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 54142 - timestamp: 1729027726517 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda - sha256: 9b5cf168a6c7361cae869cb74b716766ee7c6d6b3f6172b32ba9bf91135efdc4 - md5: 0694c249c61469f2c0f7e2990782af21 + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 depends: - - libgcc 14.2.0 he277a41_1 + - libgcc 14.2.0 he277a41_2 arch: aarch64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 54104 - timestamp: 1729089444587 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 - md5: f1fd30127802683586f768875127a987 + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 depends: - - libgfortran5 14.2.0 hd5240d6_1 + - libgfortran5 14.2.0 hf1ad2bd_2 constrains: - - libgfortran-ng ==14.2.0=*_1 + - libgfortran-ng ==14.2.0=*_2 arch: x86_64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 53997 - timestamp: 1729027752995 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda - sha256: cb66e411fa32a5c6040f4e5e2a63c00897aae4c3133a9c004c2e929ccf19575b - md5: 0294b92d2f47a240bebb1e3336b495f1 + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 depends: - - libgfortran5 14.2.0 hb6113d0_1 + - libgfortran5 14.2.0 hb6113d0_2 constrains: - - libgfortran-ng ==14.2.0=*_1 + - libgfortran-ng ==14.2.0=*_2 arch: aarch64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 54105 - timestamp: 1729089471124 + size: 53611 + timestamp: 1740241100147 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b md5: 4a55d9e169114b2b90d3ec4604cd7bbf @@ -4231,10 +1899,11 @@ packages: license_family: GPL size: 110233 timestamp: 1707330749033 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d - md5: 9822b874ea29af082e5d36098d25427d +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 depends: + - __glibc >=2.17,<3.0.a0 - libgcc >=14.2.0 constrains: - libgfortran 14.2.0 @@ -4242,11 +1911,11 @@ packages: platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1462645 - timestamp: 1729027735353 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda - sha256: a87ff46d19916403cbf68cf1d785bf56b4d1ab7b2552468d2ea775d70782493f - md5: fc068e11b10e18f184e027782baa12b6 + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f depends: - libgcc >=14.2.0 constrains: @@ -4255,8 +1924,8 @@ packages: platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1102158 - timestamp: 1729089452640 + size: 1100765 + timestamp: 1740241083241 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a md5: 66ac81d54e95c534ae488726c1f698ea @@ -4270,408 +1939,105 @@ packages: license_family: GPL size: 997381 timestamp: 1707330687590 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 - md5: cc3573974587f12dda90d96e3e55a702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 depends: - - _libgcc_mutex 0.1 conda_forge + - __glibc >=2.17,<3.0.a0 arch: x86_64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 460992 - timestamp: 1729027639220 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - sha256: 5aa53874a5e57a00f2e0c2e2910684eb674429cd5fcb803619b226a73e89aedf - md5: 376f0e73abbda6d23c0cb749adc195ef + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 arch: aarch64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 463521 - timestamp: 1729089357313 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.34.0-h2b5623c_0.conda - sha256: 348ee1dddd82dcef5a185c86e65dda8acfc9b583acc425ccb9b661f2d433b2cc - md5: 2a5142c88dd6132eaa8079f99476e922 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgcc >=13 - - libgrpc >=1.67.1,<1.68.0a0 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - - openssl >=3.4.0,<4.0a0 - constrains: - - libgoogle-cloud 2.34.0 *_0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1256795 - timestamp: 1737286199784 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.34.0-hccf9d24_0.conda - sha256: 54267dda8fafc2a2d379ef77b6029d8240e0628d4b29758f788fb903f84397a3 - md5: 1ce0fd876001c40801b40fea22987e41 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgcc >=13 - - libgrpc >=1.67.1,<1.68.0a0 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - - openssl >=3.4.0,<4.0a0 - constrains: - - libgoogle-cloud 2.34.0 *_0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1256586 - timestamp: 1737285242684 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.34.0-hdbe95d5_0.conda - sha256: 919d8cbcd47d5bd2244c55b2bb87e2bd2eed8215996aab8435cb7123ffd9d20e - md5: 69826544e7978fcaa6bc8c1962d96ad6 - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.11.1,<9.0a0 - - libcxx >=18 - - libgrpc >=1.67.1,<1.68.0a0 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - openssl >=3.4.0,<4.0a0 - constrains: - - libgoogle-cloud 2.34.0 *_0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 878217 - timestamp: 1737284441192 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.34.0-h0121fbd_0.conda - sha256: aa1b3b30ae6b2eab7c9e6a8e2fd8ec3776f25d2e3f0b6f9dc547ff8083bf25fa - md5: 9f0c43225243c81c6991733edcaafff5 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil - - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl - - libgcc >=13 - - libgoogle-cloud 2.34.0 h2b5623c_0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 785792 - timestamp: 1737286406612 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.34.0-hb9b2b65_0.conda - sha256: 4ad4fb7c02dcfa4c86dcf9591e0131a01fc0f2c3f2729c12882b944ddf2b8a9d - md5: 0732a5988f7f556f2c1d1f51026fc1be - depends: - - libabseil - - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl - - libgcc >=13 - - libgoogle-cloud 2.34.0 hccf9d24_0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 739678 - timestamp: 1737285399565 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.34.0-h7081f7f_0.conda - sha256: 79f6b93fb330728530036b2b38764e9d42e0eedd3ae7e549ac7eae49acd1e52b - md5: f09cb03f9cf847f1dc41b4c1f65c97c2 - depends: - - __osx >=11.0 - - libabseil - - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl - - libcxx >=18 - - libgoogle-cloud 2.34.0 hdbe95d5_0 - - libzlib >=1.3.1,<2.0a0 - - openssl - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 529202 - timestamp: 1737285376801 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda - sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e - md5: 0c6497a760b99a926c7c12b74951a39c - depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.4,<2.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libre2-11 >=2024.7.2 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.67.1 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 7792251 - timestamp: 1735584856826 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda - sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe - md5: 8fb41a425bebaeb3d0fa568503612e64 - depends: - - c-ares >=1.34.4,<2.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libre2-11 >=2024.7.2 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.67.1 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 7430006 - timestamp: 1735585769731 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda - sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 - md5: 8a3cba079d6ac985e7d73c76a678fbb4 - depends: - - __osx >=11.0 - - c-ares >=1.34.4,<2.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=18 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libre2-11 >=2024.7.2 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.67.1 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 5311706 - timestamp: 1735585137716 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 - md5: d66573916ffcf376178462f1b61c941e - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: LGPL-2.1-only - size: 705775 - timestamp: 1702682170569 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - sha256: a30e09d089cb75a0d5b8e5c354694c1317da98261185ed65aa3793e741060614 - md5: 9a8eb13f14de7d761555a98712e6df65 - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: LGPL-2.1-only - size: 705787 - timestamp: 1702684557134 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 - md5: 69bda57310071cf6d2b86caf11573d2d - arch: arm64 - platform: osx - license: LGPL-2.1-only - size: 676469 - timestamp: 1702682458114 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f - md5: ea25936bb4080d843790b586850f82b8 - depends: - - libgcc-ng >=12 - constrains: - - jpeg <0.0.0a - arch: x86_64 - platform: linux - license: IJG AND BSD-3-Clause AND Zlib - size: 618575 - timestamp: 1694474974816 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 - md5: ed24e702928be089d9ba3f05618515c6 - depends: - - libgcc-ng >=12 - constrains: - - jpeg <0.0.0a - arch: aarch64 - platform: linux - license: IJG AND BSD-3-Clause AND Zlib - size: 647126 - timestamp: 1694475003570 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 - md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas constrains: - - jpeg <0.0.0a - arch: arm64 - platform: osx - license: IJG AND BSD-3-Clause AND Zlib - size: 547541 - timestamp: 1694475104253 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda - build_number: 28 - sha256: 9530e6840690b78360946390a1d29624734a6b624f02c26631fb451592cbb8ef - md5: 069f40bfbf1dc55c83ddb07fc6a6ef8d - depends: - - libblas 3.9.0 28_h59b9bed_openblas - constrains: - - libcblas =3.9.0=28*_openblas - - blas =2.128=openblas - - liblapacke =3.9.0=28*_openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas arch: x86_64 platform: linux license: BSD-3-Clause license_family: BSD - size: 16553 - timestamp: 1738114053556 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-28_h411afd4_openblas.conda - build_number: 28 - sha256: 1290ce1071a586e22bdd7d8f4c48000cc0005f0a67660be150d1ea5c6092129f - md5: bc4c5ee31476521e202356b56bba6077 - depends: - - libblas 3.9.0 28_h1a9f1db_openblas + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas constrains: - - liblapacke =3.9.0=28*_openblas - - libcblas =3.9.0=28*_openblas - - blas =2.128=openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas arch: aarch64 platform: linux license: BSD-3-Clause license_family: BSD - size: 16637 - timestamp: 1738114094310 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-28_hc9a63f6_openblas.conda - build_number: 28 - sha256: 79c75a02bff20f8b001e6aecfee8d22a51552c3986e7037fca68e5ed071cc213 - md5: 45f26652530b558c21083ceb7adaf273 - depends: - - libblas 3.9.0 28_h10e41b3_openblas + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas constrains: - - blas =2.128=openblas - - liblapacke =3.9.0=28*_openblas - - libcblas =3.9.0=28*_openblas + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas arch: arm64 platform: osx license: BSD-3-Clause license_family: BSD - size: 16793 - timestamp: 1738114407021 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 - md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - constrains: - - xz ==5.6.3=*_1 arch: x86_64 platform: linux license: 0BSD - size: 111132 - timestamp: 1733407410083 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.3-h86ecc28_1.conda - sha256: d1cce0b7d62d1e54e2164d3e0667ee808efc6c3870256e5b47a150cd0bf46824 - md5: eb08b903681f9f2432c320e8ed626723 + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 depends: - libgcc >=13 - constrains: - - xz ==5.6.3=*_1 arch: aarch64 platform: linux license: 0BSD - size: 124138 - timestamp: 1733409137214 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 - md5: b2553114a7f5e20ccd02378a77d836aa + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 depends: - __osx >=11.0 - constrains: - - xz ==5.6.3=*_1 arch: arm64 platform: osx license: 0BSD - size: 99129 - timestamp: 1733407496073 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 - md5: 19e57602824042dfd0446292ef90488b - depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.32.3,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 647599 - timestamp: 1729571887612 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda - sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 - md5: f52c614fa214a8bedece9421c771670d - depends: - - c-ares >=1.32.3,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 714610 - timestamp: 1729571912479 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f - md5: 3408c02539cee5f1141f9f11450b6a51 - depends: - - __osx >=11.0 - - c-ares >=1.34.2,<2.0a0 - - libcxx >=17 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 566719 - timestamp: 1729572385640 + size: 98945 + timestamp: 1738525462560 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 @@ -4683,237 +2049,64 @@ packages: license_family: GPL size: 33408 timestamp: 1697359010159 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 - md5: c14f32510f694e3185704d89967ec422 - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: LGPL-2.1-only - license_family: GPL - size: 34501 - timestamp: 1697358973269 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe - md5: 62857b389e42b36b686331bec0922050 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.2.0 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 5578513 - timestamp: 1730772671118 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_1.conda - sha256: 30623a40764e935aa77e0d4db54c1a1589189a9bf3a03fdb445505c1e319b5a6 - md5: e8dde93dd199da3c1f2c1fcfd0042cd4 - depends: - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.2.0 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 4793435 - timestamp: 1730773029647 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - sha256: 62bb669c37a845129096f73d446cdb6bb170e4927f2fea2b661329680dbbc373 - md5: 40803a48d947c8639da6704e9a44d3ce - depends: - - __osx >=11.0 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - llvm-openmp >=18.1.8 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 4165774 - timestamp: 1730772154295 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda - sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f - md5: 1f5a5d66e77a39dc5bd639ec953705cf - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgrpc >=1.67.1,<1.68.0a0 - - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libzlib >=1.3.1,<2.0a0 - - nlohmann_json - - prometheus-cpp >=1.3.0,<1.4.0a0 - constrains: - - cpp-opentelemetry-sdk =1.18.0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 801927 - timestamp: 1735643375271 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda - sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba - md5: afe3c8c53f4b6d27d553c230d4b34038 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgrpc >=1.67.1,<1.68.0a0 - - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libzlib >=1.3.1,<2.0a0 - - nlohmann_json - - prometheus-cpp >=1.3.0,<1.4.0a0 - constrains: - - cpp-opentelemetry-sdk =1.18.0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 800896 - timestamp: 1735643533825 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda - sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba - md5: 19c46cc18825f3924251c39ec1b0d983 - depends: - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.11.1,<9.0a0 - - libgrpc >=1.67.1,<1.68.0a0 - - libopentelemetry-cpp-headers 1.18.0 hce30654_1 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libzlib >=1.3.1,<2.0a0 - - nlohmann_json - - prometheus-cpp >=1.3.0,<1.4.0a0 - constrains: - - cpp-opentelemetry-sdk =1.18.0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 529588 - timestamp: 1735643889612 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda - sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 - md5: 4fb055f57404920a43b147031471e03b - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 320359 - timestamp: 1735643346175 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda - sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 - md5: 282193b19a19e3b5d75d18ef82713ef0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 319401 - timestamp: 1735643509251 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda - sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 - md5: e965dad955841507549fdacd8f7f94c0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 320565 - timestamp: 1735643673319 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.0-h081d1f1_8_cpu.conda - build_number: 8 - sha256: b2e1bf8634efb643a9f15fe19f9bc0877482c509eff7cee6136278a2c2fa5842 - md5: bef810a8da683aa11c644066a87f71c3 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 19.0.0 h00a82cf_8_cpu - - libgcc >=13 - - libstdcxx >=13 - - libthrift >=0.21.0,<0.21.1.0a0 - - openssl >=3.4.0,<4.0a0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 1241786 - timestamp: 1737824866572 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.0-hfc78867_8_cpu.conda - build_number: 8 - sha256: 8917fc5e5bb65894106bbd461d2f9c9c0c3dc642ff5da197c941bf620ce840a0 - md5: b0d5f8c122a3e9a6b75036e43e78fcfa - depends: - - libarrow 19.0.0 h03ebaaf_8_cpu - - libgcc >=13 - - libstdcxx >=13 - - libthrift >=0.21.0,<0.21.1.0a0 - - openssl >=3.4.0,<4.0a0 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 arch: aarch64 platform: linux - license: Apache-2.0 - license_family: APACHE - size: 1153834 - timestamp: 1737809048861 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.0-h636d7b7_8_cpu.conda - build_number: 8 - sha256: da04e6bd7ed2ca64aadf0ad12d9752e8423e85c37e0db80e27c7ff334fcbd2b6 - md5: c1ff2e71a289fb76146591c9d3f9de0a - depends: - - __osx >=11.0 - - libarrow 19.0.0 h819e3af_8_cpu - - libcxx >=18 - - libthrift >=0.21.0,<0.21.1.0a0 - - openssl >=3.4.0,<4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 893482 - timestamp: 1737807155720 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda - sha256: a46436dadd12d58155280d68876dba2d8a3badbc8074956d14fe6530c7c7eda6 - md5: adcf7bacff219488e29cfa95a2abd8f7 + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 arch: x86_64 platform: linux - license: zlib-acknowledgement - size: 292273 - timestamp: 1737791061653 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.46-hec79eb8_0.conda - sha256: be4eefe8415c9b37d158eaa9522ce4c399a572339ac2bcc4d26d6433e0ed767d - md5: f9f793497c0973d5416421aa2f96cda4 + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 depends: - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 arch: aarch64 platform: linux - license: zlib-acknowledgement - size: 304364 - timestamp: 1737795802176 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.46-h3783ad8_0.conda - sha256: db78a711561bb6df274ef421472d948dfd1093404db3915e891ae6d7fd37fadc - md5: 15d480fb9dad036eaa4de0b51eab3ccc + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 depends: - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 arch: arm64 platform: osx - license: zlib-acknowledgement - size: 266516 - timestamp: 1737791023678 + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 md5: d8703f1ffe5a06356f06467f1d0b9464 @@ -4960,55 +2153,52 @@ packages: license_family: BSD size: 2271580 timestamp: 1735576361997 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda - sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 - md5: b2fede24428726dd867611664fb372e8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 - constrains: - - re2 2024.07.02.* arch: x86_64 platform: linux - license: BSD-3-Clause - license_family: BSD - size: 209793 - timestamp: 1735541054068 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda - sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 - md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 depends: - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 - constrains: - - re2 2024.07.02.* arch: aarch64 platform: linux - license: BSD-3-Clause - license_family: BSD - size: 204305 - timestamp: 1735540986919 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 - md5: 6b1e3624d3488016ca4f1ca0c412efaa + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - libcxx >=18 - constrains: - - re2 2024.07.02.* + - libprotobuf >=5.28.3,<5.28.4.0a0 arch: arm64 platform: osx - license: BSD-3-Clause - license_family: BSD - size: 167155 - timestamp: 1735541067807 + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 md5: a587892d3c13b6621a6091be690dbca2 @@ -5039,9 +2229,9 @@ packages: license: ISC size: 164972 timestamp: 1716828607917 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda - sha256: 22853d289ef6ec8a5b20f1aa261895b06525439990d3b139f8bfd0b5c5e32a3a - md5: 3fa05c528d8a1e2a67bbf1e36f22d3bc +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -5049,248 +2239,75 @@ packages: arch: x86_64 platform: linux license: Unlicense - size: 878223 - timestamp: 1737564987837 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.48.0-h5eb1b54_1.conda - sha256: 81dd9bf66c7f1d9064e007e2c787133100c406e7ca2de61dba9fb7b87372f255 - md5: 4f3a61fe206f20b27c385ee608bcdfda + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c depends: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 arch: aarch64 platform: linux license: Unlicense - size: 1044879 - timestamp: 1737565049785 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.48.0-h3f77e49_1.conda - sha256: 17c06940cc2a13fd6a17effabd6881b1477db38b2cd3ee2571092d293d3fdd75 - md5: 4c55169502ecddf8077973a987d08f08 + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 arch: arm64 platform: osx license: Unlicense - size: 852831 - timestamp: 1737564996616 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda - sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 - md5: be2de152d8073ef1c01b7728475f2fe7 + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 304278 - timestamp: 1732349402869 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda - sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 - md5: aeffe03c0e598f015aab08dbb04f6ee4 - depends: - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 311577 - timestamp: 1732349396421 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda - sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 - md5: ddc7194676c285513706e5fc64f214d7 - depends: - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 279028 - timestamp: 1732349599461 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 - md5: 234a5554c53625688d51062645337328 - depends: - - libgcc 14.2.0 h77fa898_1 + - libgcc 14.2.0 h767d61c_2 arch: x86_64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3893695 - timestamp: 1729027746910 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - sha256: 519556d2c93f1b487091ce046d62e762286177f4a670ec10e16005177d0bcab3 - md5: 37f489acd39e22b623d2d1e5ac6d195c + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 depends: - - libgcc 14.2.0 he277a41_1 + - libgcc 14.2.0 he277a41_2 arch: aarch64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3816794 - timestamp: 1729089463404 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 - md5: 8371ac6457591af2cf6159439c1fd051 + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b depends: - - libstdcxx 14.2.0 hc0a3c3a_1 + - libstdcxx 14.2.0 h8f9b012_2 arch: x86_64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 54105 - timestamp: 1729027780628 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - sha256: 9f97461bd55a2745a7a0941f3502a047f15bfe7bb2952dc7fb204b3202f866fd - md5: 0e75771b8a03afae5a2c6ce71bc733f5 + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c depends: - - libstdcxx 14.2.0 h3f4de04_1 + - libstdcxx 14.2.0 h3f4de04_2 arch: aarch64 platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 54133 - timestamp: 1729089498541 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 - md5: dcb95c0a98ba9ff737f7ae482aef7833 - depends: - - __glibc >=2.17,<3.0.a0 - - libevent >=2.1.12,<2.1.13.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 425773 - timestamp: 1727205853307 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda - sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 - md5: c28792bf37f4ecdce8e3cb9e40750650 - depends: - - libevent >=2.1.12,<2.1.13.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 417329 - timestamp: 1727205944238 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad - md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 - depends: - - __osx >=11.0 - - libcxx >=17 - - libevent >=2.1.12,<2.1.13.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 324342 - timestamp: 1727206096912 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 - md5: 0ea6510969e1296cc19966fad481f6de - depends: - - __glibc >=2.17,<3.0.a0 - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.23,<1.24.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblzma >=5.6.3,<6.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - arch: x86_64 - platform: linux - license: HPND - size: 428173 - timestamp: 1734398813264 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda - sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 - md5: 36a0ea4a173338c8725dc0807e99cf22 - depends: - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.23,<1.24.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblzma >=5.6.3,<6.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - arch: aarch64 - platform: linux - license: HPND - size: 464699 - timestamp: 1734398752249 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda - sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae - md5: a5d084a957563e614ec0c0196d890654 - depends: - - __osx >=11.0 - - lerc >=4.0.0,<5.0a0 - - libcxx >=18 - - libdeflate >=1.23,<1.24.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblzma >=5.6.3,<6.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - arch: arm64 - platform: osx - license: HPND - size: 370600 - timestamp: 1734398863052 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda - sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 - md5: aeccfff2806ae38430638ffbb4be9610 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 82745 - timestamp: 1737244366901 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda - sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a - md5: c5166bcfb8348e8fc31ee16ec3981a5e - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 82679 - timestamp: 1737329054400 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda - sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 - md5: 5f741aed1d8d393586a5fdcaaa87f45c - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 83628 - timestamp: 1737244450097 + size: 53715 + timestamp: 1740241126343 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b @@ -5313,123 +2330,6 @@ packages: license_family: BSD size: 35720 timestamp: 1680113474501 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda - sha256: b4a8890023902aef9f1f33e3e35603ad9c2f16c21fdb58e968fa6c1bd3e94c0b - md5: 771ee65e13bc599b0b62af5359d80169 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 891272 - timestamp: 1737016632446 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda - sha256: 67914c7f171d343059144d804c2f17fcd621a94e45f179a0fd843b8c1618823e - md5: 915db044076cbbdffb425170deb4ce38 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 621056 - timestamp: 1737016626950 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda - sha256: d13fb49d4c8262bf2c44ffb2c77bb2b5d0f85fc6de76bdb75208efeccb29fce6 - md5: 20717343fb30798ab7c23c2e92b748c1 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 418890 - timestamp: 1737016751326 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda - sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf - md5: 63f790534398730f59e1b899c3644d4a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - libwebp 1.5.0 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 429973 - timestamp: 1734777489810 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda - sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 - md5: 95ef4a689b8cc1b7e18b53784d88f96b - depends: - - libgcc >=13 - constrains: - - libwebp 1.5.0 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 362623 - timestamp: 1734779054659 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda - sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a - md5: 569466afeb84f90d5bb88c11cc23d746 - depends: - - __osx >=11.0 - constrains: - - libwebp 1.5.0 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 290013 - timestamp: 1734777593617 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa - md5: 92ed62436b625154323d40d5f2f11dd7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 395888 - timestamp: 1727278577118 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b - md5: cd14ee5cca2464a425b1dbfc24d90db2 - depends: - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 397493 - timestamp: 1727280745441 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 - md5: af523aae2eca6dfa1c8eec693f5b9a79 - depends: - - __osx >=11.0 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 323658 - timestamp: 1727278733917 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c md5: 5aa797f8787fe7a17d1b0821485b5adc @@ -5450,53 +2350,6 @@ packages: license: LGPL-2.1-or-later size: 114269 timestamp: 1702724369203 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda - sha256: 306e18aa647d8208ad2cd0e62d84933222b2fbe93d2d53cd5283d2256b1d54de - md5: f5b05674697ae7d2c5932766695945e1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libiconv >=1.17,<2.0a0 - - liblzma >=5.6.3,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - icu <0.0a0 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 689993 - timestamp: 1733443678322 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.5-h2e0c361_1.conda - sha256: dc0e86d35a836af6e99d18f50c6551fc64c53ed3a3da5a9fea90e78763cf14b4 - md5: 63410f85031930cde371dfe0ee89109a - depends: - - icu >=75.1,<76.0a0 - - libgcc >=13 - - libiconv >=1.17,<2.0a0 - - liblzma >=5.6.3,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 732155 - timestamp: 1733443825814 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda - sha256: d7af3f25a4cece170502acd38f2dafbea4521f373f46dcb28a37fbe6ac2da544 - md5: 3dc3cff0eca1640a6acbbfab2f78139e - depends: - - __osx >=11.0 - - icu >=75.1,<76.0a0 - - libiconv >=1.17,<2.0a0 - - liblzma >=5.6.3,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 582898 - timestamp: 1733443841584 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -5550,53 +2403,6 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 - md5: 9de5350a85c4a20c685259b889aa6393 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 167055 - timestamp: 1733741040117 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 - md5: 6654e411da94011e8fbe004eacb8fe11 - depends: - - libgcc >=13 - - libstdcxx >=13 - arch: aarch64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 184953 - timestamp: 1733740984533 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 - md5: 01511afc6cc1909c5303cf31be17b44f - depends: - - __osx >=11.0 - - libcxx >=18 - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 148824 - timestamp: 1733741047892 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a - md5: fee3164ac23dfca50cfcc8b85ddefb81 - depends: - - mdurl >=0.1,<1 - - python >=3.9 - license: MIT - license_family: MIT - size: 64430 - timestamp: 1733250550053 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 md5: eb227c3e0bf58f5bd69c0532b157975b @@ -5654,127 +2460,178 @@ packages: license_family: BSD size: 14467 timestamp: 1733417051523 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025013105-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda noarch: python - sha256: 1b8fcd33ceff5e6e87603d1de72c12493fe20e4f5204bc3d061a7e2b8ab33e84 - md5: 74268fafa5367b803cb82c74751fb0f0 + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 depends: - - max-core ==25.1.0.dev2025013105 release - - max-python >=25.1.0.dev2025013105,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025013105 release - - mblack ==25.1.0.dev2025013105 release + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release license: LicenseRef-Modular-Proprietary - size: 9918 - timestamp: 1738300734602 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025013105-release.conda - sha256: 1ac416f06cc0adad41d5ca07d55c0e146073c2971ba30696ce561fd7af5afb1a - md5: ddc94cd4ca461791a9e3ae7a571e78ed + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f depends: - - mblack ==25.1.0.dev2025013105 release + - mblack ==25.2.0.dev2025022718 release license: LicenseRef-Modular-Proprietary - size: 243598857 - timestamp: 1738300650444 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025013105-release.conda - sha256: faee2aee06a50c1ca71fc7df91564dafe97986a71474fe0c2694b663bc7b0a1d - md5: 203e66b533a2e81c659276ce2a211b6b + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 depends: - - mblack ==25.1.0.dev2025013105 release + - mblack ==25.2.0.dev2025022718 release license: LicenseRef-Modular-Proprietary - size: 246147380 - timestamp: 1738300734602 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025013105-release.conda - sha256: 12c6501ffb4e951a4e583ef694529e5621ee4c9d06554b0db464de1a37552974 - md5: 5663c30c6ab3e0a29c0fdb08f5634a68 + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 depends: - - mblack ==25.1.0.dev2025013105 release + - mblack ==25.2.0.dev2025022718 release license: LicenseRef-Modular-Proprietary - size: 209002959 - timestamp: 1738349723783 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025013105-3.12release.conda - sha256: d08de32fd4aa12b4593146fc6f268a105b264e279c3a75009870e8d310778ea6 - md5: 27c0957cae6a8620faf67beb5f320aa4 + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf depends: - - max-core ==25.1.0.dev2025013105 release - - python - - fastapi - - httpx - - huggingface_hub + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 - numpy >=1.18,<2.0 - - opentelemetry-api + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus >=0.48b0 - - opentelemetry-sdk >=1.27.0 - - pillow - - pydantic-settings >=2.4.0,<3 - - pydantic >=2.4.0,<3 - - pyinstrument - - python-json-logger - - sse-starlette >=2.1.3,<3 - - transformers - - typing_extensions - - uvicorn - - python_abi 3.12.* *_cp312 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 120809611 - timestamp: 1738300650444 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025013105-3.12release.conda - sha256: 55f72914a83403fac6e20372314774856b769c67f59791a217593be0132e0433 - md5: 1467c9c730b2fba872caba9c325d3a93 + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 depends: - - max-core ==25.1.0.dev2025013105 release - - python - - fastapi - - httpx - - huggingface_hub + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 - numpy >=1.18,<2.0 - - opentelemetry-api + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus >=0.48b0 - - opentelemetry-sdk >=1.27.0 - - pillow - - pydantic-settings >=2.4.0,<3 - - pydantic >=2.4.0,<3 - - pyinstrument - - python-json-logger - - sse-starlette >=2.1.3,<3 - - transformers - - typing_extensions - - uvicorn - - python_abi 3.12.* *_cp312 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123341772 - timestamp: 1738300734603 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025013105-3.12release.conda - sha256: 880116fc694ec36b549849a351f70e00f092e9de19a17862f76184672ae2bc83 - md5: 8493ea4815ffa8ae223182f94a7a6ecc + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 depends: - - max-core ==25.1.0.dev2025013105 release - - python - - fastapi - - httpx - - huggingface_hub + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 - numpy >=1.18,<2.0 - - opentelemetry-api + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus >=0.48b0 - - opentelemetry-sdk >=1.27.0 - - pillow - - pydantic-settings >=2.4.0,<3 - - pydantic >=2.4.0,<3 - - pyinstrument - - python-json-logger - - sse-starlette >=2.1.3,<3 - - transformers - - typing_extensions - - uvicorn - - python_abi 3.12.* *_cp312 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 108536428 - timestamp: 1738349723783 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025013105-release.conda + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda noarch: python - sha256: 0c8bbcd2d1133b99b54ebff3c8f5461c025c9de38bd8b6a65b5dc01f285dfa22 - md5: 01c6b9f78100a28719df93826b30be0d + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5782,126 +2639,33 @@ packages: - packaging >=22.0 - pathspec >=0.9.0 - platformdirs >=2 + - typing_extensions >=v4.12.2 - python license: MIT - size: 130813 - timestamp: 1738300734602 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 - md5: 592132998493b3ff25fd7479396e8351 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 14465 - timestamp: 1733255681319 -- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.1-pyhd8ed1ab_0.conda - sha256: b82ceee187e715a287d2e1dc2d79dd2c68f84858e9b9dbac38df3d48a6f426d9 - md5: 6e6b93442c2ab2f9902a3637b70c720f + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + sha256: 63d5308ac732b2f8130702c83ee40ce31c5451ebcb6e70075b771cc8f7df0156 + md5: 0982b0f06168fe3421d09f70596ca1f0 depends: - python >=3.9 - typing_extensions license: BSD-3-Clause license_family: BSD - size: 68935 - timestamp: 1738085278568 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025013105-release.conda + size: 68903 + timestamp: 1739952304731 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda noarch: python - sha256: 122b3ad0404caebf7c5271d75ae5504f228795f529b98be2011d1a1cdc71f93d - md5: f218b84b9f1baa40269eaa760534be98 + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 depends: - - max-core ==25.1.0.dev2025013105 release + - max-core ==25.2.0.dev2025022718 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22925 - timestamp: 1738300734602 -- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 - md5: 5b5e3267d915a107eca793d52e1b780a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 61507 - timestamp: 1733913288935 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e - md5: dcf3ae213cf0ab40ebcc10452e1ed9fa - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 63077 - timestamp: 1733913233032 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 - md5: 0048335516fed938e4dd2c457b4c5b9b - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 55968 - timestamp: 1729065664275 -- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - sha256: bb612a921fafda6375a2204ffebd8811db8dd3b8f25ac9886cc9bcbff7e3664e - md5: 5a64b9f44790d9a187a85366dd0ffa8d - depends: - - dill >=0.3.6 - - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 335666 - timestamp: 1695459025249 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - sha256: c53362cdf346f314e111faddc53061e3fd2ece0ba68ca303f5dd109976df158f - md5: 173a1692d2b3ddc265dc6afd21a869b3 - depends: - - dill >=0.3.6 - - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 336110 - timestamp: 1695459137796 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 - md5: 910ef2223c71902175418d9163152788 - depends: - - dill >=0.3.6 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 335147 - timestamp: 1695459275360 + size: 22981 + timestamp: 1740680254354 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f @@ -6005,43 +2769,6 @@ packages: license_family: BSD size: 11543 timestamp: 1733325673691 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda - sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 - md5: e46f7ac4917215b49df2ea09a694a3fa - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 122743 - timestamp: 1723652407663 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda - sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 - md5: f2bd10ff23ab5c87327439c4499b3f3e - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 122755 - timestamp: 1723652622631 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda - sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b - md5: d2dee849c806430eee64d3acc98ce090 - depends: - - __osx >=11.0 - - libcxx >=16 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 123250 - timestamp: 1723652704997 - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056 md5: e7f89ea5f7ea9401642758ff50a2d9c1 @@ -6110,55 +2837,9 @@ packages: license_family: BSD size: 6073136 timestamp: 1707226249608 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda - sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 - md5: 9e5816bc95d285c115a3ebc2f8563564 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libpng >=1.6.44,<1.7.0a0 - - libstdcxx >=13 - - libtiff >=4.7.0,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 342988 - timestamp: 1733816638720 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda - sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d - md5: 04231368e4af50d11184b50e14250993 - depends: - - libgcc >=13 - - libpng >=1.6.44,<1.7.0a0 - - libstdcxx >=13 - - libtiff >=4.7.0,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - arch: aarch64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 377796 - timestamp: 1733816683252 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda - sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 - md5: 4b71d78648dbcf68ce8bf22bb07ff838 - depends: - - __osx >=11.0 - - libcxx >=18 - - libpng >=1.6.44,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 319362 - timestamp: 1733816781741 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - sha256: f62f6bca4a33ca5109b6d571b052a394d836956d21b25b7ffd03376abf7a481f - md5: 4ce6875f75469b2757a65e10a5d05e31 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates @@ -6167,11 +2848,11 @@ packages: platform: linux license: Apache-2.0 license_family: Apache - size: 2937158 - timestamp: 1736086387286 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda - sha256: 60d34454b861501d7355f25a7b39fdb5de8d56fca49b5bcbe8b8142b7d82dce4 - md5: e21c4767e783a58c373fdb99de6211bf + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d depends: - ca-certificates - libgcc >=13 @@ -6179,11 +2860,11 @@ packages: platform: linux license: Apache-2.0 license_family: Apache - size: 3469279 - timestamp: 1736088141230 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - sha256: 97772762abc70b3a537683ca9fc3ff3d6099eb64e4aba3b9c99e6fce48422d21 - md5: 22f971393637480bda8c679f374d8861 + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e depends: - __osx >=11.0 - ca-certificates @@ -6191,147 +2872,8 @@ packages: platform: osx license: Apache-2.0 license_family: Apache - size: 2936415 - timestamp: 1736086108693 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda - sha256: 296280c8ace35c0a1cf72bed1077f248b3af903c3bf92332f1783a207cb5abdb - md5: 307b05402c1a382f2f09426492dee8f8 - depends: - - deprecated >=1.2.6 - - importlib-metadata >=6.0,<=8.5.0 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 44166 - timestamp: 1734132973331 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda - sha256: ae9776efe52564e0d6711cfcee7c54439273e57a3999f7f796f66e862f58aae9 - md5: 0c02e74d26bce3fec93b227cf7ea6e6b - depends: - - backoff >=1.10.0,<3.0.0 - - opentelemetry-proto 1.29.0 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 18922 - timestamp: 1734310457116 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda - sha256: 5d61db9d5b4f91b3932f5f2348920d5b7fdaa09e52c8ea054cf7bf3f21677c9c - md5: 223f4e56a29601c887f0dc467034af5b - depends: - - deprecated >=1.2.6 - - googleapis-common-protos >=1.52,<2.dev0 - - opentelemetry-api >=1.15,<2.dev0 - - opentelemetry-exporter-otlp-proto-common 1.29.0 - - opentelemetry-proto 1.29.0 - - opentelemetry-sdk 1.29.0 - - python >=3.9 - - requests >=2.7,<3.dev0 - license: Apache-2.0 - license_family: APACHE - size: 17147 - timestamp: 1734345675510 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda - sha256: b8239230dbbdb491401e41b53bd9f21d60551cedef1a8d5807fca1bf9bdd331c - md5: 1ddc95052b31147d1e10d818cf519cf5 - depends: - - opentelemetry-api >=1.10.0 - - opentelemetry-sdk >=1.10.0 - - prometheus_client >=0.5.0,<1.0.0 - - python >=3.6 - license: Apache-2.0 - license_family: APACHE - size: 14721 - timestamp: 1695214221489 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda - sha256: 200a7cb8acc8a0ddd6ef55c5460cec871b6a265929b240a0296c0ccb9c8d9758 - md5: e2a6d2ad10b813c7fdc1c64aac376128 - depends: - - protobuf <6.0,>=5.0 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 37235 - timestamp: 1734291034372 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda - sha256: 7b36629d8b8be8a019fcfd1518d7b7f862dd25de96f8adcadb93e4fd12cf9bd6 - md5: 2a8893f06e6ebda4bfa78875bc923ea4 - depends: - - opentelemetry-api 1.29.0 - - opentelemetry-semantic-conventions 0.50b0 - - python >=3.9 - - typing-extensions >=3.7.4 - - typing_extensions >=3.7.4 - license: Apache-2.0 - license_family: APACHE - size: 77645 - timestamp: 1734297838999 -- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda - sha256: 6526e70368d5bf66ef0eaa51fb800d53782dde71a24bd38f40139919a6f784dc - md5: f7111fa4188d646c8108e232d024cb99 - depends: - - deprecated >=1.2.6 - - opentelemetry-api 1.29.0 - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 86084 - timestamp: 1734208980168 -- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda - sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc - md5: 4f6f9f3f80354ad185e276c120eac3f0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - snappy >=1.2.1,<1.3.0a0 - - tzdata - - zstd >=1.5.6,<1.6.0a0 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1188881 - timestamp: 1735630209320 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda - sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 - md5: d19f01b42e5d6a2908b65df435aff42f - depends: - - libgcc >=13 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - snappy >=1.2.1,<1.3.0a0 - - tzdata - - zstd >=1.5.6,<1.6.0a0 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 1167714 - timestamp: 1735630248837 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda - sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 - md5: 24b1897c0d24afbb70704ba998793b78 - depends: - - __osx >=11.0 - - libcxx >=18 - - libprotobuf >=5.28.3,<5.28.4.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - snappy >=1.2.1,<1.3.0a0 - - tzdata - - zstd >=1.5.6,<1.6.0a0 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 438520 - timestamp: 1735630624140 + size: 2934522 + timestamp: 1739301896733 - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c md5: e51f1e4089cad105b6cac64bd8166587 @@ -6351,62 +2893,6 @@ packages: license_family: APACHE size: 60164 timestamp: 1733203368787 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py312h1d6d2e6_1.conda - sha256: 80fd53b68aa89b929d03874b99621ec8cc6a12629bd8bfbdca87a95f8852af96 - md5: ae00b61f3000d2284d1f2584d4dfafa8 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.8.1 - - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 - - pytz >=2020.1 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 15458981 - timestamp: 1715898284697 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.2-py312h14eacfc_1.conda - sha256: d24c1a6e362d3f1034be308406b05a446c06f8ec974178581c7a3a13fc0110aa - md5: ea4fd304d3cd65f0ddf0dd3c46e0703a - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python-dateutil >=2.8.1 - - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 - - pytz >=2020.1 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 15203830 - timestamp: 1715898319015 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py312h8ae5369_1.conda - sha256: 664bf370d1e254f29fab3b9834ae5f692a59f7e35c64c61d9a9b9989831fd721 - md5: b38af0cd7ae3616c90a2511272385941 - depends: - - __osx >=11.0 - - libcxx >=16 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python-dateutil >=2.8.1 - - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 - - pytz >=2020.1 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 14476760 - timestamp: 1715898136109 - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f md5: 457c2c8c08e54905d6954e79cb5b5db9 @@ -6452,71 +2938,6 @@ packages: license_family: MIT size: 11748 timestamp: 1733327448200 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda - sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 - md5: d3894405f05b2c0f351d5de3ae26fa9c - depends: - - __glibc >=2.17,<3.0.a0 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.5.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.3,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - arch: x86_64 - platform: linux - license: HPND - size: 42749785 - timestamp: 1735929845390 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda - sha256: 7559556ffc44bda777f85c2e5acd6b5756fa5822c0271b329b7b9a3c6bb20349 - md5: 77e0ec0a6fc847d317f204aa15b59f6b - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.5.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.3,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - arch: aarch64 - platform: linux - license: HPND - size: 41362848 - timestamp: 1735932311857 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda - sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee - md5: 94d6ba8cd468668a9fb04193b0f4b36e - depends: - - __osx >=11.0 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.5.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.3,<3.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - arch: arm64 - platform: osx - license: HPND - size: 42852329 - timestamp: 1735930118976 - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda sha256: da8c8888de10c1e4234ebcaa1550ac2b4b5408ac20f093fe641e4bc8c9c9f3eb md5: 04e691b9fadd93a8a9fad87a81d4fd8f @@ -6528,69 +2949,23 @@ packages: license_family: MIT size: 1245116 timestamp: 1734466348103 -- conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - sha256: adb2dde5b4f7da70ae81309cce6188ed3286ff280355cf1931b45d91164d2ad8 - md5: 5a5870a74432aa332f7d32180633ad05 - depends: - - python >=3.9 - license: MIT AND PSF-2.0 - size: 10693 - timestamp: 1733344619659 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 - md5: 577852c7e53901ddccc7e6a9959ddebe - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 20448 - timestamp: 1733232756001 -- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc - md5: a83f6a2fdc079e643237887a37460668 - depends: - - __glibc >=2.17,<3.0.a0 - - libcurl >=8.10.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - zlib - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 199544 - timestamp: 1730769112346 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda - sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 - md5: 10f4301290e51c49979ff98d1bdf2556 - depends: - - libcurl >=8.10.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - zlib - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 211335 - timestamp: 1730769181127 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff - md5: 7172339b49c94275ba42fec3eaeda34f +- conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + sha256: adb2dde5b4f7da70ae81309cce6188ed3286ff280355cf1931b45d91164d2ad8 + md5: 5a5870a74432aa332f7d32180633ad05 depends: - - __osx >=11.0 - - libcurl >=8.10.1,<9.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - - zlib - arch: arm64 - platform: osx + - python >=3.9 + license: MIT AND PSF-2.0 + size: 10693 + timestamp: 1733344619659 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 license: MIT license_family: MIT - size: 173220 - timestamp: 1730769371051 + size: 20448 + timestamp: 1733232756001 - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab md5: 3e01e386307acc60b2f89af0b2e161aa @@ -6612,102 +2987,9 @@ packages: license_family: BSD size: 271905 timestamp: 1737453457168 -- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda - sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb - md5: 349635694b4df27336bc15a49e9220e9 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 52947 - timestamp: 1737635699390 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda - sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb - md5: 533b07e9fd835938f465225613825eee - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 52776 - timestamp: 1737635802135 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda - sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d - md5: 83678928c58c9ae76778a435b6c7a94a - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 50942 - timestamp: 1737635896600 -- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda - sha256: acb2e0ee948e3941f8ed191cb77f654e06538638aed8ccd71cbc78a15242ebbb - md5: 9d7e427d159c1b2d516cc047ff177c48 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - libprotobuf 5.28.3 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 464794 - timestamp: 1731366525051 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda - sha256: 9c575d5035c7ecb114ab9e17906c0a54087d9598dd6a2104c02fe33f0a29dd46 - md5: 06513608c94fb1c1b17136ace77063a9 - depends: - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - libprotobuf 5.28.3 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 473242 - timestamp: 1731366577844 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda - sha256: 9d572a97419bdace14d7c7cc8cc8c4bf2dcb22b56965dac87a27fbdb5061b926 - md5: 5afbe52a59f04dd1fe566d0d17590d7e - depends: - - __osx >=11.0 - - libcxx >=18 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - libprotobuf 5.28.3 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 448803 - timestamp: 1731367010746 -- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.1-py312h66e93f0_0.conda - sha256: 55d4fd0b294aeada0d7810fcc25503b59ec34c4390630789bd61c085b9ce649f - md5: add2c79595fa8a9b6d653d7e4e2cf05f +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + sha256: 158047d7a80e588c846437566d0df64cec5b0284c7184ceb4f3c540271406888 + md5: 8e30db4239508a538e4a3b3cdf5b9616 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -6717,11 +2999,11 @@ packages: platform: linux license: BSD-3-Clause license_family: BSD - size: 487053 - timestamp: 1735327468212 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-6.1.1-py312hb2c0f52_0.conda - sha256: b2db43b7a2d01b998dadd91dd19c2de1f3778b5f8b7bf90020e35acf577cf79e - md5: 3bd3fe4f02e4ff211d9d35b6a3aed824 + size: 466219 + timestamp: 1740663246825 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py312hb2c0f52_0.conda + sha256: 2a4f1ad69b16b9843f90adf5b39418c635835605bd2b300f55a8432c5ee22296 + md5: 1195731cd361196f9e352341a764fccb depends: - libgcc >=13 - python >=3.12,<3.13.0a0 @@ -6731,11 +3013,11 @@ packages: platform: linux license: BSD-3-Clause license_family: BSD - size: 487185 - timestamp: 1735327601306 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.1-py312hea69d52_0.conda - sha256: 90332053dad4056fe752217fa311ffa61cb37dc693b1721e37580e71a2a6fe04 - md5: 90724dac996a4e9d629a88a4b1ffe694 + size: 467245 + timestamp: 1740663309651 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + sha256: cb11dcb39b2035ef42c3df89b5a288744b5dcb5a98fb47385760843b1d4df046 + md5: 0f461bd37cb428dc20213a08766bb25d depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 @@ -6745,42 +3027,8 @@ packages: platform: osx license: BSD-3-Clause license_family: BSD - size: 495397 - timestamp: 1735327574477 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 - md5: b3c17d95b5a10c6e64a21fa17573e70e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 8252 - timestamp: 1726802366959 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba - md5: bb5a90c93e3bac3d5690acf76b4a6386 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 8342 - timestamp: 1726803319942 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 - md5: 415816daf82e0b23a736a069a75e9da7 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 8381 - timestamp: 1726802424786 + size: 476376 + timestamp: 1740663381256 - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 md5: 7d9daffbb8d8e0af0f769dbbcd173a54 @@ -6798,117 +3046,6 @@ packages: license_family: MIT size: 16668 timestamp: 1733569518868 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.0-py312h7900ff3_0.conda - sha256: 7d98e626ec65b882341482ad15ecb7a670ee41dbaf375aa660ba8b7d0a940504 - md5: 14f86e63b5c214dd9fb34e5472d4bafc - depends: - - libarrow-acero 19.0.0.* - - libarrow-dataset 19.0.0.* - - libarrow-substrait 19.0.0.* - - libparquet 19.0.0.* - - pyarrow-core 19.0.0 *_0_* - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 25289 - timestamp: 1737128438818 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.0-py312h8025657_0.conda - sha256: 3a73d3d15031586214381edf5410a6920c1f75f52a8d8b994722b106d9a50150 - md5: a86fa414c44b7e3ee054cc385c79a822 - depends: - - libarrow-acero 19.0.0.* - - libarrow-dataset 19.0.0.* - - libarrow-substrait 19.0.0.* - - libparquet 19.0.0.* - - pyarrow-core 19.0.0 *_0_* - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 25496 - timestamp: 1737129041038 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.0-py312h1f38498_0.conda - sha256: 9d693901833c2ff4e5d67e1f2f6df50f699e1cec2f580c26d42299654830855a - md5: bd5e025292ff1127aa1534b59e55c4d0 - depends: - - libarrow-acero 19.0.0.* - - libarrow-dataset 19.0.0.* - - libarrow-substrait 19.0.0.* - - libparquet 19.0.0.* - - pyarrow-core 19.0.0 *_0_* - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 25428 - timestamp: 1737128284082 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.0-py312h01725c0_0_cpu.conda - sha256: 81178d0de0ac851a0a78e09c81ad92274cf770a38b28acdf53a0cfb2122d15aa - md5: 7ab1143b9ac1af5cc4a630706f643627 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 19.0.0.* *cpu - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - apache-arrow-proc =*=cpu - - numpy >=1.21,<3 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 5230953 - timestamp: 1737128097002 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.0-py312h66f7834_0_cpu.conda - sha256: 17ff419abfe9596f77857dfa635538200427d87283c28e64920d10d6533ec30e - md5: ce51dbcfeae8709f0b94c78eabe7cf5e - depends: - - libarrow 19.0.0.* *cpu - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - numpy >=1.21,<3 - - apache-arrow-proc =*=cpu - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 5023430 - timestamp: 1737627066264 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.0-py312hc40f475_0_cpu.conda - sha256: 6303fe1c3e6d36273b72f0eeb3f19897d2376d57fe8c757f55dcbfbaa5cd6840 - md5: df502157843a7b1d90af04803767be15 - depends: - - __osx >=11.0 - - libarrow 19.0.0.* *cpu - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - apache-arrow-proc =*=cpu - - numpy >=1.21,<3 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: APACHE - size: 4393075 - timestamp: 1737128225546 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 md5: 12c566707c80111f9799308d9e265aef @@ -6919,81 +3056,6 @@ packages: license_family: BSD size: 110100 timestamp: 1733195786147 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - depends: - - annotated-types >=0.6.0 - - pydantic-core 2.27.2 - - python >=3.9 - - typing-extensions >=4.6.1 - - typing_extensions >=4.12.2 - license: MIT - license_family: MIT - size: 296841 - timestamp: 1737761472006 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda - sha256: 81602a4592ad2ac1a1cb57372fd25214e63b1c477d5818b0c21cde0f1f85c001 - md5: bae01b2563030c085f5158c518b84e86 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.6.0,!=4.7.0 - constrains: - - __glibc >=2.17 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 1641402 - timestamp: 1734571789895 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda - sha256: 623e0f3846f15d035ce7ab7ae445fc8d9e547b6684ab55858b6f44510d24b097 - md5: 9677f6ab4bf27ba3c2aee70d08c7b27c - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.6.0,!=4.7.0 - constrains: - - __glibc >=2.17 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 1505076 - timestamp: 1734571966615 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda - sha256: cfa7201f890d5d08ce29ff70e65a96787d5793a1718776733666b44bbd4a1205 - md5: dcb307e02f17d38c6e1cbfbf8c602852 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.6.0,!=4.7.0 - constrains: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 1593461 - timestamp: 1734571986644 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda - sha256: 082fb1ec29917d2c9ed6a862cb8eb9beb88c208ea62c9fef1aeb5f4f3e0e0b06 - md5: d71d76b62bed332b037d7adfc0f3989a - depends: - - pydantic >=2.7.0 - - python >=3.9 - - python-dotenv >=0.21.0 - license: MIT - license_family: MIT - size: 31822 - timestamp: 1735650532951 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b md5: 232fb4577b6687b2d503ef8e254270c9 @@ -7003,48 +3065,6 @@ packages: license_family: BSD size: 888600 timestamp: 1736243563082 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.1-py312h66e93f0_0.conda - sha256: 3f1c0bc95f2c46dcd107f44cf742ee1fa40ba22e244f01083654743bbbcf28f3 - md5: 9f1d7b421e4c8fd00009490613db64d4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 182333 - timestamp: 1737774425235 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.1-py312hb2c0f52_0.conda - sha256: 16af5db4359078bcb526291855bf1075ab035a96fe4e8d5cc4b0b5c8cba89b9a - md5: 90f5e9e04b1ecf25ad3f28b606f63742 - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 183988 - timestamp: 1737774588265 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.1-py312hea69d52_0.conda - sha256: 5e7de2f908af22bbd8cf3562ce5ebf65ad6c0d8e40038f90b56f4db750639ce2 - md5: 07b0eb9b6bd91dfa87f95032825690dc - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 182524 - timestamp: 1737774624030 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py312hb9d441b_0.conda sha256: 7805d910dd6ac686e2f780c879a986f35d7a4c73f4236c956c03bdcb26bec421 md5: 0726db04477a28c51d1a260afb356b67 @@ -7087,10 +3107,9 @@ packages: license_family: BSD size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda - build_number: 1 - sha256: 3f0e0518c992d8ccfe62b189125721309836fe48a010dc424240583e157f9ff0 - md5: 7fd2fd79436d9b473812f14e86746844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -7098,14 +3117,14 @@ packages: - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc >=13 - - liblzma >=5.6.3,<6.0a0 + - liblzma >=5.6.4,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.47.0,<4.0a0 + - libsqlite >=3.48.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.4.0,<4.0a0 + - openssl >=3.4.1,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -7114,26 +3133,25 @@ packages: arch: x86_64 platform: linux license: Python-2.0 - size: 31565686 - timestamp: 1733410597922 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.8-h1683364_1_cpython.conda - build_number: 1 - sha256: 85573582d5b0f79923fed0a8365d3d74d21eee9f0a5fa1b9345f191e006363ab - md5: 09ec612ea05370989eaa3d81abf0f369 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-aarch64 >=2.36.1 - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc >=13 - - liblzma >=5.6.3,<6.0a0 + - liblzma >=5.6.4,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.47.0,<4.0a0 + - libsqlite >=3.48.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.4.0,<4.0a0 + - openssl >=3.4.1,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -7142,22 +3160,21 @@ packages: arch: aarch64 platform: linux license: Python-2.0 - size: 13760816 - timestamp: 1733407890896 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.8-hc22306f_1_cpython.conda - build_number: 1 - sha256: 7586a711b1b08a9df8864e26efdc06980bdfb0e18d5ac4651d0fee30a8d3e3a0 - md5: 54ca5b5d92ef3a3ba61e195ee882a518 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - liblzma >=5.6.3,<6.0a0 - - libsqlite >=3.47.0,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.4.0,<4.0a0 + - openssl >=3.4.1,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -7166,8 +3183,8 @@ packages: arch: arm64 platform: osx license: Python-2.0 - size: 12998673 - timestamp: 1733408900971 + size: 12947786 + timestamp: 1739520092196 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 md5: 5ba79d7c71f03c678c8ead841f347d6e @@ -7178,95 +3195,24 @@ packages: license_family: APACHE size: 222505 timestamp: 1733215763718 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda - sha256: 99713f6b534fef94995c6c16fd21d59f3548784e9111775d692bdc7c44678f02 - md5: e5c6ed218664802d305e79cc2d4491de - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 24215 - timestamp: 1733243277223 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda sha256: 1b09a28093071c1874862422696429d0d35bd0b8420698003ac004746c5e82a2 md5: 38e34d2d1d9dca4fb2b9a0a04f604e2c depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 226259 - timestamp: 1733236073335 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca - md5: a61bf9ec79426938ff785eb69dbb1960 - depends: - - python >=3.6 - license: BSD-2-Clause - license_family: BSD - size: 13383 - timestamp: 1677079727691 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - sha256: 1b03678d145b1675b757cba165a0d9803885807792f7eb4495e48a38858c3cca - md5: a28c984e0429aff3ab7386f7de56de6f - depends: - - python >=3.9 - license: Apache-2.0 - license_family: Apache - size: 27913 - timestamp: 1734420869885 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 - md5: 392c91c42edd569a7ec99ed8648f597a - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 143794 - timestamp: 1737541204030 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda - sha256: 20851b1e59fee127d49e01fc73195a88ab0779f103b7d6ffc90d11142a83678f - md5: 39aed2afe4d0cf76ab3d6b09eecdbea7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - xxhash >=0.8.2,<0.8.3.0a0 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 23162 - timestamp: 1725272139519 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_1.conda - sha256: 0fa5ba80073a43391ee90303814adbc9fd826175de1fdac273ba0e5b711aa255 - md5: 591c4ae6d8338dfd07b951e00433a405 - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - xxhash >=0.8.2,<0.8.3.0a0 - arch: aarch64 - platform: linux - license: BSD-2-Clause + - python >=3.9 + license: BSD-3-Clause license_family: BSD - size: 23589 - timestamp: 1725273317965 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312h024a12e_1.conda - sha256: 28204ef48f028a4d872e22040da0dad7ebd703549b010a1bb511b6dd94cf466d - md5: 266fe1ae54a7bb17990206664d0f0ae4 + size: 226259 + timestamp: 1733236073335 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - xxhash >=0.8.2,<0.8.3.0a0 - arch: arm64 - platform: osx + - python >=3.6 license: BSD-2-Clause license_family: BSD - size: 21765 - timestamp: 1725272382968 + size: 13383 + timestamp: 1677079727691 - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda build_number: 5 sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 @@ -7407,74 +3353,41 @@ packages: license_family: BSD size: 364649 timestamp: 1738271263898 -- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda - sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 - md5: e84ddf12bde691e8ec894b00ea829ddf - depends: - - libre2-11 2024.07.02 hbbce691_2 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 26786 - timestamp: 1735541074034 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda - sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e - md5: 1bf0135339b4a7419a198a795d2d4be0 - depends: - - libre2-11 2024.07.02 h18dbdb1_2 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 26830 - timestamp: 1735540999398 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb - md5: 7a8b4ad8c58a3408ca89d78788c78178 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 depends: - - libre2-11 2024.07.02 h07bc746_2 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 26861 - timestamp: 1735541088455 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 - md5: 47d31b792659ce70f470b5c82fdfb7a4 - depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 arch: x86_64 platform: linux license: GPL-3.0-only license_family: GPL - size: 281456 - timestamp: 1679532220005 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda - sha256: 4c99f7417419734e3797d45bc355e61c26520e111893b0d7087a01a7fbfbe3dd - md5: 105eb1e16bf83bfb2eb380a48032b655 + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 arch: aarch64 platform: linux license: GPL-3.0-only license_family: GPL - size: 294092 - timestamp: 1679532238805 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 depends: - - ncurses >=6.3,<7.0a0 + - ncurses >=6.5,<7.0a0 arch: arm64 platform: osx license: GPL-3.0-only license_family: GPL - size: 250351 - timestamp: 1679532511311 + size: 252359 + timestamp: 1740379663071 - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda sha256: e20909f474a6cece176dfc0dc1addac265deb5fa92ea90e975fbca48085b20c3 md5: 9140f1c09dd5489549c6a33931b943c7 @@ -7488,48 +3401,6 @@ packages: license_family: MIT size: 51668 timestamp: 1737836872415 -- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda - sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b - md5: 647770db979b43f9c9ca25dcfa7dc4e4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Python-2.0 - license_family: PSF - size: 402821 - timestamp: 1730952378415 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda - sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 - md5: fa8b589107567f532fa1380e66f91776 - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Python-2.0 - license_family: PSF - size: 398947 - timestamp: 1730952477463 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda - sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 - md5: e73cda1f18846b608284bd784f061eac - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Python-2.0 - license_family: PSF - size: 366374 - timestamp: 1730952427552 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad md5: a9b9368f3701a417eac9edbcae7cb737 @@ -7564,38 +3435,13 @@ packages: license_family: MIT size: 7818 timestamp: 1598024297745 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 - md5: 7aed65d4ff222bfb7335997aa40b7da5 - depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.9 - - typing_extensions >=4.0.0,<5.0.0 - license: MIT - license_family: MIT - size: 185646 - timestamp: 1733342347277 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda - sha256: e558f8c254a9ff9164d069110da162fc79497d70c60f2c09a5d3d0d7101c5628 - md5: 4ba15ae9388b67d09782798347481f69 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py312h3b7be25_0.conda + sha256: 0378f8010ef166cea7fcb0d502e3c85fd96442e445aab7e66f8702deb9ab1e26 + md5: b9cb8c7bcbe3df8e640b244ed096b8e2 depends: - - python >=3.9 - - rich >=13.7.1 - - click >=8.1.7 - - typing_extensions >=4.12.2 - python - license: MIT - license_family: MIT - size: 17357 - timestamp: 1733750834072 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda - sha256: e8662d21ca3c912ac8941725392b838a29458b106ef22d9489cdf0f8de145fad - md5: bfb49da0cc9098597d527def04d66f8b - depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - python >=3.12,<3.13.0a0 + - __glibc >=2.17,<3.0.a0 - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 @@ -7603,14 +3449,14 @@ packages: platform: linux license: MIT license_family: MIT - size: 354410 - timestamp: 1733366814237 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.22.3-py312ha4e36d7_0.conda - sha256: bd8215aea86b57f7d036d53eee813a544736e94783faeb7b928931fca45715f8 - md5: 4d41b57d0d3933b9cab7ac8c05745123 + size: 394314 + timestamp: 1740153296343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.23.1-py312he7a34ca_0.conda + sha256: a25be7524da46719fb5badcd388cf9ff9376250830a07bbaad44a69b915f077c + md5: 9925c3b64c5a8a096081b0e64d5fd2f6 depends: + - python - libgcc >=13 - - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 @@ -7618,15 +3464,15 @@ packages: platform: linux license: MIT license_family: MIT - size: 348424 - timestamp: 1733368364148 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.22.3-py312hcd83bfe_0.conda - sha256: 0a8b50bf22400004a706ba160d7cb31f82b8d8c328a59aec73a9e0d3372d1964 - md5: 2f7c4d01946fa2ce73d7ef3eeb041877 + size: 397491 + timestamp: 1740153468896 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.23.1-py312hd60eec9_0.conda + sha256: 9b68bfd5dcd50a0e6c67a2aee42e15bb6d344357361e936fd6b93c9e4eaf0d69 + md5: 21bfb8afb20f48a6c60e83a2f01d7034 depends: + - python - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython + - python 3.12.* *_cpython - python_abi 3.12.* *_cp312 constrains: - __osx >=11.0 @@ -7634,166 +3480,189 @@ packages: platform: osx license: MIT license_family: MIT - size: 318920 - timestamp: 1733367225496 -- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda - sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 - md5: 5e8060d52f676a40edef0006a75c718f + size: 367762 + timestamp: 1740153151756 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda + sha256: 00926652bbb8924e265caefdb1db100f86a479e8f1066efe395d5552dde54d02 + md5: 938c8de6b9de091997145b3bf25cdbf9 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - openssl >=3.4.0,<4.0a0 + - __linux + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 22736 + timestamp: 1733322148326 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + sha256: 5282eb5b462502c38df8cb37cd1542c5bbe26af2453a18a0a0602d084ca39f53 + md5: e67b1b1fa7a79ff9e8e326d0caf55854 + depends: + - __osx + - pyobjc-framework-cocoa + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 23100 + timestamp: 1733322309409 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 arch: x86_64 platform: linux license: Apache-2.0 license_family: Apache - size: 356213 - timestamp: 1737146304079 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda - sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 - md5: 1517c0518f8a06a48a15f41d94252874 + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 depends: - - libgcc >=13 - - openssl >=3.4.0,<4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 arch: aarch64 platform: linux license: Apache-2.0 license_family: Apache - size: 352811 - timestamp: 1737146319512 -- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.2-py312h12e396e_0.conda - sha256: 98b8dfa5eec083e0b3ace00906a7f7e748b1e2446dca17e87473f43278fcc036 - md5: 999ca9d87d2bb8b4c01e62c755b928cf + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 arch: x86_64 platform: linux license: Apache-2.0 - license_family: APACHE - size: 424409 - timestamp: 1736383159339 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.2-py312h8cbf658_0.conda - sha256: 3e230060c1366cbaf03f4315b021dfe47f5147f3af88f17975d661c08fe15ad3 - md5: 2c77c961c4e813b1d05122ac4d803d80 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b depends: - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 arch: aarch64 platform: linux license: Apache-2.0 - license_family: APACHE - size: 408166 - timestamp: 1736383184569 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.2-py312hcd83bfe_0.conda - sha256: 0aeb3e654095ca0261d560d1fc05912d0e94d547a7dc435d7f4cedeba966d176 - md5: fc0383682805e293eba9b8afc9ad0931 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d depends: - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - constrains: - - __osx >=11.0 arch: arm64 platform: osx license: Apache-2.0 - license_family: APACHE - size: 378060 - timestamp: 1736383410115 -- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - sha256: 00926652bbb8924e265caefdb1db100f86a479e8f1066efe395d5552dde54d02 - md5: 938c8de6b9de091997145b3bf25cdbf9 - depends: - - __linux - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 22736 - timestamp: 1733322148326 -- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - sha256: 5282eb5b462502c38df8cb37cd1542c5bbe26af2453a18a0a0602d084ca39f53 - md5: e67b1b1fa7a79ff9e8e326d0caf55854 - depends: - - __osx - - pyobjc-framework-cocoa - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 23100 - timestamp: 1733322309409 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - sha256: e0778e4f276e9a81b51c56f51ec22a27b4d8fc955abc0be77ad09ca9bea06bb9 - md5: 8f28e299c11afdd79e0ec1e279dcdc52 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 775598 - timestamp: 1736512753595 -- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda - sha256: 0557c090913aa63cdbe821dbdfa038a321b488e22bc80196c4b3b1aace4914ef - md5: 7c3c2a0f3ebdea2bbc35538d162b43bf - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 14462 - timestamp: 1733301007770 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db - md5: a451d576819089b0d672f18768be0f65 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 16385 - timestamp: 1733381032766 -- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda - sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 - md5: 3b3e64af585eadfb52bb90b553db5edf + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 depends: - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 - libstdcxx >=13 arch: x86_64 platform: linux - license: BSD-3-Clause - license_family: BSD - size: 42739 - timestamp: 1733501881851 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda - sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af - md5: 2fcc6cd1e5550deb509073fd2e6693e1 + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 - libstdcxx >=13 arch: aarch64 platform: linux - license: BSD-3-Clause - license_family: BSD - size: 43032 - timestamp: 1733501964775 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda - sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f - md5: ded86dee325290da2967a3fea3800eb5 + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f depends: - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 arch: arm64 platform: osx - license: BSD-3-Clause - license_family: BSD - size: 35857 - timestamp: 1733502172664 + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + sha256: 91d664ace7c22e787775069418daa9f232ee8bafdd0a6a080a5ed2395a6fa6b2 + md5: 9bddfdbf4e061821a1a443f93223be61 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 777736 + timestamp: 1740654030775 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 md5: bf7a226e58dfb8346c70df36065d86c9 @@ -7812,17 +3681,6 @@ packages: license_family: MIT size: 36754 timestamp: 1693929424267 -- conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda - sha256: 3c6a476e7afb702d841e23c61a0c4cc491929d2e39376d329e67e94c40a236cc - md5: c1ef6bc13dd2caa4b406fb3cb06c2791 - depends: - - anyio >=4.7.0 - - python >=3.9 - - starlette >=0.41.3 - license: BSD-3-Clause - license_family: BSD - size: 15324 - timestamp: 1735126414893 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 md5: b1b505328da7a6b246787df4b5a49fbc @@ -7835,17 +3693,6 @@ packages: license_family: MIT size: 26988 timestamp: 1733569565672 -- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda - sha256: be48c99e6fb8e12ebee09e6fbb4d78a170b614cdaa19ab791a8f5b6caf09919a - md5: 9b3a68bc7aed7949ef86f950993261f4 - depends: - - anyio >=3.6.2,<5 - - python >=3.9 - - typing_extensions >=3.10.0 - license: BSD-3-Clause - license_family: BSD - size: 57934 - timestamp: 1737824077668 - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda sha256: b300557c0382478cf661ddb520263508e4b3b5871b471410450ef2846e8c352c md5: efba281bbdae5f6b0a1d53c6d4a97c93 @@ -7897,80 +3744,24 @@ packages: md5: f75105e0585851f818e0009dd1dde4dc depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - arch: aarch64 - platform: linux - license: TCL - license_family: BSD - size: 3351802 - timestamp: 1695506242997 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 - md5: b50a57ba89c32b62428b71a875291c9b - depends: - - libzlib >=1.2.13,<2.0.0a0 - arch: arm64 - platform: osx - license: TCL - license_family: BSD - size: 3145523 - timestamp: 1699202432999 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda - sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 - md5: f953aa733207f3d37acf4a3efbedba89 - depends: - - __glibc >=2.17,<3.0.a0 - - huggingface_hub >=0.16.4,<1.0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.4.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: APACHE - size: 2258007 - timestamp: 1732734202127 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda - sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 - md5: 077f48c9e0c08a30d842e15c51df4143 - depends: - - huggingface_hub >=0.16.4,<1.0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.4.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 + - libzlib >=1.2.13,<2.0.0a0 arch: aarch64 platform: linux - license: Apache-2.0 - license_family: APACHE - size: 2331194 - timestamp: 1732734303196 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda - sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 - md5: 4c732c74b485ef7ac8ec1c548dd45e8e + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b depends: - - __osx >=11.0 - - huggingface_hub >=0.16.4,<1.0 - - libcxx >=18 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 arch: arm64 platform: osx - license: Apache-2.0 - license_family: APACHE - size: 1931389 - timestamp: 1732734727624 + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda sha256: 18636339a79656962723077df9a56c0ac7b8a864329eb8f847ee3d38495b863e md5: ac944244f1fed2eb49bae07193ae8215 @@ -8039,62 +3830,6 @@ packages: license_family: BSD size: 110051 timestamp: 1733367480074 -- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.2-pyhd8ed1ab_0.conda - sha256: 67b19c3d6befcc538df3e6d8dc7c4a2b6c7e35b7c1666da790cea4166f1b768a - md5: 717807c559e9a30fea4850ab8881adcb - depends: - - datasets !=2.5.0 - - filelock - - huggingface_hub >=0.23.0,<1.0 - - numpy >=1.17 - - packaging >=20.0 - - python >=3.9 - - pyyaml >=5.1 - - regex !=2019.12.17 - - requests - - safetensors >=0.4.1 - - tokenizers >=0.21,<0.22 - - tqdm >=4.27 - license: Apache-2.0 - license_family: APACHE - size: 3416794 - timestamp: 1738278628376 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 - md5: 170a0398946d8f5b454e592672b6fc20 - depends: - - python >=3.9 - - typer-slim-standard 0.15.1 hd8ed1ab_0 - license: MIT - license_family: MIT - size: 56175 - timestamp: 1733408582623 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 - md5: 0218b16f5a1dd569e575a7a6415489db - depends: - - click >=8.0.0 - - python >=3.9 - - typing_extensions >=3.7.4.3 - constrains: - - rich >=10.11.0 - - typer >=0.15.1,<0.15.2.0a0 - - shellingham >=1.3.0 - license: MIT - license_family: MIT - size: 43592 - timestamp: 1733408569554 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda - sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f - md5: 4e603c43bfdfc7b533be087c3e070cc9 - depends: - - rich - - shellingham - - typer-slim 0.15.1 pyhd8ed1ab_0 - license: MIT - license_family: MIT - size: 49531 - timestamp: 1733408570063 - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20241206-pyhd8ed1ab_0.conda sha256: 8b98cd9464837174ab58aaa912fc95d5831879864676650a383994033533b8d1 md5: 1dbc4a115e2ad9fb7f9d5b68397f66f9 @@ -8159,128 +3894,6 @@ packages: license_family: MIT size: 100102 timestamp: 1734859520452 -- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda - sha256: 55c160b0cf9274e2b98bc0f7fcce548bffa8d788bc86aa02801877457040f6fa - md5: 5d448feee86e4740498ec8f8eb40e052 - depends: - - __unix - - click >=7.0 - - h11 >=0.8 - - python >=3.9 - - typing_extensions >=4.0 - license: BSD-3-Clause - license_family: BSD - size: 48643 - timestamp: 1734293057914 -- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda - sha256: 87e1531e175e75122f9f37608eb953af4c977465ab0ae11283cc01fef954e4ec - md5: 32a94143a7f65d76d2d5da37dcb4ed79 - depends: - - __unix - - httptools >=0.6.3 - - python-dotenv >=0.13 - - pyyaml >=5.1 - - uvicorn 0.34.0 pyh31011fe_0 - - uvloop >=0.14.0,!=0.15.0,!=0.15.1 - - watchfiles >=0.13 - - websockets >=10.4 - license: BSD-3-Clause - license_family: BSD - size: 7203 - timestamp: 1734293058849 -- conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda - sha256: 9337a80165fcf70b06b9d6ba920dad702260ca966419ae77560a15540e41ab72 - md5: 998e481e17c1b6a74572e73b06f2df08 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libuv >=1.49.2,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: MIT OR Apache-2.0 - size: 701355 - timestamp: 1730214506716 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda - sha256: 807eede6698bd00a1d739a3e19ee6ae6a03a66d2ddd2ef150f2dfd198c3b0292 - md5: d83e107ba16c77aba2feec47b7b666a4 - depends: - - libgcc >=13 - - libuv >=1.49.2,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: MIT OR Apache-2.0 - size: 655266 - timestamp: 1730214606664 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda - sha256: b1efa77aa4871d7bb09c8dd297fa9bd9070ba7f0f95f2d12ae9cdd31ce8b6b22 - md5: 4f5110253ba80ebf27e55c4ab333880a - depends: - - __osx >=11.0 - - libuv >=1.49.2,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: MIT OR Apache-2.0 - size: 544097 - timestamp: 1730214653726 -- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda - sha256: b728f525dcae2c10524f9942255346eba62aee9c820ff269d7dd4f7caffb7ffb - md5: df87129c4cb7afc4a3cbad71a1b9e223 - depends: - - __glibc >=2.17,<3.0.a0 - - anyio >=3.0.0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 410192 - timestamp: 1736550568524 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda - sha256: 45193910f6bafc287c784442d173745161b18f96223f0f990a9a744fda753787 - md5: ed958a27e610c31de625e167d4c11a04 - depends: - - anyio >=3.0.0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 403791 - timestamp: 1736550743174 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda - sha256: 84122e3712f2263e12c9d2be75d122eaf2d269801183df4b73aadcb670943b17 - md5: 946eb0208d09b811a671fad9b2831f4e - depends: - - __osx >=11.0 - - anyio >=3.0.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 363822 - timestamp: 1736550859472 - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 md5: b68980f2495d096e71c7fd9d7ccf63e6 @@ -8317,48 +3930,6 @@ packages: license_family: APACHE size: 46718 timestamp: 1733157432924 -- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.2-py312h66e93f0_0.conda - sha256: 52092f1f811fddcbb63e4e8e1c726f32a0a1ea14c36b70982fc2021a3c010e48 - md5: 279166352304d5d4b63429e9c86fa3dc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 242949 - timestamp: 1737358315063 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.2-py312hb2c0f52_0.conda - sha256: 5b8273df10b85a667b4fe71788a12c33a9626723650e28f582fd56c87bad0471 - md5: d7535d5d2f8d49d625071f305d6112a1 - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 244675 - timestamp: 1737358397158 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.2-py312hea69d52_0.conda - sha256: e5ad8c983a1669d06a6648990c0491d5469143f02003c8fd2ae7d066d7d4b086 - md5: 8757561d3ea10ba178fb7fb888f33e3a - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 246269 - timestamp: 1737358485546 - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce md5: 75cb7132eb58d97896e173ef12ac9986 @@ -8368,147 +3939,6 @@ packages: license_family: MIT size: 62931 timestamp: 1733130309598 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda - sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 - md5: 669e63af87710f8d52fdec9d4d63b404 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 63590 - timestamp: 1736869574299 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda - sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c - md5: 8a5c6e3f809bae085be369b62dc5d06a - depends: - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 63967 - timestamp: 1736869675870 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda - sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef - md5: e49608c832fcf438f70cbcae09c3adc5 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 61198 - timestamp: 1736869673767 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 - md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 14780 - timestamp: 1734229004433 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda - sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 - md5: d5397424399a66d33c80b1f2345a36a6 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 15873 - timestamp: 1734230458294 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda - sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d - md5: 50901e0764b7701d8ed7343496f4f301 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 13593 - timestamp: 1734229104321 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee - md5: 8035c64cb77ed555e3f150b7b3972480 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - arch: x86_64 - platform: linux - license: MIT - license_family: MIT - size: 19901 - timestamp: 1727794976192 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f - md5: 25a5a7b797fe6e084e04ffe2db02fc62 - depends: - - libgcc >=13 - arch: aarch64 - platform: linux - license: MIT - license_family: MIT - size: 20615 - timestamp: 1727796660574 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 - md5: 77c447f48cab5d3a15ac224edb86a968 - depends: - - __osx >=11.0 - arch: arm64 - platform: osx - license: MIT - license_family: MIT - size: 18487 - timestamp: 1727795205022 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda - sha256: 6fe74a8fd84ab0dc25e4dc3e0c22388dd8accb212897a208b14fe5d4fbb8fc2f - md5: f08fb5c89edfc4aadee1c81d4cfb1fa1 - depends: - - libgcc-ng >=12 - arch: x86_64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 97691 - timestamp: 1689951608120 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda - sha256: 4c526aed70b579d80e5c20d32130b6bc8bde59b3250d43c2b5269755f4da8a9b - md5: bb9faf6857108a9f62ebb4dab6ef05da - depends: - - libgcc-ng >=12 - arch: aarch64 - platform: linux - license: BSD-2-Clause - license_family: BSD - size: 102442 - timestamp: 1689951682147 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda - sha256: a70f59f7221ee72c45b39a6b36a33eb9c717ba01921cce1a3c361a4676979a2e - md5: 144cd3b88706507f332f5eb5fb83a33b - arch: arm64 - platform: osx - license: BSD-2-Clause - license_family: BSD - size: 97593 - timestamp: 1689951969732 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae @@ -8540,57 +3970,6 @@ packages: license_family: MIT size: 88016 timestamp: 1641347076660 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda - sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce - md5: 6822c49f294d4355f19d314b8b6063d8 - depends: - - __glibc >=2.17,<3.0.a0 - - idna >=2.0 - - libgcc >=13 - - multidict >=4.0 - - propcache >=0.2.1 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 152305 - timestamp: 1737575898300 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda - sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 - md5: d14c78abdd6109e2b7162f53b6cc1e77 - depends: - - idna >=2.0 - - libgcc >=13 - - multidict >=4.0 - - propcache >=0.2.1 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: aarch64 - platform: linux - license: Apache-2.0 - license_family: Apache - size: 149654 - timestamp: 1737576065314 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda - sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e - md5: 092d3b40acc67c470f379049be343a7a - depends: - - __osx >=11.0 - - idna >=2.0 - - multidict >=4.0 - - propcache >=0.2.1 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - arch: arm64 - platform: osx - license: Apache-2.0 - license_family: Apache - size: 145543 - timestamp: 1737576074753 - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 md5: 3947a35e916fcc6b9825449affbf4214 @@ -8643,43 +4022,6 @@ packages: license_family: MIT size: 21809 timestamp: 1732827613585 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 - arch: x86_64 - platform: linux - license: Zlib - license_family: Other - size: 92286 - timestamp: 1727963153079 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 - md5: bc230abb5d21b63ff4799b0e75204783 - depends: - - libgcc >=13 - - libzlib 1.3.1 h86ecc28_2 - arch: aarch64 - platform: linux - license: Zlib - license_family: Other - size: 95582 - timestamp: 1727963203597 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 - md5: e3170d898ca6cb48f1bb567afb92f775 - depends: - - __osx >=11.0 - - libzlib 1.3.1 h8359307_2 - arch: arm64 - platform: osx - license: Zlib - license_family: Other - size: 77606 - timestamp: 1727963209370 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b md5: 8b7069e9792ee4e5b4919a7a306d2e67 diff --git a/examples/offline-inference/magic.lock b/examples/offline-inference/magic.lock new file mode 100644 index 0000000000..c7344b5c98 --- /dev/null +++ b/examples/offline-inference/magic.lock @@ -0,0 +1,9001 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.8.61-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.8.57-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.8.57-h3f2d84a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.8.55-hbd13f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.8.57-hbd13f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.8.61-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.8.55-hbd13f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.8.61-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.8-h5d125a7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-transfer-0.1.9-py312h5bc9d60_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.0.rc1-hb8a341e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h89e7157_113.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py312_heeca0f5_113.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.9.0-py312h14ff09d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.2.0-cuda126py312h5a3d8a8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xgrammar-0.1.11-py312h6edf5ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.8.61-h579c4fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.8.57-h3ae8b8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.8.57-h3ae8b8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cuobjdump-12.8.55-h05609ea_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cupti-12.8.57-h5101a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-tools-12.8.61-h614329b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvdisasm-12.8.55-h5101a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.8.61-h614329b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.8-h5d125a7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.1.5-py312he9d48ea_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-transfer-0.1.9-py312he5cae2c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.0.rc1-h1ddd4b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.5.1-cpu_generic_hb04e7f6_13.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.5.1-cpu_generic_py312_h819a134_13.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.8-h8fb0607_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.9.0-py312h4a2a8a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/triton-3.2.0-cuda126py312h1ed5fa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xgrammar-0.1.11-py312hc94be92_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-transfer-0.1.9-py312hfba41e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_he9b55c7_13.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py312_h49ed405_13.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.8-h8391f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tiktoken-0.9.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xgrammar-0.1.11-py312hd6dbf26_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + size: 18074 + timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + sha256: f1455d2953e3eb6d71bc49881c8558d8e01888469dfd21061dd48afb6183e836 + md5: 848d25bfbadf020ee4d4ba90e5668252 + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.5 + constrains: + - trio >=0.26.1 + - uvloop >=0.21 + license: MIT + license_family: MIT + size: 115305 + timestamp: 1736174485476 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + sha256: f334115c6b0c6c2cd0d28595365f205ec7eaa60bcc5ff91a75d7245f728be820 + md5: a38b801f2bcc12af80c2e02a9e4ce7d9 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 18816 + timestamp: 1733771192649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.8.61-ha770c72_1.conda + sha256: 80a2ddb433b3d3b0abbf97febf5504cbda451e19f3a504936ef961209c647238 + md5: a5c66c2b4b7fb464129a1163a49c9e53 + depends: + - cuda-version >=12.8,<12.9.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 27215 + timestamp: 1738873838328 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.8.61-h579c4fd_1.conda + sha256: 78bfe492a98c2460960e2e9f7bef39326a889e2abb54debc9959ec7494822717 + md5: 04dbd57df8678150c7e5b37da647c702 + depends: + - cuda-version >=12.8,<12.9.0a0 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 27415 + timestamp: 1738873896497 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.8.57-h5888daf_1.conda + sha256: cc58a25d7ab38d8d27aa88b151dd55406cdfe5429b03419a13af8e9aca2f2596 + md5: cc1b22f4f3734a8b0e80aa874e9f1744 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.8.57 h3f2d84a_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22706 + timestamp: 1739215390850 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.8.57-h3ae8b8a_1.conda + sha256: 5790a30774eab55f84afe42ec9e6d81298b31ae3cf2584e245958bc742cfd280 + md5: 3d8375d2e0d1957db66cfe319c76adeb + depends: + - cuda-cudart_linux-aarch64 12.8.57 h3ae8b8a_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22831 + timestamp: 1739215503338 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.8.57-h3f2d84a_1.conda + sha256: a60faad361f3f21a387d8c684114258de63305703db13c76417b5cf0956205a6 + md5: dff7d2f9a0ee9ab03bfff88fff9621da + depends: + - cuda-version >=12.8,<12.9.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 192905 + timestamp: 1739215375478 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.8.57-h3ae8b8a_1.conda + sha256: 70caf7f62c2a645d9ef487fe2f41433145e11786e91fd87dfed6338babdefe04 + md5: aa86deee0e8c93f71fde92db26339407 + depends: + - cuda-version >=12.8,<12.9.0a0 + constrains: + - arm-variant * sbsa + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 207838 + timestamp: 1739215492480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.8.55-hbd13f7d_0.conda + sha256: 424bea1fdfca90acf5c8c255e4b648315e8a07a8065a234dd4b28108d7514d59 + md5: 5ab6c95d69311e911bd98d48118ce047 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvdisasm + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 232521 + timestamp: 1737670501800 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cuobjdump-12.8.55-h05609ea_0.conda + sha256: 1b17aae0d05f839d7a5e08e40edbca2666954db95ed38b85d4c4aca9e1e568ca + md5: dcf96c9ad817538ebdcb1430f4510328 + depends: + - cuda-nvdisasm + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 235857 + timestamp: 1737670525095 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.8.57-hbd13f7d_0.conda + sha256: ff8fb3a51c18a43e8de90df30094e0ae4bb4ae0f35a473aa2f8ab052c5318816 + md5: 3a98112d0341979bbb2e75e71b36a4c0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 1845047 + timestamp: 1737666283622 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cupti-12.8.57-h5101a13_0.conda + sha256: e0b0fe34fcb50c9c6e600bc5e29c7f65e5d09535eeeefae737819f71928c4813 + md5: 619e88e4871378089566f235461b4677 + depends: + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 1620833 + timestamp: 1737666390106 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.8.61-he02047a_1.conda + sha256: 2436f383674e29a788f17e8aa5fc9c86819e122725d2291eda63260f15100496 + md5: fb406ed72a4f4af7acfd591c6787b903 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-crt-tools 12.8.61 ha770c72_1 + - cuda-nvvm-tools 12.8.61 he02047a_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - gcc_impl_linux-64 >=6,<15.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 25714998 + timestamp: 1738873949175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-tools-12.8.61-h614329b_1.conda + sha256: a82b060291312d286b06ccd04f61023c08afe66014fe356b1c594285e61b0b7b + md5: 8c753c56765e2c8babc05cb5e4848c51 + depends: + - cuda-crt-tools 12.8.61 h579c4fd_1 + - cuda-nvvm-tools 12.8.61 h614329b_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - arm-variant * sbsa + - gcc_impl_linux-aarch64 >=6,<15.0a0 + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22320853 + timestamp: 1738874044293 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.8.55-hbd13f7d_0.conda + sha256: 53377e888305b28e5c249b423291de37478ea465b2e4ba0247584491999a1284 + md5: 74f716637584db374166bf8b04f57a13 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 5122708 + timestamp: 1737667356055 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvdisasm-12.8.55-h5101a13_0.conda + sha256: 292b078110ea97c19401a9fbdf359325d472a3b5c164c256846da82e6b3e3a9e + md5: 3829037f6474309e563bc86ea5344669 + depends: + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 5077857 + timestamp: 1737667422732 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.8.61-he02047a_1.conda + sha256: a604b228e8aa84c3739c1b285857bf2c206a3d0ed7798216f5f651a0ac257ae3 + md5: f82afee87477746249975726453c56bf + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 24622383 + timestamp: 1738873904778 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.8.61-h614329b_1.conda + sha256: 9159c3b04c2eb7ed721e7a7ef6d7dec5b5bb58d5874d220299745034f10f5a28 + md5: 1f56d00ef41873791b9c6ab4642964b3 + depends: + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 23961474 + timestamp: 1738873988055 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.8-h5d125a7_3.conda + sha256: 6f93ceb66267e69728d83cf98673221f6b1f95a3514b3a97777cfd0ef8e24f3f + md5: 794eaca58880616a508dd6f6eb389266 + constrains: + - cudatoolkit 12.8|12.8.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 21086 + timestamp: 1737663758355 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: 3e087f072ce03c43a9b60522f5d0ca2f + depends: + - aiohttp + - dill >=0.3.0,<0.3.8 + - fsspec >=2021.11.1 + - huggingface_hub >=0.14.0,<1.0.0 + - importlib-metadata + - multiprocess + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=8.0.0 + - python >=3.8.0 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.19.0 + - tqdm >=4.62.1 + license: Apache-2.0 + license_family: Apache + size: 347303 + timestamp: 1691593908658 +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + sha256: d614bcff10696f1efc714df07651b50bf3808401fcc03814309ecec242cc8870 + md5: 0cef44b1754ae4d6924ac0eef6b9fdbe + depends: + - python >=3.9 + - wrapt <2,>=1.10 + license: MIT + license_family: MIT + size: 14382 + timestamp: 1737987072859 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 5e4f3466526c52bc9af2d2353a1460bd + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 87553 + timestamp: 1690101185422 +- conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + sha256: 3ec40ccf63f2450c5e6c7dd579e42fc2e97caf0d8cd4ba24aa434e6fc264eda0 + md5: 5fbd60d61d21b4bd2f9d7a48fe100418 + depends: + - python >=3.9,<4.0.0 + - sniffio + constrains: + - aioquic >=1.0.0 + - wmi >=1.5.1 + - httpx >=0.26.0 + - trio >=0.23 + - cryptography >=43 + - httpcore >=1.0.0 + - idna >=3.7 + - h2 >=4.1.0 + license: ISC + license_family: OTHER + size: 172172 + timestamp: 1733256829961 +- conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + sha256: b91a19eb78edfc2dbb36de9a67f74ee2416f1b5273dd7327abe53f2dbf864736 + md5: da16dd3b0b71339060cd44cb7110ddf9 + depends: + - dnspython >=2.0.0 + - idna >=2.0.0 + - python >=3.9 + license: Unlicense + size: 44401 + timestamp: 1733300827551 +- conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + sha256: e0d0fdf587aa0ed0ff08b2bce3ab355f46687b87b0775bfba01cc80a859ee6a2 + md5: 0794f8807ff2c6f020422cacb1bd7bfa + depends: + - email-validator >=2.2.0,<2.2.1.0a0 + license: Unlicense + size: 6552 + timestamp: 1733300828176 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e + depends: + - python >=3.9 + license: MIT and PSF-2.0 + size: 20486 + timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + sha256: 5e1e3d5cf306d9b3b5fe0d45a9e8440e8770ba7e4a5fac1ac847ca693b0dc064 + md5: 753382711adab47269f0bfe994906bc4 + depends: + - python >=3.9 + - starlette >=0.40.0,<0.46.0 + - typing_extensions >=4.8.0 + - pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - email_validator >=2.0.0 + - fastapi-cli >=0.0.5 + - httpx >=0.23.0 + - jinja2 >=3.1.5 + - python-multipart >=0.0.18 + - uvicorn-standard >=0.12.0 + - python + license: MIT + license_family: MIT + size: 77940 + timestamp: 1738326226051 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + sha256: 300683731013b7221922339cd40430bb3c2ddeeb658fd7e37f5099ffe64e4db0 + md5: d960e0ea9e1c561aa928f6c4439f04c7 + depends: + - python >=3.9 + - rich-toolkit >=0.11.1 + - typer >=0.12.3 + - uvicorn-standard >=0.15.0 + license: MIT + license_family: MIT + size: 15546 + timestamp: 1734302408607 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + sha256: 7433b8469074985b651693778ec6f03d2a23fad9919a515e3b8545996b5e721a + md5: d9ea16b71920b03beafc17fcca16df90 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 138186 + timestamp: 1738501352608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + sha256: 223a157e2ce9e1195eced1bd42041b8219cc61c0a135f428256cf2753cac8142 + md5: 3fb0305a9a6f1d7607db045fdc42f705 + depends: + - python >=3.8 + - numpy >=1.17 + - tqdm >=4.27 + - pyyaml >=5.1 + - sentencepiece >=0.1.98,<=0.2.0 + - python + license: MIT + license_family: MIT + size: 74687 + timestamp: 1737040120169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda + sha256: a5e341cbf797c65d2477b27d99091393edbaa5178c7d69b7463bb105b0488e69 + md5: 7cbfb3a8bb1b78a7f5518654ac6725ad + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 417323 + timestamp: 1718980707330 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.1.5-py312he9d48ea_3.conda + sha256: b92ffcb02ee027db2b3b8b1256ecf9e04afd4c1680467574889419c9ed42c089 + md5: 9defe233dc6909ac868a1ca50b2ca84d + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 201489 + timestamp: 1733462747377 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + sha256: efaca61923e45849a3d763280305cb3a00a769546ce5df2b1bbe24db40aa23af + md5: 3b8e056a42f71c9398857ecf0b8fbcb6 + depends: + - protobuf >=3.20.2,<6.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 67755 + timestamp: 1740136133858 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + sha256: 622516185a7c740d5c7f27016d0c15b45782c1501e5611deec63fd70344ce7c8 + md5: 7ee49e89531c0dcbba9466f6d115d585 + depends: + - python >=3.9 + - typing_extensions + license: MIT + license_family: MIT + size: 51846 + timestamp: 1733327599467 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hf-transfer-0.1.9-py312h5bc9d60_1.conda + sha256: 21acb87a6403f88b2dbdefb79a537bc8fe871b86c60f9b690206eaf7ad1f009c + md5: 3639aa7b1297e680220f52c2b8a21200 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - openssl >=3.4.1,<4.0a0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1339225 + timestamp: 1739803760467 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-transfer-0.1.9-py312he5cae2c_1.conda + sha256: 5554caf02aa37f3ef9b35d687f515385a50fd505987f5c4b84433d5c50d6a3b5 + md5: fbb03e07e1aefc42b856f0a06dd999f6 + depends: + - python + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + - openssl >=3.4.1,<4.0a0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1366847 + timestamp: 1739803796587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-transfer-0.1.9-py312hfba41e8_1.conda + sha256: 15b1589c703c6a1677008e422175f540f3da35a9a63c588540a219042c697ea4 + md5: baa81a0f9e0470d67728651af77dc1c1 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - openssl >=3.4.1,<4.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 1233816 + timestamp: 1739803893697 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + sha256: c84d012a245171f3ed666a8bf9319580c269b7843ffa79f26468842da3abd5df + md5: 2ca8e6dbc86525c8b95e3c0ffa26442e + depends: + - python >=3.8 + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=3.0,<5.0 + - certifi + license: BSD-3-Clause + license_family: BSD + size: 48959 + timestamp: 1731707562362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda + sha256: 621e7e050b888e5239d33e37ea72d6419f8367e5babcad38b755586f20264796 + md5: 8b1160b32557290b64d5be68db3d996d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 101872 + timestamp: 1732707756745 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda + sha256: 0bd1f30224af142711d11033a7469ae402a1147143f399f7341bbc1d8178c722 + md5: 5e70a6de59352f9a52e9caa7f3447390 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 101255 + timestamp: 1732707891645 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + sha256: 5e93cda79e32e8c0039e05ea1939e688da336187dab025f699b42ef529e848be + md5: e1747a8e8d2aca5499aaea9993bf31ff + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 85623 + timestamp: 1732707871414 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + sha256: f75ca9436fe11d0def6e575d29e0614033c45c90f37895a3b2bb3536612b251c + md5: 0bbbf72b600a1df32666a084769bf240 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + size: 287974 + timestamp: 1740068383431 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 + md5: 315607a3030ad5d5227e76e0733798ff + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 28623 + timestamp: 1733223207185 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + sha256: 47cf6a4780dc41caa9bc95f020eed485b07010c9ccc85e9ef44b538fedb5341d + md5: b87b1abd2542cf65a00ad2e2461a3083 + depends: + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 287007 + timestamp: 1739161069194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda + build_number: 31 + sha256: 862289f2cfb84bb6001d0e3569e908b8c42d66b881bd5b03f730a3924628b978 + md5: bdf4a57254e8248222cb631db4393ff1 + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - liblapack =3.9.0=31*_mkl + - liblapacke =3.9.0=31*_mkl + - blas =2.131=mkl + - libcblas =3.9.0=31*_mkl + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 17259 + timestamp: 1740087718283 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda + build_number: 31 + sha256: 2ee3ab2b6eeb59f2d3c6f933fa0db28f1b56f0bc543ed2c0f6ec04060e4b6ec0 + md5: 2a06a6c16b45bd3d10002927ca204b67 + depends: + - libblas 3.9.0 31_hfdb39a5_mkl + constrains: + - liblapack =3.9.0=31*_mkl + - liblapacke =3.9.0=31*_mkl + - blas =2.131=mkl + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 16724 + timestamp: 1740087727554 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda + build_number: 31 + sha256: a2d20845d916ac8fba09376cd791136a9b4547afb2131bc315178adfc87bb4ca + md5: 10d012ddd7cc1c7ff9093d4974a34e53 + depends: + - libblas 3.9.0 31_hfdb39a5_mkl + constrains: + - liblapacke =3.9.0=31*_mkl + - blas =2.131=mkl + - libcblas =3.9.0=31*_mkl + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 16760 + timestamp: 1740087736615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.0.rc1-hb8a341e_0.conda + sha256: efd9d6646cff6e93a81a9b671fa7af683f843ad72d1a46e258720d2a639f1034 + md5: cf83972da6924c67d8fbffa222896b95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.5,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 42975121 + timestamp: 1738551437179 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.0.rc1-h1ddd4b9_0.conda + sha256: 7a06b4f6656f26e0b5ff124701973fa8602f5062f211d3975f40d5239d3eb4d9 + md5: a7649551ec41c69f5361a6c596ed1ffd + depends: + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.5,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 42134035 + timestamp: 1738491036719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + sha256: 3861a65106a5f876eff3fc19042c3edb528216114b9f8e64b37aebf003deda11 + md5: c4b1ba0d7cef5002759d2f156722feee + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + size: 291536 + timestamp: 1739957375872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h89e7157_113.conda + sha256: 70e24c9b98d24006ce3c2b27503cb2c122f78cc6f59e980db774020203835aca + md5: 0dfe6af4a27ec2372271e3703cc52e48 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas * *mkl + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl >=2024.2.2,<2025.0a0 + - sleef >=3.8,<4.0a0 + constrains: + - pytorch-gpu ==99999999 + - pytorch-cpu ==2.5.1 + - pytorch 2.5.1 cpu_mkl_*_113 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 53568815 + timestamp: 1739239230425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.5.1-cpu_generic_hb04e7f6_13.conda + sha256: 62f94d17e75cdf2f48f4a89175759449aaad05bf2a356836430c82c65a7c5f44 + md5: ad17071bfd97d24a7a83fd044ae6282c + depends: + - _openmp_mutex >=4.5 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - sleef >=3.8,<4.0a0 + constrains: + - pytorch-cpu ==2.5.1 + - pytorch 2.5.1 cpu_generic_*_13 + - openblas * openmp_* + - pytorch-gpu ==99999999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 37722765 + timestamp: 1739239246382 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_he9b55c7_13.conda + sha256: 320cca1b7dbe0506221e0fb2911838fd112d4440a5298f033b56c1a93f0cf6fa + md5: e24814d808f0cd0e130dc141af1a8efd + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=18.1.8 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - sleef >=3.8,<4.0a0 + constrains: + - pytorch-gpu ==99999999 + - pytorch 2.5.1 cpu_generic_*_13 + - pytorch-cpu ==2.5.1 + - openblas * openmp_* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 28302663 + timestamp: 1739247703257 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + sha256: b4a8890023902aef9f1f33e3e35603ad9c2f16c21fdb58e968fa6c1bd3e94c0b + md5: 771ee65e13bc599b0b62af5359d80169 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 891272 + timestamp: 1737016632446 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda + sha256: 67914c7f171d343059144d804c2f17fcd621a94e45f179a0fd843b8c1618823e + md5: 915db044076cbbdffb425170deb4ce38 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 621056 + timestamp: 1737016626950 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + sha256: d13fb49d4c8262bf2c44ffb2c77bb2b5d0f85fc6de76bdb75208efeccb29fce6 + md5: 20717343fb30798ab7c23c2e92b748c1 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 418890 + timestamp: 1737016751326 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 + md5: 9915f85a72472011550550623cce2d53 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 3190529 + timestamp: 1736986301022 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 148824 + timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda + sha256: 1d500158262f30b9c23e37d1c861fe76e127a3926d69b3b38c25d20d3faa6f9f + md5: bc8607ab678073a0441808a31465f4fb + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 25079 + timestamp: 1733220639175 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 1e46a465f1d8e75afa9822717e6c6ee75965c078d0cd7b217c4f8622847e9fb0 + md5: 7257078fedac4bbfb961c30a84e2c387 + depends: + - max-python ==25.2.0.dev2025022718 release + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 10365 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 + md5: 1459379c79dda834673426504d52b319 + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=19.1.2 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + size: 124718448 + timestamp: 1730231808335 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda + sha256: b5b674f496ed28c0b2d08533c6f11eaf1840bf7d9c830655f51514f2f9d9a9c8 + md5: d3758cd24507dc1bda3483ce051d48ac + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: aarch64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 132799 + timestamp: 1725629168783 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda + sha256: abb35c37de2ec6c9ee89995142b1cfea9e6547202ba5578e5307834eca6d436f + md5: 65b21e8d5f0ec6a2f7e87630caed3318 + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + size: 1841314 + timestamp: 1725746723157 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + sha256: bb612a921fafda6375a2204ffebd8811db8dd3b8f25ac9886cc9bcbff7e3664e + md5: 5a64b9f44790d9a187a85366dd0ffa8d + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 335666 + timestamp: 1695459025249 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + sha256: c53362cdf346f314e111faddc53061e3fd2ece0ba68ca303f5dd109976df158f + md5: 173a1692d2b3ddc265dc6afd21a869b3 + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 336110 + timestamp: 1695459137796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 + md5: 910ef2223c71902175418d9163152788 + depends: + - dill >=0.3.6 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 335147 + timestamp: 1695459275360 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b + md5: 9a66894dfd07c4510beb6b3f9672ccc0 + constrains: + - mkl <0.a0 + license: BSD-3-Clause + license_family: BSD + size: 3843 + timestamp: 1582593857545 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + sha256: 6fd70c3d5b509ef1c30cb13df877f14b04bb0e53da032950921b31d95aa5971d + md5: bc4b4177052f661da6d56838dfe57a52 + depends: + - python >=3.9 + constrains: + - nvidia-ml ==9999999999 + - pynvml ~=12.0 + license: BSD-3-Clause + license_family: BSD + size: 43543 + timestamp: 1737778765664 +- conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + sha256: 002c17241c698ba07b0d610da0590e8c8c1e38aef13cf7bd03112b2a9ff5350d + md5: eceb58298054d6f2b7c8f8c53642c2d8 + depends: + - __unix + - nvidia-ml-py >=11.450.51,<12.571.0a0 + - psutil >=5.6.6 + - python >=3.9 + license: GPL-3.0-only + license_family: GPL + size: 143819 + timestamp: 1737914833293 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d + md5: 04231368e4af50d11184b50e14250993 + depends: + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 377796 + timestamp: 1733816683252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + sha256: ab5b873cc2542e305236e0439d323bf880d1b49eafe7a8a04d6863a5a409059d + md5: 65caf9f399f67c1c16efc0fb76f3576c + depends: + - deprecated >=1.2.6 + - importlib-metadata <=8.5.0,>=6.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 44649 + timestamp: 1738813183426 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + sha256: 12294c0e75460bf773500d0b97d58701f6141a26ebc7507b7aefd045c3943801 + md5: 49cf930ab95d2abaabb17f0d40899628 + depends: + - backoff >=1.10.0,<3.0.0 + - opentelemetry-proto 1.30.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 19155 + timestamp: 1738757443981 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + sha256: 4bdb101663f63cd9b9c5560b40cc4441fd766885a13a130c9a0b60addc493f7d + md5: 19cd3caf8abaabe7210cb46dbde1932b + depends: + - deprecated >=1.2.6 + - googleapis-common-protos ~=1.52 + - opentelemetry-api ~=1.15 + - opentelemetry-exporter-otlp-proto-common 1.30.0 + - opentelemetry-proto 1.30.0 + - opentelemetry-sdk >=1.30.0,<1.31.dev0 + - python >=3.9 + - requests ~=2.7 + license: Apache-2.0 + license_family: APACHE + size: 17129 + timestamp: 1738881064907 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + sha256: 1b7420798c2e8589ea9c03a0b9e1db64a79dfbdf6d12937ad69fd70f9b2a6ec7 + md5: cbfa34f2b05a9f916b4e255416103082 + depends: + - python >=3.9 + - opentelemetry-api >=1.12,<2.dev0 + - opentelemetry-sdk >=1.30.0,<1.31.dev0 + - prometheus_client >=0.5.0,<1.0.0 + - python + license: Apache-2.0 + license_family: APACHE + size: 22659 + timestamp: 1740444975350 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + sha256: a7dfb1566daca6bd7aea78ccc69257324336fa945199081c9a9d378d1b59737b + md5: 6b2133dbe9127cd09d3c20061c8f4faa + depends: + - protobuf <6.0,>=5.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 37366 + timestamp: 1738753488553 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + sha256: 287fac5c7a0a0a565932b7a43b733036bbc08e2b11cd93fb64f29ededb89e9c6 + md5: 3667728a1b18fb9a32aef23036934d9f + depends: + - opentelemetry-api 1.30.0 + - opentelemetry-semantic-conventions 0.51b0 + - python >=3.9 + - typing-extensions >=3.7.4 + - typing_extensions >=3.7.4 + license: Apache-2.0 + license_family: APACHE + size: 77853 + timestamp: 1738855492720 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + sha256: 2618877c066a6608ea57a05d260ddd805d0f59b95076f63d816df139f648f25a + md5: ff41e8547f2e7e0d0affc6c6e6e0e87f + depends: + - deprecated >=1.2.6 + - opentelemetry-api 1.30.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 91903 + timestamp: 1738850427906 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 + md5: d3894405f05b2c0f351d5de3ae26fa9c + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 42749785 + timestamp: 1735929845390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + sha256: 7559556ffc44bda777f85c2e5acd6b5756fa5822c0271b329b7b9a3c6bb20349 + md5: 77e0ec0a6fc847d317f204aa15b59f6b + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 41362848 + timestamp: 1735932311857 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee + md5: 94d6ba8cd468668a9fb04193b0f4b36e + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + size: 42852329 + timestamp: 1735930118976 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + sha256: 122433fc5318816b8c69283aaf267c73d87aa2d09ce39f64c9805c9a3b264819 + md5: e9dcbce5f45f9ee500e728ae58b605b6 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 23595 + timestamp: 1733222855563 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + sha256: 28262575a4b0421a50983be5e898205b7315b50d3e72518fe44b2b9c368026d8 + md5: e86915350744e5a8de993f7474ca98ce + depends: + - python >=3.9 + - prometheus_client >=0.8.0 + - typing_extensions >=3.10.0 + - wrapt + - python + license: Apache-2.0 + license_family: APACHE + size: 24093 + timestamp: 1737857634308 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab + md5: 3e01e386307acc60b2f89af0b2e161aa + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 49002 + timestamp: 1733327434163 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + sha256: acb2e0ee948e3941f8ed191cb77f654e06538638aed8ccd71cbc78a15242ebbb + md5: 9d7e427d159c1b2d516cc047ff177c48 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 464794 + timestamp: 1731366525051 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda + sha256: 9c575d5035c7ecb114ab9e17906c0a54087d9598dd6a2104c02fe33f0a29dd46 + md5: 06513608c94fb1c1b17136ace77063a9 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 473242 + timestamp: 1731366577844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + sha256: 9d572a97419bdace14d7c7cc8cc8c4bf2dcb22b56965dac87a27fbdb5061b926 + md5: 5afbe52a59f04dd1fe566d0d17590d7e + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 448803 + timestamp: 1731367010746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + sha256: 158047d7a80e588c846437566d0df64cec5b0284c7184ceb4f3c540271406888 + md5: 8e30db4239508a538e4a3b3cdf5b9616 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 466219 + timestamp: 1740663246825 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py312hb2c0f52_0.conda + sha256: 2a4f1ad69b16b9843f90adf5b39418c635835605bd2b300f55a8432c5ee22296 + md5: 1195731cd361196f9e352341a764fccb + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 467245 + timestamp: 1740663309651 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + sha256: cb11dcb39b2035ef42c3df89b5a288744b5dcb5a98fb47385760843b1d4df046 + md5: 0f461bd37cb428dc20213a08766bb25d + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 476376 + timestamp: 1740663381256 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + sha256: 27f888492af3d5ab19553f263b0015bf3766a334668b5b3a79c7dc0416e603c1 + md5: 8088a5e7b2888c780738c3130f2a969d + depends: + - pybind11-global 2.13.6 *_2 + - python + constrains: + - pybind11-abi ==4 + license: BSD-3-Clause + license_family: BSD + size: 186375 + timestamp: 1730237816231 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + sha256: 9ff0d61d86878f81779bdb7e47656a75feaab539893462cff29b8ec353026d81 + md5: 120541563e520d12d8e39abd7de9092c + depends: + - __unix + - python + constrains: + - pybind11-abi ==4 + license: BSD-3-Clause + license_family: BSD + size: 179139 + timestamp: 1730237481227 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: c69f87041cf24dfc8cb6bf64ca7133c7 + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.27.2 + - python >=3.9 + - typing-extensions >=4.6.1 + - typing_extensions >=4.12.2 + license: MIT + license_family: MIT + size: 296841 + timestamp: 1737761472006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + sha256: 81602a4592ad2ac1a1cb57372fd25214e63b1c477d5818b0c21cde0f1f85c001 + md5: bae01b2563030c085f5158c518b84e86 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1641402 + timestamp: 1734571789895 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda + sha256: 623e0f3846f15d035ce7ab7ae445fc8d9e547b6684ab55858b6f44510d24b097 + md5: 9677f6ab4bf27ba3c2aee70d08c7b27c + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1505076 + timestamp: 1734571966615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + sha256: cfa7201f890d5d08ce29ff70e65a96787d5793a1718776733666b44bbd4a1205 + md5: dcb307e02f17d38c6e1cbfbf8c602852 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1593461 + timestamp: 1734571986644 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + sha256: 84b78dcdc75d7dacd8c85df9a7fef42ff5684897217b46beef6c516afb2550dc + md5: 88715188749bfac9fa92aec9c747d62c + depends: + - pydantic >=2.7.0 + - python >=3.9 + - python-dotenv >=0.21.0 + license: MIT + size: 32632 + timestamp: 1740672054181 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 888600 + timestamp: 1736243563082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.1-py312h66e93f0_0.conda + sha256: 3f1c0bc95f2c46dcd107f44cf742ee1fa40ba22e244f01083654743bbbcf28f3 + md5: 9f1d7b421e4c8fd00009490613db64d4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 182333 + timestamp: 1737774425235 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.1-py312hb2c0f52_0.conda + sha256: 16af5db4359078bcb526291855bf1075ab035a96fe4e8d5cc4b0b5c8cba89b9a + md5: 90f5e9e04b1ecf25ad3f28b606f63742 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 183988 + timestamp: 1737774588265 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.1-py312hea69d52_0.conda + sha256: 5e7de2f908af22bbd8cf3562ce5ebf65ad6c0d8e40038f90b56f4db750639ce2 + md5: 07b0eb9b6bd91dfa87f95032825690dc + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 182524 + timestamp: 1737774624030 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + sha256: 75245ca9d0cbd6d38bb45ec02430189a9d4c21c055c5259739d738a2298d61b3 + md5: 799ed216dc6af62520f32aa39bc1c2bb + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy <2,>=1.5 + - python >=3.9 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 259195 + timestamp: 1733217599806 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + sha256: 99713f6b534fef94995c6c16fd21d59f3548784e9111775d692bdc7c44678f02 + md5: e5c6ed218664802d305e79cc2d4491de + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 24215 + timestamp: 1733243277223 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + size: 13383 + timestamp: 1677079727691 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + sha256: 1b03678d145b1675b757cba165a0d9803885807792f7eb4495e48a38858c3cca + md5: a28c984e0429aff3ab7386f7de56de6f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 27913 + timestamp: 1734420869885 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py312_heeca0f5_113.conda + sha256: dca9058fc3fd8c7720815a60f91fbed21c96deed1862c0779cb9849010a615e0 + md5: 0d0917b3ad4dad39ee9cf2340b6913e7 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - filelock + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas * *mkl + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libtorch 2.5.1.* + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl >=2024.2.2,<2025.0a0 + - networkx + - numpy >=1.19,<3 + - pybind11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.8,<4.0a0 + - sympy >=1.13.1,!=1.13.2 + - typing_extensions + constrains: + - pytorch-gpu ==99999999 + - pytorch-cpu ==2.5.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 27046950 + timestamp: 1739243439897 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.5.1-cpu_generic_py312_h819a134_13.conda + sha256: aca9f90080b41be87632b9be5c05d2d2583583cc8a88c2e4d9a755b4352443e8 + md5: 973311c703c92c0145a0ed6cd28ac1f0 + depends: + - _openmp_mutex >=4.5 + - filelock + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libtorch 2.5.1.* + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - networkx + - nomkl + - numpy >=1.19,<3 + - pybind11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.8,<4.0a0 + - sympy >=1.13.1,!=1.13.2 + - typing_extensions + constrains: + - pytorch-cpu ==2.5.1 + - pytorch-gpu ==99999999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26955065 + timestamp: 1739239589334 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py312_h49ed405_13.conda + sha256: 80ad77e98a4d91287b4c5aad62fb73c19fdcd3bf8a4c46f3630fdb3795b613ac + md5: 8a4ecdb698c36fa439757454437f44bd + depends: + - __osx >=11.0 + - filelock + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libtorch 2.5.1.* + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=18.1.8 + - networkx + - nomkl + - numpy >=1.19,<3 + - pybind11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.8,<4.0a0 + - sympy >=1.13.1,!=1.13.2 + - typing_extensions + constrains: + - pytorch-gpu ==99999999 + - pytorch-cpu ==2.5.1 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 26176295 + timestamp: 1739248670305 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + size: 185646 + timestamp: 1733342347277 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + sha256: e558f8c254a9ff9164d069110da162fc79497d70c60f2c09a5d3d0d7101c5628 + md5: 4ba15ae9388b67d09782798347481f69 + depends: + - python >=3.9 + - rich >=13.7.1 + - click >=8.1.7 + - typing_extensions >=4.12.2 + - python + license: MIT + license_family: MIT + size: 17357 + timestamp: 1733750834072 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + sha256: 87f7d70b0a29627ce7f78a463c6609156aaee638cca917b5f6c6c70828446acf + md5: 82e861633beabad680253e03918ec4a2 + depends: + - python >=3.9 + - python + constrains: + - varname >=0.1 + license: MIT + license_family: MIT + size: 13828 + timestamp: 1740445106343 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + sha256: 91d664ace7c22e787775069418daa9f232ee8bafdd0a6a080a5ed2395a6fa6b2 + md5: 9bddfdbf4e061821a1a443f93223be61 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 777736 + timestamp: 1740654030775 +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + sha256: 0557c090913aa63cdbe821dbdfa038a321b488e22bc80196c4b3b1aace4914ef + md5: 7c3c2a0f3ebdea2bbc35538d162b43bf + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14462 + timestamp: 1733301007770 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda + sha256: c998d5a29848ce9ff1c53ba506e7d01bbd520c39bbe72e2fb7cdf5a53bad012f + md5: aec4dba5d4c2924730088753f6fa164b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSL-1.0 + size: 1920152 + timestamp: 1738089391074 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.8-h8fb0607_0.conda + sha256: 86a19e4457bbc20d6c52a7cf0a010b2d99b704e78ae396f9fae4f4da9ae42cf3 + md5: 76647a886ead58ea5d82990117aafce2 + depends: + - _openmp_mutex >=4.5 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSL-1.0 + size: 1172391 + timestamp: 1738090891356 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.8-h8391f65_0.conda + sha256: e8f26540b22fe2f1c9f44666a8fdf0786e7a40e8e69466d2567a53b106f6dff3 + md5: 6567410b336a7b8f775cd9157fb50d61 + depends: + - __osx >=11.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 + arch: arm64 + platform: osx + license: BSL-1.0 + size: 584685 + timestamp: 1738089615902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 35857 + timestamp: 1733502172664 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 + md5: bf7a226e58dfb8346c70df36065d86c9 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 15019 + timestamp: 1733244175724 +- conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + sha256: 3c6a476e7afb702d841e23c61a0c4cc491929d2e39376d329e67e94c40a236cc + md5: c1ef6bc13dd2caa4b406fb3cb06c2791 + depends: + - anyio >=4.7.0 + - python >=3.9 + - starlette >=0.41.3 + license: BSD-3-Clause + license_family: BSD + size: 15324 + timestamp: 1735126414893 +- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + sha256: be48c99e6fb8e12ebee09e6fbb4d78a170b614cdaa19ab791a8f5b6caf09919a + md5: 9b3a68bc7aed7949ef86f950993261f4 + depends: + - anyio >=3.6.2,<5 + - python >=3.9 + - typing_extensions >=3.10.0 + license: BSD-3-Clause + license_family: BSD + size: 57934 + timestamp: 1737824077668 +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.9.0-py312h14ff09d_0.conda + sha256: aba3affdd0f87e198185ddc0986aa59cb067832dc88ffa6dedbe127da4f8d7bf + md5: 0f116f56298be1450a9db6b45bd2d9a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 968542 + timestamp: 1739550580537 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.9.0-py312h4a2a8a5_0.conda + sha256: 924de648f79b934172cbeafed35ef7413fbd9944c9a76291bbf835da1cfaa0af + md5: 2c8304aecaaced4bbcfc715a5ed16a1a + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 916956 + timestamp: 1739553289605 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tiktoken-0.9.0-py312hf3e4074_0.conda + sha256: a4335c374e3af6c8ce3d0c413b7074c355e04059dca25853ef0961f4ae0ab39b + md5: ca9fecb880b6d35241324835804a98a0 + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 827008 + timestamp: 1739550849700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 1931389 + timestamp: 1732734727624 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + sha256: 18636339a79656962723077df9a56c0ac7b8a864329eb8f847ee3d38495b863e + md5: ac944244f1fed2eb49bae07193ae8215 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 19167 + timestamp: 1733256819729 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.2.0-cuda126py312h5a3d8a8_0.conda + sha256: de5ede47f60573582a3aa6dc840c91a6c2002f294df22032ca91575174d60a21 + md5: 9c6facebce2e8fd1f9559ad14dc9dced + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart + - cuda-cuobjdump + - cuda-cupti >=12.6.80,<13.0a0 + - cuda-nvcc-tools + - cuda-version >=12.6,<13 + - libgcc >=13 + - libllvm20 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 101169812 + timestamp: 1738676149595 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/triton-3.2.0-cuda126py312h1ed5fa8_0.conda + sha256: abd91d81df1ef4b70546da24bc3b01b1aa7a5228bb7d4b73b38abab9dac74bfe + md5: f0c67131cc86daae8adf3ac221ee3a48 + depends: + - cuda-cudart + - cuda-cuobjdump + - cuda-cupti >=12.6.80,<13.0a0 + - cuda-nvcc-tools + - cuda-version >=12.6,<13 + - libgcc >=13 + - libllvm20 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 103306412 + timestamp: 1738676445445 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 + md5: 170a0398946d8f5b454e592672b6fc20 + depends: + - python >=3.9 + - typer-slim-standard 0.15.1 hd8ed1ab_0 + license: MIT + license_family: MIT + size: 56175 + timestamp: 1733408582623 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 + md5: 0218b16f5a1dd569e575a7a6415489db + depends: + - click >=8.0.0 + - python >=3.9 + - typing_extensions >=3.7.4.3 + constrains: + - rich >=10.11.0 + - typer >=0.15.1,<0.15.2.0a0 + - shellingham >=1.3.0 + license: MIT + license_family: MIT + size: 43592 + timestamp: 1733408569554 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f + md5: 4e603c43bfdfc7b533be087c3e070cc9 + depends: + - rich + - shellingham + - typer-slim 0.15.1 pyhd8ed1ab_0 + license: MIT + license_family: MIT + size: 49531 + timestamp: 1733408570063 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + sha256: 55c160b0cf9274e2b98bc0f7fcce548bffa8d788bc86aa02801877457040f6fa + md5: 5d448feee86e4740498ec8f8eb40e052 + depends: + - __unix + - click >=7.0 + - h11 >=0.8 + - python >=3.9 + - typing_extensions >=4.0 + license: BSD-3-Clause + license_family: BSD + size: 48643 + timestamp: 1734293057914 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + sha256: 87e1531e175e75122f9f37608eb953af4c977465ab0ae11283cc01fef954e4ec + md5: 32a94143a7f65d76d2d5da37dcb4ed79 + depends: + - __unix + - httptools >=0.6.3 + - python-dotenv >=0.13 + - pyyaml >=5.1 + - uvicorn 0.34.0 pyh31011fe_0 + - uvloop >=0.14.0,!=0.15.0,!=0.15.1 + - watchfiles >=0.13 + - websockets >=10.4 + license: BSD-3-Clause + license_family: BSD + size: 7203 + timestamp: 1734293058849 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda + sha256: 9337a80165fcf70b06b9d6ba920dad702260ca966419ae77560a15540e41ab72 + md5: 998e481e17c1b6a74572e73b06f2df08 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT OR Apache-2.0 + size: 701355 + timestamp: 1730214506716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda + sha256: 807eede6698bd00a1d739a3e19ee6ae6a03a66d2ddd2ef150f2dfd198c3b0292 + md5: d83e107ba16c77aba2feec47b7b666a4 + depends: + - libgcc >=13 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT OR Apache-2.0 + size: 655266 + timestamp: 1730214606664 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + sha256: b1efa77aa4871d7bb09c8dd297fa9bd9070ba7f0f95f2d12ae9cdd31ce8b6b22 + md5: 4f5110253ba80ebf27e55c4ab333880a + depends: + - __osx >=11.0 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT OR Apache-2.0 + size: 544097 + timestamp: 1730214653726 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda + sha256: b728f525dcae2c10524f9942255346eba62aee9c820ff269d7dd4f7caffb7ffb + md5: df87129c4cb7afc4a3cbad71a1b9e223 + depends: + - __glibc >=2.17,<3.0.a0 + - anyio >=3.0.0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 410192 + timestamp: 1736550568524 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda + sha256: 45193910f6bafc287c784442d173745161b18f96223f0f990a9a744fda753787 + md5: ed958a27e610c31de625e167d4c11a04 + depends: + - anyio >=3.0.0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 403791 + timestamp: 1736550743174 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda + sha256: 84122e3712f2263e12c9d2be75d122eaf2d269801183df4b73aadcb670943b17 + md5: 946eb0208d09b811a671fad9b2831f4e + depends: + - __osx >=11.0 + - anyio >=3.0.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 363822 + timestamp: 1736550859472 +- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0-py312h66e93f0_0.conda + sha256: 409a7a1d32e8ea23ee5233b2e95152cfaec8763aa9031f28cd8014594afc45df + md5: 5da55154de4cc82383f6bd52195db1c4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 263350 + timestamp: 1739780619751 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0-py312hb2c0f52_0.conda + sha256: 7fe6b6150410f57b442e6d130fc433959c436ada975b2f9e6352b902381ece99 + md5: 998b97a00d49748c249b749edbf27107 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 264378 + timestamp: 1739780675487 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0-py312hea69d52_0.conda + sha256: 70f511b2f9f3e0e05f2d403200a55470f9dabf87d8830b42d9ff697b9677c946 + md5: ae0c72f9ce03b54723f1cf7a4066d083 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 264745 + timestamp: 1739780725559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c + md5: 8a5c6e3f809bae085be369b62dc5d06a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 63967 + timestamp: 1736869675870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef + md5: e49608c832fcf438f70cbcae09c3adc5 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 61198 + timestamp: 1736869673767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xgrammar-0.1.11-py312h6edf5ed_2.conda + sha256: ff584830ae7a0e3fb7929f1a7554ca3559c83d5e064aed717719647bcaf2189f + md5: 2e78c5fd9d1e586b0c635e02dbbaa761 + depends: + - triton + - pydantic + - python + - sentencepiece + - tiktoken + - pytorch + - transformers + - pytest + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 AND BSD-4-Clause + size: 4409669 + timestamp: 1740619132269 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xgrammar-0.1.11-py312hc94be92_2.conda + sha256: c283b9f9a73d77cfa806d276010dca62335428d11be170d61fc869b26a038b5a + md5: 1970aa1298826d9e2feb51d16368f5aa + depends: + - triton + - pydantic + - python + - sentencepiece + - tiktoken + - pytorch + - transformers + - pytest + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 AND BSD-4-Clause + size: 4270904 + timestamp: 1740619375982 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xgrammar-0.1.11-py312hd6dbf26_2.conda + sha256: a6801464fd31ddc4e87ae4b210db9cea1bd39e5b3f0d7cc48d9673d53685667b + md5: 41f1c12abe32475b267fcb349fa5f7ab + depends: + - pydantic + - python + - sentencepiece + - tiktoken + - pytorch + - transformers + - pytest + - __osx >=11.0 + - libcxx >=18 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 AND BSD-4-Clause + size: 353403 + timestamp: 1740619156354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 405089 + timestamp: 1714723101397 diff --git a/mojo/magic.lock b/mojo/magic.lock new file mode 100644 index 0000000000..7c733a088a --- /dev/null +++ b/mojo/magic.lock @@ -0,0 +1,2194 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda + build_number: 31 + sha256: 9839fc4ac0cbb0aa3b9eea520adfb57311838959222654804e58f6f2d1771db5 + md5: 728dbebd0f7a20337218beacffd37916 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - libcblas =3.9.0=31*_openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16859 + timestamp: 1740087969120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda + build_number: 31 + sha256: ede8545011f5b208b151fe3e883eb4e31d495ab925ab7b9ce394edca846e0c0d + md5: abb32c727da370c481a1c206f5159ce9 + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16796 + timestamp: 1740087984429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda + sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e + md5: 06d02030237f4d5b3d9a7e7d348fe3c6 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 459862 + timestamp: 1740240588123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda + build_number: 31 + sha256: f583661921456e798aba10972a8abbd9d33571c655c1f66eff450edc9cbefcf3 + md5: 452b98eafe050ecff932f0ec832dd03f + depends: + - libblas 3.9.0 31_h59b9bed_openblas + constrains: + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16790 + timestamp: 1740087997375 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda + sha256: cc5389ea254f111ef17a53df75e8e5209ef2ea6117e3f8aced88b5a8e51f11c4 + md5: 0a4d0252248ef9a0f88f2ba8b8a08e12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5919288 + timestamp: 1739825731827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda + sha256: 57b535a67f59c97302e2bbc60abcbc8d51ef0a4c7b1926049091d7da96da7b3a + md5: c5a4e2d9818fe6551dccd02243765527 + depends: + - python >=3.9 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 128565 + timestamp: 1737789576837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/src/max/magic.lock b/src/max/magic.lock new file mode 100644 index 0000000000..c7344b5c98 --- /dev/null +++ b/src/max/magic.lock @@ -0,0 +1,9001 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.8.61-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.8.57-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.8.57-h3f2d84a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.8.55-hbd13f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.8.57-hbd13f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.8.61-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.8.55-hbd13f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.8.61-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.8-h5d125a7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-transfer-0.1.9-py312h5bc9d60_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.0.rc1-hb8a341e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h89e7157_113.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py312_heeca0f5_113.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.9.0-py312h14ff09d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.2.0-cuda126py312h5a3d8a8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xgrammar-0.1.11-py312h6edf5ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.8.61-h579c4fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.8.57-h3ae8b8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.8.57-h3ae8b8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cuobjdump-12.8.55-h05609ea_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cupti-12.8.57-h5101a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-tools-12.8.61-h614329b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvdisasm-12.8.55-h5101a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.8.61-h614329b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.8-h5d125a7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.1.5-py312he9d48ea_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-transfer-0.1.9-py312he5cae2c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.0.rc1-h1ddd4b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.5.1-cpu_generic_hb04e7f6_13.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.5.1-cpu_generic_py312_h819a134_13.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.8-h8fb0607_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.9.0-py312h4a2a8a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/triton-3.2.0-cuda126py312h1ed5fa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xgrammar-0.1.11-py312hc94be92_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-transfer-0.1.9-py312hfba41e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_he9b55c7_13.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py312_h49ed405_13.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.8-h8391f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tiktoken-0.9.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xgrammar-0.1.11-py312hd6dbf26_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.6-pyhd8ed1ab_0.conda + sha256: a2a5579be9fb21f9397f51a4ba09599782c93e9117951a5105d8ee4b80d648c1 + md5: 5b7d3ceeb36e8e6783eae78acd4c18e1 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 19236 + timestamp: 1739175837817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.13-py312h178313f_0.conda + sha256: 985834edea972ddf6c35ab4185fb228440efb845a70a88182895f8f90df4a4c9 + md5: 0ea623ee1f29a7e1d703bc3b0ef82306 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + size: 915558 + timestamp: 1740482064204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.13-py312hcc812fe_0.conda + sha256: ca1fa0450decaca810db4b9f5ff1dd00c710fd89767c764a771b5d4ce7a152b0 + md5: 7e952a2d83ebfb371515c010acc110c7 + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + size: 904149 + timestamp: 1740481643315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.13-py312h998013c_0.conda + sha256: 84f8c35912bce8c9ee979454a685ec0497fbccd7da86351e8d774ae3e7456055 + md5: d575ea7d96ce2c9fed370d85d3ef464e + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + size: 885919 + timestamp: 1740482022806 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + size: 18074 + timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + sha256: f1455d2953e3eb6d71bc49881c8558d8e01888469dfd21061dd48afb6183e836 + md5: 848d25bfbadf020ee4d4ba90e5668252 + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.5 + constrains: + - trio >=0.26.1 + - uvloop >=0.21 + license: MIT + license_family: MIT + size: 115305 + timestamp: 1736174485476 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda + sha256: ebe5e33249f37f6bb481de99581ebdc92dbfcf1b6915609bcf3c9e78661d6352 + md5: 9c500858e88df50af3cc883d194de78a + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 108111 + timestamp: 1737509831651 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.1-hb7ec8d5_0.conda + sha256: e1e6c9267a4d9af30b1d28c11a9041b17b7840ff83ef08614145a2a4f444f5b4 + md5: 2630f030652970a5531e492f6b2a6dd3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 112658 + timestamp: 1737509863269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda + sha256: 335d822eead0a097ffd23677a288e1f18ea22f47a92d4f877419debb93af0e81 + md5: 9a063178f1af0a898526cc24ba7be486 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 157263 + timestamp: 1737207617838 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-hfd5ba81_6.conda + sha256: d8adfde05cee11057d99c3802e84b2300430a7c7c3c9936165d1d4b25ef59d91 + md5: 4e6771b45cb2b035c62d023dbf0dc000 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.11,<1.5.12.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 160933 + timestamp: 1737207637279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda + sha256: 15fbdedc56850f8be5be7a5bcaea1af09c97590e631c024ae089737fc932fc42 + md5: caafc32928a5f7f3f7ef67d287689144 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 115413 + timestamp: 1737558687616 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.9-h05b070f_1.conda + sha256: 9e7857fbc33eddc291fa09890ce468a92485d3e3e127bc00bbd1803e34121f84 + md5: e0a2869195f069db88b8932f5b00bee5 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 117875 + timestamp: 1737558720047 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda + sha256: c1930569713bd5231d48d885a5e3707ac917b428e8f08189d14064a2bb128adc + md5: 8a4e6fc8a3b285536202b5456a74a940 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 353222 + timestamp: 1737565463079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.9-hab3ce66_2.conda + sha256: c3884fb10e0fd9be5c13256cabcda1afa9d2fcf8878c67214d02fc344509857d + md5: 875968ebffe992b68faf2caebbf32f02 + depends: + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 283812 + timestamp: 1737565480034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda + sha256: 08d6b7d2ed17bfcc7deb903c7751278ee434abdb27e3be0dceb561f30f030c75 + md5: b775e9f46dfa94b228a81d8e8c6d8b1d + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3144364 + timestamp: 1737576036746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.489-h88461e4_0.conda + sha256: 88353e82b053763168cddbe2f88048defc1c97b3dad0966fbe8c4fa7aa592c7e + md5: e725d8fa77a6a5f38a78c5de914a5f40 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3015109 + timestamp: 1737575993030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + sha256: f334115c6b0c6c2cd0d28595365f205ec7eaa60bcc5ff91a75d7245f728be820 + md5: a38b801f2bcc12af80c2e02a9e4ce7d9 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 18816 + timestamp: 1733771192649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec + md5: 462cb166cd2e26a396f856510a3aff67 + arch: aarch64 + platform: linux + license: ISC + size: 158290 + timestamp: 1738299057652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.8.61-ha770c72_1.conda + sha256: 80a2ddb433b3d3b0abbf97febf5504cbda451e19f3a504936ef961209c647238 + md5: a5c66c2b4b7fb464129a1163a49c9e53 + depends: + - cuda-version >=12.8,<12.9.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 27215 + timestamp: 1738873838328 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.8.61-h579c4fd_1.conda + sha256: 78bfe492a98c2460960e2e9f7bef39326a889e2abb54debc9959ec7494822717 + md5: 04dbd57df8678150c7e5b37da647c702 + depends: + - cuda-version >=12.8,<12.9.0a0 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 27415 + timestamp: 1738873896497 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.8.57-h5888daf_1.conda + sha256: cc58a25d7ab38d8d27aa88b151dd55406cdfe5429b03419a13af8e9aca2f2596 + md5: cc1b22f4f3734a8b0e80aa874e9f1744 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.8.57 h3f2d84a_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22706 + timestamp: 1739215390850 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.8.57-h3ae8b8a_1.conda + sha256: 5790a30774eab55f84afe42ec9e6d81298b31ae3cf2584e245958bc742cfd280 + md5: 3d8375d2e0d1957db66cfe319c76adeb + depends: + - cuda-cudart_linux-aarch64 12.8.57 h3ae8b8a_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22831 + timestamp: 1739215503338 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.8.57-h3f2d84a_1.conda + sha256: a60faad361f3f21a387d8c684114258de63305703db13c76417b5cf0956205a6 + md5: dff7d2f9a0ee9ab03bfff88fff9621da + depends: + - cuda-version >=12.8,<12.9.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 192905 + timestamp: 1739215375478 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.8.57-h3ae8b8a_1.conda + sha256: 70caf7f62c2a645d9ef487fe2f41433145e11786e91fd87dfed6338babdefe04 + md5: aa86deee0e8c93f71fde92db26339407 + depends: + - cuda-version >=12.8,<12.9.0a0 + constrains: + - arm-variant * sbsa + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 207838 + timestamp: 1739215492480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.8.55-hbd13f7d_0.conda + sha256: 424bea1fdfca90acf5c8c255e4b648315e8a07a8065a234dd4b28108d7514d59 + md5: 5ab6c95d69311e911bd98d48118ce047 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvdisasm + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 232521 + timestamp: 1737670501800 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cuobjdump-12.8.55-h05609ea_0.conda + sha256: 1b17aae0d05f839d7a5e08e40edbca2666954db95ed38b85d4c4aca9e1e568ca + md5: dcf96c9ad817538ebdcb1430f4510328 + depends: + - cuda-nvdisasm + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 235857 + timestamp: 1737670525095 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.8.57-hbd13f7d_0.conda + sha256: ff8fb3a51c18a43e8de90df30094e0ae4bb4ae0f35a473aa2f8ab052c5318816 + md5: 3a98112d0341979bbb2e75e71b36a4c0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 1845047 + timestamp: 1737666283622 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cupti-12.8.57-h5101a13_0.conda + sha256: e0b0fe34fcb50c9c6e600bc5e29c7f65e5d09535eeeefae737819f71928c4813 + md5: 619e88e4871378089566f235461b4677 + depends: + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 1620833 + timestamp: 1737666390106 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.8.61-he02047a_1.conda + sha256: 2436f383674e29a788f17e8aa5fc9c86819e122725d2291eda63260f15100496 + md5: fb406ed72a4f4af7acfd591c6787b903 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-crt-tools 12.8.61 ha770c72_1 + - cuda-nvvm-tools 12.8.61 he02047a_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - gcc_impl_linux-64 >=6,<15.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 25714998 + timestamp: 1738873949175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-tools-12.8.61-h614329b_1.conda + sha256: a82b060291312d286b06ccd04f61023c08afe66014fe356b1c594285e61b0b7b + md5: 8c753c56765e2c8babc05cb5e4848c51 + depends: + - cuda-crt-tools 12.8.61 h579c4fd_1 + - cuda-nvvm-tools 12.8.61 h614329b_1 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - arm-variant * sbsa + - gcc_impl_linux-aarch64 >=6,<15.0a0 + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22320853 + timestamp: 1738874044293 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.8.55-hbd13f7d_0.conda + sha256: 53377e888305b28e5c249b423291de37478ea465b2e4ba0247584491999a1284 + md5: 74f716637584db374166bf8b04f57a13 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 5122708 + timestamp: 1737667356055 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvdisasm-12.8.55-h5101a13_0.conda + sha256: 292b078110ea97c19401a9fbdf359325d472a3b5c164c256846da82e6b3e3a9e + md5: 3829037f6474309e563bc86ea5344669 + depends: + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 5077857 + timestamp: 1737667422732 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.8.61-he02047a_1.conda + sha256: a604b228e8aa84c3739c1b285857bf2c206a3d0ed7798216f5f651a0ac257ae3 + md5: f82afee87477746249975726453c56bf + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 24622383 + timestamp: 1738873904778 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.8.61-h614329b_1.conda + sha256: 9159c3b04c2eb7ed721e7a7ef6d7dec5b5bb58d5874d220299745034f10f5a28 + md5: 1f56d00ef41873791b9c6ab4642964b3 + depends: + - cuda-version >=12.8,<12.9.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - arm-variant * sbsa + arch: aarch64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 23961474 + timestamp: 1738873988055 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.8-h5d125a7_3.conda + sha256: 6f93ceb66267e69728d83cf98673221f6b1f95a3514b3a97777cfd0ef8e24f3f + md5: 794eaca58880616a508dd6f6eb389266 + constrains: + - cudatoolkit 12.8|12.8.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 21086 + timestamp: 1737663758355 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: 3e087f072ce03c43a9b60522f5d0ca2f + depends: + - aiohttp + - dill >=0.3.0,<0.3.8 + - fsspec >=2021.11.1 + - huggingface_hub >=0.14.0,<1.0.0 + - importlib-metadata + - multiprocess + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=8.0.0 + - python >=3.8.0 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.19.0 + - tqdm >=4.62.1 + license: Apache-2.0 + license_family: Apache + size: 347303 + timestamp: 1691593908658 +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + sha256: d614bcff10696f1efc714df07651b50bf3808401fcc03814309ecec242cc8870 + md5: 0cef44b1754ae4d6924ac0eef6b9fdbe + depends: + - python >=3.9 + - wrapt <2,>=1.10 + license: MIT + license_family: MIT + size: 14382 + timestamp: 1737987072859 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 5e4f3466526c52bc9af2d2353a1460bd + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 87553 + timestamp: 1690101185422 +- conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + sha256: 3ec40ccf63f2450c5e6c7dd579e42fc2e97caf0d8cd4ba24aa434e6fc264eda0 + md5: 5fbd60d61d21b4bd2f9d7a48fe100418 + depends: + - python >=3.9,<4.0.0 + - sniffio + constrains: + - aioquic >=1.0.0 + - wmi >=1.5.1 + - httpx >=0.26.0 + - trio >=0.23 + - cryptography >=43 + - httpcore >=1.0.0 + - idna >=3.7 + - h2 >=4.1.0 + license: ISC + license_family: OTHER + size: 172172 + timestamp: 1733256829961 +- conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + sha256: b91a19eb78edfc2dbb36de9a67f74ee2416f1b5273dd7327abe53f2dbf864736 + md5: da16dd3b0b71339060cd44cb7110ddf9 + depends: + - dnspython >=2.0.0 + - idna >=2.0.0 + - python >=3.9 + license: Unlicense + size: 44401 + timestamp: 1733300827551 +- conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + sha256: e0d0fdf587aa0ed0ff08b2bce3ab355f46687b87b0775bfba01cc80a859ee6a2 + md5: 0794f8807ff2c6f020422cacb1bd7bfa + depends: + - email-validator >=2.2.0,<2.2.1.0a0 + license: Unlicense + size: 6552 + timestamp: 1733300828176 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e + depends: + - python >=3.9 + license: MIT and PSF-2.0 + size: 20486 + timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.8-pyh29332c3_0.conda + sha256: 5e1e3d5cf306d9b3b5fe0d45a9e8440e8770ba7e4a5fac1ac847ca693b0dc064 + md5: 753382711adab47269f0bfe994906bc4 + depends: + - python >=3.9 + - starlette >=0.40.0,<0.46.0 + - typing_extensions >=4.8.0 + - pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - email_validator >=2.0.0 + - fastapi-cli >=0.0.5 + - httpx >=0.23.0 + - jinja2 >=3.1.5 + - python-multipart >=0.0.18 + - uvicorn-standard >=0.12.0 + - python + license: MIT + license_family: MIT + size: 77940 + timestamp: 1738326226051 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + sha256: 300683731013b7221922339cd40430bb3c2ddeeb658fd7e37f5099ffe64e4db0 + md5: d960e0ea9e1c561aa928f6c4439f04c7 + depends: + - python >=3.9 + - rich-toolkit >=0.11.1 + - typer >=0.12.3 + - uvicorn-standard >=0.15.0 + license: MIT + license_family: MIT + size: 15546 + timestamp: 1734302408607 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h178313f_1.conda + sha256: 501e20626798b6d7f130f4db0fb02c0385d8f4c11ca525925602a4208afb343f + md5: fb986e1c089021979dc79606af78ef8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 60939 + timestamp: 1737645356438 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hcc812fe_1.conda + sha256: 84895c5e207e0cb2044f3607fb36b82eb8cb45f0a009d03dc04c777ed975757d + md5: 9090bf5c43e8011fb2e9a82a1db20cc3 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 60472 + timestamp: 1737645511278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h998013c_1.conda + sha256: d503ac8c050abdbd129253973f23be34944978d510de78ef5a3e6aa1e3d9552d + md5: 5eb3715c7e3fa9b533361375bfefe6ee + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 57256 + timestamp: 1737645503377 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda + sha256: 7433b8469074985b651693778ec6f03d2a23fad9919a515e3b8545996b5e721a + md5: d9ea16b71920b03beafc17fcca16df90 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 138186 + timestamp: 1738501352608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/noarch/gguf-0.14.0-pyh267e887_0.conda + sha256: 223a157e2ce9e1195eced1bd42041b8219cc61c0a135f428256cf2753cac8142 + md5: 3fb0305a9a6f1d7607db045fdc42f705 + depends: + - python >=3.8 + - numpy >=1.17 + - tqdm >=4.27 + - pyyaml >=5.1 + - sentencepiece >=0.1.98,<=0.2.0 + - python + license: MIT + license_family: MIT + size: 74687 + timestamp: 1737040120169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda + sha256: a5e341cbf797c65d2477b27d99091393edbaa5178c7d69b7463bb105b0488e69 + md5: 7cbfb3a8bb1b78a7f5518654ac6725ad + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 417323 + timestamp: 1718980707330 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.1.5-py312he9d48ea_3.conda + sha256: b92ffcb02ee027db2b3b8b1256ecf9e04afd4c1680467574889419c9ed42c089 + md5: 9defe233dc6909ac868a1ca50b2ca84d + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 201489 + timestamp: 1733462747377 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.68.0-pyhd8ed1ab_0.conda + sha256: efaca61923e45849a3d763280305cb3a00a769546ce5df2b1bbe24db40aa23af + md5: 3b8e056a42f71c9398857ecf0b8fbcb6 + depends: + - protobuf >=3.20.2,<6.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 67755 + timestamp: 1740136133858 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + sha256: 622516185a7c740d5c7f27016d0c15b45782c1501e5611deec63fd70344ce7c8 + md5: 7ee49e89531c0dcbba9466f6d115d585 + depends: + - python >=3.9 + - typing_extensions + license: MIT + license_family: MIT + size: 51846 + timestamp: 1733327599467 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hf-transfer-0.1.9-py312h5bc9d60_1.conda + sha256: 21acb87a6403f88b2dbdefb79a537bc8fe871b86c60f9b690206eaf7ad1f009c + md5: 3639aa7b1297e680220f52c2b8a21200 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - openssl >=3.4.1,<4.0a0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1339225 + timestamp: 1739803760467 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-transfer-0.1.9-py312he5cae2c_1.conda + sha256: 5554caf02aa37f3ef9b35d687f515385a50fd505987f5c4b84433d5c50d6a3b5 + md5: fbb03e07e1aefc42b856f0a06dd999f6 + depends: + - python + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + - openssl >=3.4.1,<4.0a0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1366847 + timestamp: 1739803796587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-transfer-0.1.9-py312hfba41e8_1.conda + sha256: 15b1589c703c6a1677008e422175f540f3da35a9a63c588540a219042c697ea4 + md5: baa81a0f9e0470d67728651af77dc1c1 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - openssl >=3.4.1,<4.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 1233816 + timestamp: 1739803893697 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + sha256: c84d012a245171f3ed666a8bf9319580c269b7843ffa79f26468842da3abd5df + md5: 2ca8e6dbc86525c8b95e3c0ffa26442e + depends: + - python >=3.8 + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=3.0,<5.0 + - certifi + license: BSD-3-Clause + license_family: BSD + size: 48959 + timestamp: 1731707562362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda + sha256: 621e7e050b888e5239d33e37ea72d6419f8367e5babcad38b755586f20264796 + md5: 8b1160b32557290b64d5be68db3d996d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 101872 + timestamp: 1732707756745 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda + sha256: 0bd1f30224af142711d11033a7469ae402a1147143f399f7341bbc1d8178c722 + md5: 5e70a6de59352f9a52e9caa7f3447390 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 101255 + timestamp: 1732707891645 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + sha256: 5e93cda79e32e8c0039e05ea1939e688da336187dab025f699b42ef529e848be + md5: e1747a8e8d2aca5499aaea9993bf31ff + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 85623 + timestamp: 1732707871414 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.29.1-pyhd8ed1ab_0.conda + sha256: f75ca9436fe11d0def6e575d29e0614033c45c90f37895a3b2bb3536612b251c + md5: 0bbbf72b600a1df32666a084769bf240 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + size: 287974 + timestamp: 1740068383431 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 + md5: 315607a3030ad5d5227e76e0733798ff + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 28623 + timestamp: 1733223207185 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda + sha256: 47cf6a4780dc41caa9bc95f020eed485b07010c9ccc85e9ef44b538fedb5341d + md5: b87b1abd2542cf65a00ad2e2461a3083 + depends: + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 287007 + timestamp: 1739161069194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda + sha256: 016832a70b0aa97e1c4e47e23c00b0c34def679de25146736df353199f684f0d + md5: 80c9ad5e05e91bb6c0967af3880c9742 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 699058 + timestamp: 1740155620594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hfa2a6e7_0_cpu.conda + sha256: 7b1f61045b37266989023a007d6331875062bb658068a6e6ab49720495ca3543 + md5: 11b712ed1316c98592f6bae7ccfaa86c + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 8967810 + timestamp: 1739768880886 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-19.0.1-h36213f4_0_cpu.conda + sha256: 3f141e56555676b4a9fd885a0a7452daa2530eb65cfbba1271f7a07457a82003 + md5: cfeb98942a3ef36c0bb2b09b084349da + depends: + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 8215209 + timestamp: 1739770301694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.1-h0945df6_0_cpu.conda + sha256: e34199bea635b1bf9f3819205b291f714ddd47db1bf6e6d10a4eb61da7330214 + md5: 21bcb04df4b1a99721199c5aa6273f53 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.35.0,<2.36.0a0 + - libgoogle-cloud-storage >=2.35.0,<2.36.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 5571369 + timestamp: 1739767084108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_0_cpu.conda + sha256: 9a3c38a8f1516fe5b7801d0407ff704efd53955ebd63f7fbc439ec3b563d19cc + md5: 0d63e2dea06c44c9d2c8be3e7e38eea9 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 638054 + timestamp: 1739768924910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-19.0.1-h3b568fd_0_cpu.conda + sha256: 3260e26ca9e1146befeb9587ba80610f9d9591365c82f7cd8756f14a9a8e58c2 + md5: 7b270af126ffdec0153d8599370f0430 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 602400 + timestamp: 1739770383854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.1-hf07054f_0_cpu.conda + sha256: b15f5fab53d941917143bb1cf22c5a0eacffb8ff2a010ee2e909afab3821d5f9 + md5: 9213d80ffba1921b86bfdf5fdd2c10c4 + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 500147 + timestamp: 1739767179329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_0_cpu.conda + sha256: f756208d787db50b6be68210cb9eec3644b8291a8a353bb2071ea4451bfc1412 + md5: ec52b3b990be399f4267a9acabb73070 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libparquet 19.0.1 h081d1f1_0_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 604500 + timestamp: 1739769034226 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-19.0.1-h3b568fd_0_cpu.conda + sha256: 76327753ed311ae1d1ef3f8f7067888e01d3c69e5198a9108052d74e2f91d03a + md5: 8a025a60dfcfa3d6cf100395f64de8ba + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libparquet 19.0.1 hfc78867_0_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 581121 + timestamp: 1739770488033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.1-hf07054f_0_cpu.conda + sha256: 21fcb9a09e5872b4f1d483d8d950a1804ccb6804881881ca6fe6c5968a5e4dbc + md5: 0695382a64b393765b4bc9e1ee99250c + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libparquet 19.0.1 h636d7b7_0_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 501234 + timestamp: 1739768239766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_0_cpu.conda + sha256: e0b3ed06ce74c6a083dab59fb3059fdbc40fc71ff94ce470ca0a7c7ffe8d0317 + md5: 792e2359bb93513324326cbe3ee4ebdd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libarrow-acero 19.0.1 hcb10f89_0_cpu + - libarrow-dataset 19.0.1 hcb10f89_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 523313 + timestamp: 1739769085090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-19.0.1-h1e9d426_0_cpu.conda + sha256: c1085eb113a80691e3d76400c91b15dc8c0462d533f8c4ca4c33d5e9fe9cffef + md5: 1e34ad733a8c404ac0f652a942192636 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h36213f4_0_cpu + - libarrow-acero 19.0.1 h3b568fd_0_cpu + - libarrow-dataset 19.0.1 h3b568fd_0_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 516114 + timestamp: 1739770543593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-19.0.1-h4239455_0_cpu.conda + sha256: 0b5c0839102b396f8b0ba376189562a727ebbed3c6bdab74aaf56227ee45cb73 + md5: 2893dd55f7804b9106126c2f00712ec2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 19.0.1 h0945df6_0_cpu + - libarrow-acero 19.0.1 hf07054f_0_cpu + - libarrow-dataset 19.0.1 hf07054f_0_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 450361 + timestamp: 1739768396169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda + build_number: 31 + sha256: 862289f2cfb84bb6001d0e3569e908b8c42d66b881bd5b03f730a3924628b978 + md5: bdf4a57254e8248222cb631db4393ff1 + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - liblapack =3.9.0=31*_mkl + - liblapacke =3.9.0=31*_mkl + - blas =2.131=mkl + - libcblas =3.9.0=31*_mkl + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 17259 + timestamp: 1740087718283 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda + build_number: 31 + sha256: 67c9c81dd0444ecc712124034d9f74186ca82fd770b3df46b1a68564461c6a1a + md5: 48bd5bf15ccf3e409840be9caafc0ad5 + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - mkl <2025 + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16915 + timestamp: 1740087911042 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda + build_number: 31 + sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f + md5: 39b053da5e7035c6592102280aa7612a + depends: + - libopenblas >=0.3.29,<0.3.30.0a0 + - libopenblas >=0.3.29,<1.0a0 + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + - mkl <2025 + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17123 + timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda + build_number: 31 + sha256: 2ee3ab2b6eeb59f2d3c6f933fa0db28f1b56f0bc543ed2c0f6ec04060e4b6ec0 + md5: 2a06a6c16b45bd3d10002927ca204b67 + depends: + - libblas 3.9.0 31_hfdb39a5_mkl + constrains: + - liblapack =3.9.0=31*_mkl + - liblapacke =3.9.0=31*_mkl + - blas =2.131=mkl + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 16724 + timestamp: 1740087727554 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda + build_number: 31 + sha256: f0457a1d2982f0a28bfbadaa02621677c324e88f7c8198c24fb3e3214c468dba + md5: 6b81dbae56a519f1ec2f25e0ee2f4334 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - liblapack =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16824 + timestamp: 1740087917500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda + build_number: 31 + sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 + md5: 7353c2bf0e90834cb70545671996d871 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - blas =2.131=openblas + - liblapack =3.9.0=31*_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17032 + timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.12.1-h6702fde_0.conda + sha256: a00458a5163b9552897cdac08b273deb1b3add09e05599dfbacf0606c3b1f41f + md5: 14c340cb70867cf7953d2632f89270b5 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + size: 444118 + timestamp: 1739512317570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.12.1-h73640d1_0.conda + sha256: 0bddd1791eb0602c8c6aa465802e9d4526d3ec1251d900b209e767753565d5df + md5: 105f0cceef753644912f42e11c1ae9cf + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + size: 387893 + timestamp: 1739512564746 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda + sha256: 41568066beefe7b319ff27d85952242e5b77fb753d705b8716041959e17c35c2 + md5: 966084fccf3ad62a3160666cda869f28 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 51513 + timestamp: 1739260449772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda + sha256: a57f7f9ba2a12f56eafdcd25b6d75f7be10b8fc1a802a58b76a77ca8c66f4503 + md5: 6b4268a60b10f29257b51b9b67ff8d76 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_2 + - libgomp 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535507 + timestamp: 1740241069780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda + sha256: 9647f75cddc18b07eebe6e1f21500eed50a6af2c43c84e831b4c7a597e10d226 + md5: 692c2bb75f32cfafb6799cf6d1c5d0e0 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53622 + timestamp: 1740241074834 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda + sha256: 996d3c0505301901a7ab23b5e7daad21635d1c065240bb0f4faf7e4f75d7f49d + md5: d8b9d9dc0c8cd97d375b48e55947ba70 + depends: + - libgfortran5 14.2.0 hb6113d0_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53611 + timestamp: 1740241100147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda + sha256: 7b9e1d3666a00e5a52e5d43c003bd1c73ab472804be513c070aaedca9c4c2a9a + md5: cd754566661513808ef2408c4ab99a2f + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1100765 + timestamp: 1740241083241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda + sha256: 4e303711fb7413bf98995beac58e731073099d7a669a3b81e49330ca8da05174 + md5: b11c09d9463daf4cae492d29806b1889 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 462783 + timestamp: 1740241005079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.35.0-h2b5623c_0.conda + sha256: d747d14c69da512d8993a995dc2df90e857778b0a8542f12fb751544128af685 + md5: 1040ab07d7af9f23cf2466ffe4e58db1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1258035 + timestamp: 1738662406183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.35.0-hccf9d24_0.conda + sha256: b5d323807ea699e76d9ebb829e48100446663978a1aac9adf538249864f73f97 + md5: f22720e07abb547ebce78a3aa7b97d69 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1258015 + timestamp: 1738662706891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.35.0-hdbe95d5_0.conda + sha256: 9bee9773540956d8a2ca0b317f73d94916200a4bfd8151319bf7fdcbf704d692 + md5: b1ea94282f38b142f8bc842ef7bcc18c + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.35.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 877733 + timestamp: 1738662822079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.35.0-h0121fbd_0.conda + sha256: cb1ef70e55d2c1defbfd8413dbe85b5550782470dda4f8d393f28d41b6d9b007 + md5: 34e2243e0428aac6b3e903ef99b6d57d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 h2b5623c_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 785777 + timestamp: 1738662565066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.35.0-hb9b2b65_0.conda + sha256: cf316f07d5dcc3b6669bf6d93203d435133c99d075a9f92dfa28eff1bd4def74 + md5: ae6ab5b7af1409d0eafd2b77c5d5528a + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.35.0 hccf9d24_0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 739471 + timestamp: 1738662862568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.35.0-h7081f7f_0.conda + sha256: 52dc2d18264543b564b59fb80338fbd9cb2296f011d75f41adcd85041795201c + md5: 958beca4e16f59360e30c48ff0351e04 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.35.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 529210 + timestamp: 1738664024959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda + sha256: 3db14977036fe1f511a6dbecacbeff3fdb58482c5c0cf87a2ea3232f5a540836 + md5: 81541d85a45fbf4d0a29346176f1f21c + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + size: 718600 + timestamp: 1740130562607 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda + build_number: 31 + sha256: a2d20845d916ac8fba09376cd791136a9b4547afb2131bc315178adfc87bb4ca + md5: 10d012ddd7cc1c7ff9093d4974a34e53 + depends: + - libblas 3.9.0 31_hfdb39a5_mkl + constrains: + - liblapacke =3.9.0=31*_mkl + - blas =2.131=mkl + - libcblas =3.9.0=31*_mkl + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 16760 + timestamp: 1740087736615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda + build_number: 31 + sha256: 27613828ff6fb258b2e58802617df549f00089660ea8ab6c55c68f042c570162 + md5: 41dbff5eb805a75c120a7b7a1c744dc2 + depends: + - libblas 3.9.0 31_h1a9f1db_openblas + constrains: + - blas =2.131=openblas + - libcblas =3.9.0=31*_openblas + - liblapacke =3.9.0=31*_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16845 + timestamp: 1740087923843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda + build_number: 31 + sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 + md5: ff57a55a2cbce171ef5707fb463caf19 + depends: + - libblas 3.9.0 31_h10e41b3_openblas + constrains: + - liblapacke =3.9.0=31*_openblas + - libcblas =3.9.0=31*_openblas + - blas =2.131=openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 17033 + timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.0.rc1-hb8a341e_0.conda + sha256: efd9d6646cff6e93a81a9b671fa7af683f843ad72d1a46e258720d2a639f1034 + md5: cf83972da6924c67d8fbffa222896b95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.5,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 42975121 + timestamp: 1738551437179 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.0.rc1-h1ddd4b9_0.conda + sha256: 7a06b4f6656f26e0b5ff124701973fa8602f5062f211d3975f40d5239d3eb4d9 + md5: a7649551ec41c69f5361a6c596ed1ffd + depends: + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.5,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 42134035 + timestamp: 1738491036719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda + sha256: 96413664f0fade54a4931940d18749cfc8e6308349dbb0cb83adb2394ca1f730 + md5: b88244e0a115cc34f7fbca9b11248e76 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124197 + timestamp: 1738528201520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda + sha256: 3a2ccf4c9098cd18a636e9b7fff947fdeb4962bcfb75c9d6fd80b8c50caf6a3c + md5: a99e2bfcb1ad6362544c71281eb617e9 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4801657 + timestamp: 1739825308974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda + sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 + md5: 0cd1148c68f09027ee0b0f0179f77c30 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.29,<0.3.30.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4168442 + timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda + sha256: 4ea235e08676f16b0d3c3380befe1478c0fa0141512ee709b011005c55c9619f + md5: 1f5a5d66e77a39dc5bd639ec953705cf + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 ha770c72_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 801927 + timestamp: 1735643375271 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.18.0-h60b47f9_1.conda + sha256: 160c493cd0f897955b0b6035b51c6d7255ffbaed3c8a12d43e8e8a719d405aba + md5: afe3c8c53f4b6d27d553c230d4b34038 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 h8af1aa0_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 800896 + timestamp: 1735643533825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda + sha256: aa1f7dea79ea8513ff77339ba7c6e9cf10dfa537143e7718b1cfb3af52b649f2 + md5: 4fb055f57404920a43b147031471e03b + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 320359 + timestamp: 1735643346175 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.18.0-h8af1aa0_1.conda + sha256: 981c0b29a0789597fa8ed147b02df2d2ad0c7f863d87df74770c40cee1800228 + md5: 282193b19a19e3b5d75d18ef82713ef0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 319401 + timestamp: 1735643509251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_0_cpu.conda + sha256: e9c4a07e79886963bfcd05894a15b5d4c7137c1122273de68845315c35d6505d + md5: 8b58c378d65b213c001f04a174a2a70e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1 hfa2a6e7_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1244749 + timestamp: 1739769006551 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-19.0.1-hfc78867_0_cpu.conda + sha256: 4822fcb00e97644ce74f313cd2f44fe85085c64b1481ac7e1a22ee7dd2ef772a + md5: d19e95e75e9005e712ec81409868b880 + depends: + - libarrow 19.0.1 h36213f4_0_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1154758 + timestamp: 1739770461892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.1-h636d7b7_0_cpu.conda + sha256: 54e4a18493d63b7fbd5cf39fadabe665bcf462121a7bc2f394f510b0bcf22031 + md5: 0cce19e6981849babe6c73797abbfa4e + depends: + - __osx >=11.0 + - libarrow 19.0.1 h0945df6_0_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 895659 + timestamp: 1739768176454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda + sha256: 3861a65106a5f876eff3fc19042c3edb528216114b9f8e64b37aebf003deda11 + md5: c4b1ba0d7cef5002759d2f156722feee + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + size: 291536 + timestamp: 1739957375872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h6164ad9_10.conda + sha256: 57074803772f65d4075b7d6dc17ff5aa40ec3a30109fa4225ca16911504c4a8b + md5: a7a192edc9cfba26a27df3283203e6a1 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 800865 + timestamp: 1735627982895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_1.conda + sha256: 920fb3b7d3b873babf79a3e392cc82d43b8bd02a573ccaff34219efb5cf7b51e + md5: 150d64241fa27d9d35a7f421ca968a6c + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 915118 + timestamp: 1739953101699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda + sha256: c30a74bc996013907f6d9f344da007c26d98ef9a0831151cd50aece3125c45d5 + md5: eadee2cda99697e29411c1013c187b92 + depends: + - libgcc 14.2.0 he277a41_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3810779 + timestamp: 1740241094774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda + sha256: 0107886ead6f255956d8e520f8dff260f9ab3d0d51512f18c52710c406e4b2df + md5: c934c1fddad582fcc385b608eb06a70c + depends: + - libstdcxx 14.2.0 h3f4de04_2 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53715 + timestamp: 1740241126343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h89e7157_113.conda + sha256: 70e24c9b98d24006ce3c2b27503cb2c122f78cc6f59e980db774020203835aca + md5: 0dfe6af4a27ec2372271e3703cc52e48 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas * *mkl + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl >=2024.2.2,<2025.0a0 + - sleef >=3.8,<4.0a0 + constrains: + - pytorch-gpu ==99999999 + - pytorch-cpu ==2.5.1 + - pytorch 2.5.1 cpu_mkl_*_113 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 53568815 + timestamp: 1739239230425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.5.1-cpu_generic_hb04e7f6_13.conda + sha256: 62f94d17e75cdf2f48f4a89175759449aaad05bf2a356836430c82c65a7c5f44 + md5: ad17071bfd97d24a7a83fd044ae6282c + depends: + - _openmp_mutex >=4.5 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - sleef >=3.8,<4.0a0 + constrains: + - pytorch-cpu ==2.5.1 + - pytorch 2.5.1 cpu_generic_*_13 + - openblas * openmp_* + - pytorch-gpu ==99999999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 37722765 + timestamp: 1739239246382 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_he9b55c7_13.conda + sha256: 320cca1b7dbe0506221e0fb2911838fd112d4440a5298f033b56c1a93f0cf6fa + md5: e24814d808f0cd0e130dc141af1a8efd + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=18.1.8 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - sleef >=3.8,<4.0a0 + constrains: + - pytorch-gpu ==99999999 + - pytorch 2.5.1 cpu_generic_*_13 + - pytorch-cpu ==2.5.1 + - openblas * openmp_* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 28302663 + timestamp: 1739247703257 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda + sha256: 8e41563ee963bf8ded06da45f4e70bf42f913cb3c2e79364eb3218deffa3cd74 + md5: aeccfff2806ae38430638ffbb4be9610 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 82745 + timestamp: 1737244366901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.10.0-ha346350_0.conda + sha256: 9c333e07b76ae1ea2c882db764be52dc82f632be66d993a50b35ca9c5475074a + md5: c5166bcfb8348e8fc31ee16ec3981a5e + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 82679 + timestamp: 1737329054400 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 83628 + timestamp: 1737244450097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + sha256: b4a8890023902aef9f1f33e3e35603ad9c2f16c21fdb58e968fa6c1bd3e94c0b + md5: 771ee65e13bc599b0b62af5359d80169 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 891272 + timestamp: 1737016632446 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.50.0-h86ecc28_0.conda + sha256: 67914c7f171d343059144d804c2f17fcd621a94e45f179a0fd843b8c1618823e + md5: 915db044076cbbdffb425170deb4ce38 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 621056 + timestamp: 1737016626950 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + sha256: d13fb49d4c8262bf2c44ffb2c77bb2b5d0f85fc6de76bdb75208efeccb29fce6 + md5: 20717343fb30798ab7c23c2e92b748c1 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 418890 + timestamp: 1737016751326 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda + sha256: bb075df08b04b1b47e75a250f2ebbb2401c3367057d64b8d44ef1ef3f44480e1 + md5: a159a92f890f862408c951c08f13415f + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 733707 + timestamp: 1739953178456 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.6-hce475f1_0.conda + sha256: 9ce429417545f7616ed528061305b3a1fc3732ff3bb24bd91cba260550879693 + md5: 8654012bd68aa48b94eee6c9faab85b6 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 582490 + timestamp: 1739953065675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 + md5: 9915f85a72472011550550623cce2d53 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 3190529 + timestamp: 1736986301022 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 148824 + timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda + sha256: 1d500158262f30b9c23e37d1c861fe76e127a3926d69b3b38c25d20d3faa6f9f + md5: bc8607ab678073a0441808a31465f4fb + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 25079 + timestamp: 1733220639175 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda + sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 + md5: d88728b468c85902512a0f9b99251035 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 252108573 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 1e46a465f1d8e75afa9822717e6c6ee75965c078d0cd7b217c4f8622847e9fb0 + md5: 7257078fedac4bbfb961c30a84e2c387 + depends: + - max-python ==25.2.0.dev2025022718 release + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 10365 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 + md5: bfd2e752d0fc9516b78a17169ce9cc78 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 126004454 + timestamp: 1740680207793 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 + md5: 1459379c79dda834673426504d52b319 + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=19.1.2 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + size: 124718448 + timestamp: 1730231808335 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda + sha256: b5b674f496ed28c0b2d08533c6f11eaf1840bf7d9c830655f51514f2f9d9a9c8 + md5: d3758cd24507dc1bda3483ce051d48ac + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: aarch64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 132799 + timestamp: 1725629168783 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda + sha256: abb35c37de2ec6c9ee89995142b1cfea9e6547202ba5578e5307834eca6d436f + md5: 65b21e8d5f0ec6a2f7e87630caed3318 + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + size: 1841314 + timestamp: 1725746723157 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + sha256: bb612a921fafda6375a2204ffebd8811db8dd3b8f25ac9886cc9bcbff7e3664e + md5: 5a64b9f44790d9a187a85366dd0ffa8d + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 335666 + timestamp: 1695459025249 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + sha256: c53362cdf346f314e111faddc53061e3fd2ece0ba68ca303f5dd109976df158f + md5: 173a1692d2b3ddc265dc6afd21a869b3 + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 336110 + timestamp: 1695459137796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 + md5: 910ef2223c71902175418d9163152788 + depends: + - dill >=0.3.6 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 335147 + timestamp: 1695459275360 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda + sha256: ce4bcced4f8eea71b7cac8bc3daac097abf7a5792f278cd811dedada199500c1 + md5: e46f7ac4917215b49df2ea09a694a3fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 122743 + timestamp: 1723652407663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.11.3-h0a1ffab_1.conda + sha256: c90b1f11fc337d90a9e4c5aeeacac1418c5ba6a195097086566d38bb2ecf0f24 + md5: f2bd10ff23ab5c87327439c4499b3f3e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 122755 + timestamp: 1723652622631 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 123250 + timestamp: 1723652704997 +- conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b + md5: 9a66894dfd07c4510beb6b3f9672ccc0 + constrains: + - mkl <0.a0 + license: BSD-3-Clause + license_family: BSD + size: 3843 + timestamp: 1582593857545 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/noarch/nvidia-ml-py-12.570.86-pyhd8ed1ab_0.conda + sha256: 6fd70c3d5b509ef1c30cb13df877f14b04bb0e53da032950921b31d95aa5971d + md5: bc4b4177052f661da6d56838dfe57a52 + depends: + - python >=3.9 + constrains: + - nvidia-ml ==9999999999 + - pynvml ~=12.0 + license: BSD-3-Clause + license_family: BSD + size: 43543 + timestamp: 1737778765664 +- conda: https://conda.anaconda.org/conda-forge/noarch/nvitop-1.4.2-pyh707e725_0.conda + sha256: 002c17241c698ba07b0d610da0590e8c8c1e38aef13cf7bd03112b2a9ff5350d + md5: eceb58298054d6f2b7c8f8c53642c2d8 + depends: + - __unix + - nvidia-ml-py >=11.450.51,<12.571.0a0 + - psutil >=5.6.6 + - python >=3.9 + license: GPL-3.0-only + license_family: GPL + size: 143819 + timestamp: 1737914833293 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d + md5: 04231368e4af50d11184b50e14250993 + depends: + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 377796 + timestamp: 1733816683252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda + sha256: d80b52b56b2206053968270069616868cbeb289ef855cf1584b1bb0fef61b37c + md5: 09036190605c57eaecf01218e0e9542d + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3476570 + timestamp: 1739303256089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.30.0-pyhd8ed1ab_0.conda + sha256: ab5b873cc2542e305236e0439d323bf880d1b49eafe7a8a04d6863a5a409059d + md5: 65caf9f399f67c1c16efc0fb76f3576c + depends: + - deprecated >=1.2.6 + - importlib-metadata <=8.5.0,>=6.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 44649 + timestamp: 1738813183426 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.30.0-pyhd8ed1ab_0.conda + sha256: 12294c0e75460bf773500d0b97d58701f6141a26ebc7507b7aefd045c3943801 + md5: 49cf930ab95d2abaabb17f0d40899628 + depends: + - backoff >=1.10.0,<3.0.0 + - opentelemetry-proto 1.30.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 19155 + timestamp: 1738757443981 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.30.0-pyhd8ed1ab_0.conda + sha256: 4bdb101663f63cd9b9c5560b40cc4441fd766885a13a130c9a0b60addc493f7d + md5: 19cd3caf8abaabe7210cb46dbde1932b + depends: + - deprecated >=1.2.6 + - googleapis-common-protos ~=1.52 + - opentelemetry-api ~=1.15 + - opentelemetry-exporter-otlp-proto-common 1.30.0 + - opentelemetry-proto 1.30.0 + - opentelemetry-sdk >=1.30.0,<1.31.dev0 + - python >=3.9 + - requests ~=2.7 + license: Apache-2.0 + license_family: APACHE + size: 17129 + timestamp: 1738881064907 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-0.51b0-pyh29332c3_0.conda + sha256: 1b7420798c2e8589ea9c03a0b9e1db64a79dfbdf6d12937ad69fd70f9b2a6ec7 + md5: cbfa34f2b05a9f916b4e255416103082 + depends: + - python >=3.9 + - opentelemetry-api >=1.12,<2.dev0 + - opentelemetry-sdk >=1.30.0,<1.31.dev0 + - prometheus_client >=0.5.0,<1.0.0 + - python + license: Apache-2.0 + license_family: APACHE + size: 22659 + timestamp: 1740444975350 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.30.0-pyhd8ed1ab_0.conda + sha256: a7dfb1566daca6bd7aea78ccc69257324336fa945199081c9a9d378d1b59737b + md5: 6b2133dbe9127cd09d3c20061c8f4faa + depends: + - protobuf <6.0,>=5.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 37366 + timestamp: 1738753488553 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.30.0-pyhd8ed1ab_0.conda + sha256: 287fac5c7a0a0a565932b7a43b733036bbc08e2b11cd93fb64f29ededb89e9c6 + md5: 3667728a1b18fb9a32aef23036934d9f + depends: + - opentelemetry-api 1.30.0 + - opentelemetry-semantic-conventions 0.51b0 + - python >=3.9 + - typing-extensions >=3.7.4 + - typing_extensions >=3.7.4 + license: Apache-2.0 + license_family: APACHE + size: 77853 + timestamp: 1738855492720 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.51b0-pyh3cfb1c2_0.conda + sha256: 2618877c066a6608ea57a05d260ddd805d0f59b95076f63d816df139f648f25a + md5: ff41e8547f2e7e0d0affc6c6e6e0e87f + depends: + - deprecated >=1.2.6 + - opentelemetry-api 1.30.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 91903 + timestamp: 1738850427906 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 + md5: d3894405f05b2c0f351d5de3ae26fa9c + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 42749785 + timestamp: 1735929845390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + sha256: 7559556ffc44bda777f85c2e5acd6b5756fa5822c0271b329b7b9a3c6bb20349 + md5: 77e0ec0a6fc847d317f204aa15b59f6b + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 41362848 + timestamp: 1735932311857 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee + md5: 94d6ba8cd468668a9fb04193b0f4b36e + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + size: 42852329 + timestamp: 1735930118976 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + sha256: 122433fc5318816b8c69283aaf267c73d87aa2d09ce39f64c9805c9a3b264819 + md5: e9dcbce5f45f9ee500e728ae58b605b6 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 23595 + timestamp: 1733222855563 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus-async-22.2.0-pyh29332c3_0.conda + sha256: 28262575a4b0421a50983be5e898205b7315b50d3e72518fe44b2b9c368026d8 + md5: e86915350744e5a8de993f7474ca98ce + depends: + - python >=3.9 + - prometheus_client >=0.8.0 + - typing_extensions >=3.10.0 + - wrapt + - python + license: Apache-2.0 + license_family: APACHE + size: 24093 + timestamp: 1737857634308 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab + md5: 3e01e386307acc60b2f89af0b2e161aa + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 49002 + timestamp: 1733327434163 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h178313f_1.conda + sha256: 6d5ff6490c53e14591b70924711fe7bd70eb7fbeeeb1cbd9ed2f6d794ec8c4eb + md5: 349635694b4df27336bc15a49e9220e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 52947 + timestamp: 1737635699390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hcc812fe_1.conda + sha256: d759d8ab9c060b42cabf6312b9a04aa590daecabf1dd4e35731f4bc1b5c388bb + md5: 533b07e9fd835938f465225613825eee + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 52776 + timestamp: 1737635802135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312h998013c_1.conda + sha256: 96145760baad111d7ae4213ea8f8cc035cf33b001f5ff37d92268e4d28b0941d + md5: 83678928c58c9ae76778a435b6c7a94a + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 50942 + timestamp: 1737635896600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + sha256: acb2e0ee948e3941f8ed191cb77f654e06538638aed8ccd71cbc78a15242ebbb + md5: 9d7e427d159c1b2d516cc047ff177c48 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 464794 + timestamp: 1731366525051 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda + sha256: 9c575d5035c7ecb114ab9e17906c0a54087d9598dd6a2104c02fe33f0a29dd46 + md5: 06513608c94fb1c1b17136ace77063a9 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 473242 + timestamp: 1731366577844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + sha256: 9d572a97419bdace14d7c7cc8cc8c4bf2dcb22b56965dac87a27fbdb5061b926 + md5: 5afbe52a59f04dd1fe566d0d17590d7e + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 448803 + timestamp: 1731367010746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + sha256: 158047d7a80e588c846437566d0df64cec5b0284c7184ceb4f3c540271406888 + md5: 8e30db4239508a538e4a3b3cdf5b9616 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 466219 + timestamp: 1740663246825 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.0.0-py312hb2c0f52_0.conda + sha256: 2a4f1ad69b16b9843f90adf5b39418c635835605bd2b300f55a8432c5ee22296 + md5: 1195731cd361196f9e352341a764fccb + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 467245 + timestamp: 1740663309651 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + sha256: cb11dcb39b2035ef42c3df89b5a288744b5dcb5a98fb47385760843b1d4df046 + md5: 0f461bd37cb428dc20213a08766bb25d + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 476376 + timestamp: 1740663381256 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py312h7900ff3_0.conda + sha256: 82a0b6ef00473c134ff32138a6fe1f6edc600f362f2007d33d6c6723e220a83d + md5: 972f2a7f04b117accc08a11469c2cb6e + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 25300 + timestamp: 1739792645286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-19.0.1-py312h8025657_0.conda + sha256: d17f85be9e3c9ccdbf46a00f51a155d6c9d02837f3ff850539cc931ce149546f + md5: 0f2b788d71caa13c9e05fb4366e3b564 + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 25487 + timestamp: 1739792927040 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-19.0.1-py312h1f38498_0.conda + sha256: 212a9ef1971d69882b977a930b3e8cd9d78bb58c027119a52b92d48a5e47f9eb + md5: 4bbcfad0bfcad7ee1d617a9b6db564ee + depends: + - libarrow-acero 19.0.1.* + - libarrow-dataset 19.0.1.* + - libarrow-substrait 19.0.1.* + - libparquet 19.0.1.* + - pyarrow-core 19.0.1 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 25462 + timestamp: 1739792876991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py312h01725c0_0_cpu.conda + sha256: b2d397ee72a8e33aa1b2bcaa525b3bfc1dad333a631e668e54bcdcf275b3d69b + md5: 227543d1eef90da786f0c63bd0787839 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 5203933 + timestamp: 1739792285799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-19.0.1-py312h66f7834_0_cpu.conda + sha256: ab25433629022236b24d35a53dbef033ef60f3cb3a71fa630392d7340791bdc7 + md5: e83aadc9635bdcf69845587c4c837fd3 + depends: + - libarrow 19.0.1.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 5017444 + timestamp: 1739792893195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-19.0.1-py312hc40f475_0_cpu.conda + sha256: 50ad4d67a1a2be32c2441a945a333b5347e36f027ea629fd903e7eaae77e0ed7 + md5: 90e3c0898e229d76e4a6949f621f0f58 + depends: + - __osx >=11.0 + - libarrow 19.0.1.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc =*=cpu + - numpy >=1.21,<3 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 4398733 + timestamp: 1739792829575 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda + sha256: 27f888492af3d5ab19553f263b0015bf3766a334668b5b3a79c7dc0416e603c1 + md5: 8088a5e7b2888c780738c3130f2a969d + depends: + - pybind11-global 2.13.6 *_2 + - python + constrains: + - pybind11-abi ==4 + license: BSD-3-Clause + license_family: BSD + size: 186375 + timestamp: 1730237816231 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda + sha256: 9ff0d61d86878f81779bdb7e47656a75feaab539893462cff29b8ec353026d81 + md5: 120541563e520d12d8e39abd7de9092c + depends: + - __unix + - python + constrains: + - pybind11-abi ==4 + license: BSD-3-Clause + license_family: BSD + size: 179139 + timestamp: 1730237481227 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: c69f87041cf24dfc8cb6bf64ca7133c7 + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.27.2 + - python >=3.9 + - typing-extensions >=4.6.1 + - typing_extensions >=4.12.2 + license: MIT + license_family: MIT + size: 296841 + timestamp: 1737761472006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + sha256: 81602a4592ad2ac1a1cb57372fd25214e63b1c477d5818b0c21cde0f1f85c001 + md5: bae01b2563030c085f5158c518b84e86 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1641402 + timestamp: 1734571789895 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda + sha256: 623e0f3846f15d035ce7ab7ae445fc8d9e547b6684ab55858b6f44510d24b097 + md5: 9677f6ab4bf27ba3c2aee70d08c7b27c + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1505076 + timestamp: 1734571966615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + sha256: cfa7201f890d5d08ce29ff70e65a96787d5793a1718776733666b44bbd4a1205 + md5: dcb307e02f17d38c6e1cbfbf8c602852 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1593461 + timestamp: 1734571986644 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.8.1-pyh3cfb1c2_0.conda + sha256: 84b78dcdc75d7dacd8c85df9a7fef42ff5684897217b46beef6c516afb2550dc + md5: 88715188749bfac9fa92aec9c747d62c + depends: + - pydantic >=2.7.0 + - python >=3.9 + - python-dotenv >=0.21.0 + license: MIT + size: 32632 + timestamp: 1740672054181 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 888600 + timestamp: 1736243563082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.1-py312h66e93f0_0.conda + sha256: 3f1c0bc95f2c46dcd107f44cf742ee1fa40ba22e244f01083654743bbbcf28f3 + md5: 9f1d7b421e4c8fd00009490613db64d4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 182333 + timestamp: 1737774425235 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.1-py312hb2c0f52_0.conda + sha256: 16af5db4359078bcb526291855bf1075ab035a96fe4e8d5cc4b0b5c8cba89b9a + md5: 90f5e9e04b1ecf25ad3f28b606f63742 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 183988 + timestamp: 1737774588265 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.1-py312hea69d52_0.conda + sha256: 5e7de2f908af22bbd8cf3562ce5ebf65ad6c0d8e40038f90b56f4db750639ce2 + md5: 07b0eb9b6bd91dfa87f95032825690dc + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 182524 + timestamp: 1737774624030 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + sha256: 75245ca9d0cbd6d38bb45ec02430189a9d4c21c055c5259739d738a2298d61b3 + md5: 799ed216dc6af62520f32aa39bc1c2bb + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy <2,>=1.5 + - python >=3.9 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 259195 + timestamp: 1733217599806 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_0_cpython.conda + sha256: 0366f38918bceda8ff5917d7bbe1cea2bc8b6c74e7245eb0e4b0d3c2d37f76cf + md5: 2e7ad70254455e0508adabff10218512 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13804161 + timestamp: 1739519531794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + sha256: 99713f6b534fef94995c6c16fd21d59f3548784e9111775d692bdc7c44678f02 + md5: e5c6ed218664802d305e79cc2d4491de + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 24215 + timestamp: 1733243277223 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + size: 13383 + timestamp: 1677079727691 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + sha256: 1b03678d145b1675b757cba165a0d9803885807792f7eb4495e48a38858c3cca + md5: a28c984e0429aff3ab7386f7de56de6f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 27913 + timestamp: 1734420869885 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 23216 + timestamp: 1740594909669 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_2.conda + sha256: b0c7528f2597e33911f179dad9852a4958683533570f8cc68976068b444461f4 + md5: c6de44ac405bf8a793c57850ea6b427a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 23768 + timestamp: 1740595924431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312hea69d52_2.conda + sha256: 10c3df8dae696da4bd8532609999991ae1f3c4cc1a1e7f6a636cf6aa19d9eb82 + md5: b0c7097883bb4d8acfd72e7b9c6b93cd + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 21947 + timestamp: 1740595129087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py312_heeca0f5_113.conda + sha256: dca9058fc3fd8c7720815a60f91fbed21c96deed1862c0779cb9849010a615e0 + md5: 0d0917b3ad4dad39ee9cf2340b6913e7 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - filelock + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libblas * *mkl + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libtorch 2.5.1.* + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl >=2024.2.2,<2025.0a0 + - networkx + - numpy >=1.19,<3 + - pybind11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.8,<4.0a0 + - sympy >=1.13.1,!=1.13.2 + - typing_extensions + constrains: + - pytorch-gpu ==99999999 + - pytorch-cpu ==2.5.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 27046950 + timestamp: 1739243439897 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.5.1-cpu_generic_py312_h819a134_13.conda + sha256: aca9f90080b41be87632b9be5c05d2d2583583cc8a88c2e4d9a755b4352443e8 + md5: 973311c703c92c0145a0ed6cd28ac1f0 + depends: + - _openmp_mutex >=4.5 + - filelock + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libtorch 2.5.1.* + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - networkx + - nomkl + - numpy >=1.19,<3 + - pybind11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.8,<4.0a0 + - sympy >=1.13.1,!=1.13.2 + - typing_extensions + constrains: + - pytorch-cpu ==2.5.1 + - pytorch-gpu ==99999999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26955065 + timestamp: 1739239589334 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py312_h49ed405_13.conda + sha256: 80ad77e98a4d91287b4c5aad62fb73c19fdcd3bf8a4c46f3630fdb3795b613ac + md5: 8a4ecdb698c36fa439757454437f44bd + depends: + - __osx >=11.0 + - filelock + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libtorch 2.5.1.* + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=18.1.8 + - networkx + - nomkl + - numpy >=1.19,<3 + - pybind11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.8,<4.0a0 + - sympy >=1.13.1,!=1.13.2 + - typing_extensions + constrains: + - pytorch-gpu ==99999999 + - pytorch-cpu ==2.5.1 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 26176295 + timestamp: 1739248670305 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda + sha256: dc78e41d51300722ba35ac4a10d37339ceffbe22d7501c71dfd3f633a4f8e79a + md5: 4de4a5ff81c941674e08595244e7cd61 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 199172 + timestamp: 1737454840766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.1-py312h2427ae1_0.conda + sha256: 9558f9330093e5c21b7c04e2e212e19b9b88ad9c808315f12c0765b244018a09 + md5: 0520da8de6870d8ff63e818e927d1524 + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 375156 + timestamp: 1738273130727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + size: 185646 + timestamp: 1733342347277 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + sha256: e558f8c254a9ff9164d069110da162fc79497d70c60f2c09a5d3d0d7101c5628 + md5: 4ba15ae9388b67d09782798347481f69 + depends: + - python >=3.9 + - rich >=13.7.1 + - click >=8.1.7 + - typing_extensions >=4.12.2 + - python + license: MIT + license_family: MIT + size: 17357 + timestamp: 1733750834072 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda + sha256: cfdd98c8f9a1e5b6f9abce5dac6d590cc9fe541a08466c9e4a26f90e00b569e3 + md5: 5e8060d52f676a40edef0006a75c718f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 356213 + timestamp: 1737146304079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.11-h3caee7a_0.conda + sha256: 5a7ae66f96be24c3b2007139b6c3701ab015b4b4eb4eccfdd07be97710243a47 + md5: 1517c0518f8a06a48a15f41d94252874 + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 352811 + timestamp: 1737146319512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.3-py312h12e396e_0.conda + sha256: 23dec8105d34e51cc2269a79680a666351233e2dc171ff14c46d3455d2c22080 + md5: fd1fc1f1e6ceee16d9a58d3ff5a57c7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + size: 431388 + timestamp: 1740651706122 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.3-py312h8cbf658_0.conda + sha256: 24ca173b9f39d5e5cabc6ea7e570b500682669e5910510020549f8696e29992d + md5: eb2d82d057535f4fb3182f43df429495 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + size: 417509 + timestamp: 1740651719895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.3-py312hcd83bfe_0.conda + sha256: 1d0412be1b16df769c69d537907e690be50d06d05f757ba2451facb6883a3eb3 + md5: 68b99db908e1ec63c0cacae262a835e9 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + size: 382676 + timestamp: 1740651813281 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_10.conda + sha256: 846d885a560fbb4375b645e7caf2f756ef88bbeb441b670375da0090aaa427fb + md5: 33a89eb1dedae8eb7222b0a89856f337 + depends: + - libsentencepiece 0.2.0 h6164ad9_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h197ff68_10 + - sentencepiece-spm 0.2.0 h6164ad9_10 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19686 + timestamp: 1735628718991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312h197ff68_10.conda + sha256: a7c2c19cc397c7632e2630af49ddcff128f145c93ea493421e6f42bfa5e1d30b + md5: 5642e4545a3cf03e446fb3b3e9fd723b + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2458076 + timestamp: 1735628298246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h6164ad9_10.conda + sha256: b98fc1028a8e8fbf309af383f9c837290a14e076e6c5533dc251694ea33ffc6e + md5: a4b75936c01dca3f089f02752b7ee325 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h6164ad9_10 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 85983 + timestamp: 1735628693813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/sentinel-1.0.0-pyh29332c3_0.conda + sha256: 87f7d70b0a29627ce7f78a463c6609156aaee638cca917b5f6c6c70828446acf + md5: 82e861633beabad680253e03918ec4a2 + depends: + - python >=3.9 + - python + constrains: + - varname >=0.1 + license: MIT + license_family: MIT + size: 13828 + timestamp: 1740445106343 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + sha256: 91d664ace7c22e787775069418daa9f232ee8bafdd0a6a080a5ed2395a6fa6b2 + md5: 9bddfdbf4e061821a1a443f93223be61 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 777736 + timestamp: 1740654030775 +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + sha256: 0557c090913aa63cdbe821dbdfa038a321b488e22bc80196c4b3b1aace4914ef + md5: 7c3c2a0f3ebdea2bbc35538d162b43bf + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14462 + timestamp: 1733301007770 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda + sha256: c998d5a29848ce9ff1c53ba506e7d01bbd520c39bbe72e2fb7cdf5a53bad012f + md5: aec4dba5d4c2924730088753f6fa164b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSL-1.0 + size: 1920152 + timestamp: 1738089391074 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.8-h8fb0607_0.conda + sha256: 86a19e4457bbc20d6c52a7cf0a010b2d99b704e78ae396f9fae4f4da9ae42cf3 + md5: 76647a886ead58ea5d82990117aafce2 + depends: + - _openmp_mutex >=4.5 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSL-1.0 + size: 1172391 + timestamp: 1738090891356 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.8-h8391f65_0.conda + sha256: e8f26540b22fe2f1c9f44666a8fdf0786e7a40e8e69466d2567a53b106f6dff3 + md5: 6567410b336a7b8f775cd9157fb50d61 + depends: + - __osx >=11.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 + arch: arm64 + platform: osx + license: BSL-1.0 + size: 584685 + timestamp: 1738089615902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 35857 + timestamp: 1733502172664 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 + md5: bf7a226e58dfb8346c70df36065d86c9 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 15019 + timestamp: 1733244175724 +- conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + sha256: 3c6a476e7afb702d841e23c61a0c4cc491929d2e39376d329e67e94c40a236cc + md5: c1ef6bc13dd2caa4b406fb3cb06c2791 + depends: + - anyio >=4.7.0 + - python >=3.9 + - starlette >=0.41.3 + license: BSD-3-Clause + license_family: BSD + size: 15324 + timestamp: 1735126414893 +- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.45.3-pyha770c72_0.conda + sha256: be48c99e6fb8e12ebee09e6fbb4d78a170b614cdaa19ab791a8f5b6caf09919a + md5: 9b3a68bc7aed7949ef86f950993261f4 + depends: + - anyio >=3.6.2,<5 + - python >=3.9 + - typing_extensions >=3.10.0 + license: BSD-3-Clause + license_family: BSD + size: 57934 + timestamp: 1737824077668 +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.9.0-py312h14ff09d_0.conda + sha256: aba3affdd0f87e198185ddc0986aa59cb067832dc88ffa6dedbe127da4f8d7bf + md5: 0f116f56298be1450a9db6b45bd2d9a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 968542 + timestamp: 1739550580537 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.9.0-py312h4a2a8a5_0.conda + sha256: 924de648f79b934172cbeafed35ef7413fbd9944c9a76291bbf835da1cfaa0af + md5: 2c8304aecaaced4bbcfc715a5ed16a1a + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 916956 + timestamp: 1739553289605 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tiktoken-0.9.0-py312hf3e4074_0.conda + sha256: a4335c374e3af6c8ce3d0c413b7074c355e04059dca25853ef0961f4ae0ab39b + md5: ca9fecb880b6d35241324835804a98a0 + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 827008 + timestamp: 1739550849700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 1931389 + timestamp: 1732734727624 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + sha256: 18636339a79656962723077df9a56c0ac7b8a864329eb8f847ee3d38495b863e + md5: ac944244f1fed2eb49bae07193ae8215 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 19167 + timestamp: 1733256819729 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda + sha256: d522d7dda6ebe296b20955b1be3eccc5d5cfdfd413457c1236323b6a08fffd9e + md5: e63e78e545fcf857cac3372edeb67ea4 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + size: 3514640 + timestamp: 1739826374204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.2.0-cuda126py312h5a3d8a8_0.conda + sha256: de5ede47f60573582a3aa6dc840c91a6c2002f294df22032ca91575174d60a21 + md5: 9c6facebce2e8fd1f9559ad14dc9dced + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart + - cuda-cuobjdump + - cuda-cupti >=12.6.80,<13.0a0 + - cuda-nvcc-tools + - cuda-version >=12.6,<13 + - libgcc >=13 + - libllvm20 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 101169812 + timestamp: 1738676149595 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/triton-3.2.0-cuda126py312h1ed5fa8_0.conda + sha256: abd91d81df1ef4b70546da24bc3b01b1aa7a5228bb7d4b73b38abab9dac74bfe + md5: f0c67131cc86daae8adf3ac221ee3a48 + depends: + - cuda-cudart + - cuda-cuobjdump + - cuda-cupti >=12.6.80,<13.0a0 + - cuda-nvcc-tools + - cuda-version >=12.6,<13 + - libgcc >=13 + - libllvm20 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 103306412 + timestamp: 1738676445445 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 + md5: 170a0398946d8f5b454e592672b6fc20 + depends: + - python >=3.9 + - typer-slim-standard 0.15.1 hd8ed1ab_0 + license: MIT + license_family: MIT + size: 56175 + timestamp: 1733408582623 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 + md5: 0218b16f5a1dd569e575a7a6415489db + depends: + - click >=8.0.0 + - python >=3.9 + - typing_extensions >=3.7.4.3 + constrains: + - rich >=10.11.0 + - typer >=0.15.1,<0.15.2.0a0 + - shellingham >=1.3.0 + license: MIT + license_family: MIT + size: 43592 + timestamp: 1733408569554 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f + md5: 4e603c43bfdfc7b533be087c3e070cc9 + depends: + - rich + - shellingham + - typer-slim 0.15.1 pyhd8ed1ab_0 + license: MIT + license_family: MIT + size: 49531 + timestamp: 1733408570063 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + sha256: 55c160b0cf9274e2b98bc0f7fcce548bffa8d788bc86aa02801877457040f6fa + md5: 5d448feee86e4740498ec8f8eb40e052 + depends: + - __unix + - click >=7.0 + - h11 >=0.8 + - python >=3.9 + - typing_extensions >=4.0 + license: BSD-3-Clause + license_family: BSD + size: 48643 + timestamp: 1734293057914 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + sha256: 87e1531e175e75122f9f37608eb953af4c977465ab0ae11283cc01fef954e4ec + md5: 32a94143a7f65d76d2d5da37dcb4ed79 + depends: + - __unix + - httptools >=0.6.3 + - python-dotenv >=0.13 + - pyyaml >=5.1 + - uvicorn 0.34.0 pyh31011fe_0 + - uvloop >=0.14.0,!=0.15.0,!=0.15.1 + - watchfiles >=0.13 + - websockets >=10.4 + license: BSD-3-Clause + license_family: BSD + size: 7203 + timestamp: 1734293058849 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda + sha256: 9337a80165fcf70b06b9d6ba920dad702260ca966419ae77560a15540e41ab72 + md5: 998e481e17c1b6a74572e73b06f2df08 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT OR Apache-2.0 + size: 701355 + timestamp: 1730214506716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda + sha256: 807eede6698bd00a1d739a3e19ee6ae6a03a66d2ddd2ef150f2dfd198c3b0292 + md5: d83e107ba16c77aba2feec47b7b666a4 + depends: + - libgcc >=13 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT OR Apache-2.0 + size: 655266 + timestamp: 1730214606664 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + sha256: b1efa77aa4871d7bb09c8dd297fa9bd9070ba7f0f95f2d12ae9cdd31ce8b6b22 + md5: 4f5110253ba80ebf27e55c4ab333880a + depends: + - __osx >=11.0 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT OR Apache-2.0 + size: 544097 + timestamp: 1730214653726 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda + sha256: b728f525dcae2c10524f9942255346eba62aee9c820ff269d7dd4f7caffb7ffb + md5: df87129c4cb7afc4a3cbad71a1b9e223 + depends: + - __glibc >=2.17,<3.0.a0 + - anyio >=3.0.0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 410192 + timestamp: 1736550568524 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda + sha256: 45193910f6bafc287c784442d173745161b18f96223f0f990a9a744fda753787 + md5: ed958a27e610c31de625e167d4c11a04 + depends: + - anyio >=3.0.0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 403791 + timestamp: 1736550743174 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda + sha256: 84122e3712f2263e12c9d2be75d122eaf2d269801183df4b73aadcb670943b17 + md5: 946eb0208d09b811a671fad9b2831f4e + depends: + - __osx >=11.0 + - anyio >=3.0.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 363822 + timestamp: 1736550859472 +- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0-py312h66e93f0_0.conda + sha256: 409a7a1d32e8ea23ee5233b2e95152cfaec8763aa9031f28cd8014594afc45df + md5: 5da55154de4cc82383f6bd52195db1c4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 263350 + timestamp: 1739780619751 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0-py312hb2c0f52_0.conda + sha256: 7fe6b6150410f57b442e6d130fc433959c436ada975b2f9e6352b902381ece99 + md5: 998b97a00d49748c249b749edbf27107 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 264378 + timestamp: 1739780675487 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0-py312hea69d52_0.conda + sha256: 70f511b2f9f3e0e05f2d403200a55470f9dabf87d8830b42d9ff697b9677c946 + md5: ae0c72f9ce03b54723f1cf7a4066d083 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 264745 + timestamp: 1739780725559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c + md5: 8a5c6e3f809bae085be369b62dc5d06a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 63967 + timestamp: 1736869675870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef + md5: e49608c832fcf438f70cbcae09c3adc5 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 61198 + timestamp: 1736869673767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xgrammar-0.1.11-py312h6edf5ed_2.conda + sha256: ff584830ae7a0e3fb7929f1a7554ca3559c83d5e064aed717719647bcaf2189f + md5: 2e78c5fd9d1e586b0c635e02dbbaa761 + depends: + - triton + - pydantic + - python + - sentencepiece + - tiktoken + - pytorch + - transformers + - pytest + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 AND BSD-4-Clause + size: 4409669 + timestamp: 1740619132269 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xgrammar-0.1.11-py312hc94be92_2.conda + sha256: c283b9f9a73d77cfa806d276010dca62335428d11be170d61fc869b26a038b5a + md5: 1970aa1298826d9e2feb51d16368f5aa + depends: + - triton + - pydantic + - python + - sentencepiece + - tiktoken + - pytorch + - transformers + - pytest + - libgcc >=13 + - libstdcxx >=13 + - libgcc >=13 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 AND BSD-4-Clause + size: 4270904 + timestamp: 1740619375982 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xgrammar-0.1.11-py312hd6dbf26_2.conda + sha256: a6801464fd31ddc4e87ae4b210db9cea1bd39e5b3f0d7cc48d9673d53685667b + md5: 41f1c12abe32475b267fcb349fa5f7ab + depends: + - pydantic + - python + - sentencepiece + - tiktoken + - pytorch + - transformers + - pytest + - __osx >=11.0 + - libcxx >=18 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 AND BSD-4-Clause + size: 353403 + timestamp: 1740619156354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda + sha256: 3bbc35b9ee44ffea1de441f906ba05139873a28325f8a8ed152e17af30e62232 + md5: 2ef1822d8168ed5d79ab1bf01088419a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 107794 + timestamp: 1735848927308 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.3-h86ecc28_0.conda + sha256: f210d0b6b8543acef9b73db43a557c94e695f9dfaa2f6989057c449d9c3e1239 + md5: d992916b6e4f6e7412332bbcd41c5aa2 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 104556 + timestamp: 1735848964267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-h5505292_0.conda + sha256: 43573d504e7edc4b876a9058dc316aa9851ced1d433c2b569d583c2db22c76e2 + md5: 92a98c1bbae4729dfd0216ca22c21858 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 98318 + timestamp: 1735849111725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h178313f_1.conda + sha256: 6b054c93dd19fd7544af51b41a8eacca2ab62271f6c0c5a2a0cffe80dc37a0ce + md5: 6822c49f294d4355f19d314b8b6063d8 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 152305 + timestamp: 1737575898300 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hcc812fe_1.conda + sha256: bfa211c0dd5dbb308788f055277dc428b7923ceb2de6a22ea98bc17cf306f9f5 + md5: d14c78abdd6109e2b7162f53b6cc1e77 + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 149654 + timestamp: 1737576065314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312h998013c_1.conda + sha256: 48821d23567ca0f853eee6f7812c74392867e123798b5b3c44f58758d8eb580e + md5: 092d3b40acc67c470f379049be343a7a + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 145543 + timestamp: 1737576074753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 + depends: + - libgcc >=13 + - libzlib 1.3.1 h86ecc28_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 405089 + timestamp: 1714723101397 diff --git a/tutorials/hello-magic/local/magic.lock b/tutorials/hello-magic/local/magic.lock new file mode 100644 index 0000000000..2d7db9d728 --- /dev/null +++ b/tutorials/hello-magic/local/magic.lock @@ -0,0 +1,2333 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/pytorch/ + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 8183ab363b7892f67ba3660929f1c3f4f8646e4a2a02d499d387acc0509764c3 + md5: 42164c6ce8e563c20a542686a8b9b964 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + size: 1571072276 + timestamp: 1729655770987 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.12_0.tar.bz2 + sha256: 1d476688886b78f641973d1b5c1352eaece59484f4408f2c1af46e3634a6c957 + md5: a393d6275c53d5218015a23c741dc004 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + size: 62089911 + timestamp: 1729651375444 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py312.tar.bz2 + build_number: 1 + sha256: f0beb429b3834a3796626642829a7e4bb9d4fe6477c8dc614a55e5c4f15a6a05 + md5: bb4b2d07cb6b9b476e78740c08ba69fe + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + size: 244939186 + timestamp: 1727971107041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 diff --git a/tutorials/hello-magic/magic.lock b/tutorials/hello-magic/magic.lock new file mode 100644 index 0000000000..d2c69e5aa3 --- /dev/null +++ b/tutorials/hello-magic/magic.lock @@ -0,0 +1,2901 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/pytorch/ + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.11-py311hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py311h0f6cedb_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.11_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-h074ec65_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py311hf886319_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py311.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.11-py311hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py311hb5d9ff4_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.11-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.11_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py311h01f2145_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-hf736513_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py311hb1a73f2_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl + test: + channels: + - url: https://conda.anaconda.org/pytorch/ + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.11-py311hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py311h0f6cedb_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.11_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-h074ec65_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py311hf886319_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py311.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.11-py311hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py311hb5d9ff4_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.11-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.11_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py311h01f2145_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-hf736513_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py311hb1a73f2_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + name: annotated-types + version: 0.7.0 + sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 + requires_dist: + - typing-extensions>=4.0.0 ; python_full_version < '3.9' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl + name: anyio + version: 4.8.0 + sha256: b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a + requires_dist: + - exceptiongroup>=1.0.2 ; python_full_version < '3.11' + - idna>=2.8 + - sniffio>=1.1 + - typing-extensions>=4.5 ; python_full_version < '3.13' + - trio>=0.26.1 ; extra == 'trio' + - anyio[trio] ; extra == 'test' + - coverage[toml]>=7 ; extra == 'test' + - exceptiongroup>=1.2.0 ; extra == 'test' + - hypothesis>=4.0 ; extra == 'test' + - psutil>=5.9 ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - trustme ; extra == 'test' + - truststore>=0.9.1 ; python_full_version >= '3.10' and extra == 'test' + - uvloop>=0.21 ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and platform_system != 'Windows' and extra == 'test' + - packaging ; extra == 'doc' + - sphinx~=7.4 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.11-py311hd8ed1ab_1.conda + noarch: generic + sha256: b9bb4486ba7b81d7264e92f346c9fa2d4a6c9678c28b33fb5d1652ecc7f82e26 + md5: 6aab9c45010dc5ed92215f89cdafa201 + depends: + - python 3.11.11.* + - python_abi * *_cp311 + license: Python-2.0 + purls: [] + size: 46068 + timestamp: 1733407866862 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 21022 + timestamp: 1709765922936 +- pypi: https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl + name: fastapi + version: 0.115.9 + sha256: 4a439d7923e4de796bcc88b64e9754340fcd1574673cbd865ba8a99fe0d28c56 + requires_dist: + - starlette>=0.40.0,<0.46.0 + - pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - typing-extensions>=4.8.0 + - fastapi-cli[standard]>=0.0.5 ; extra == 'standard' + - httpx>=0.23.0 ; extra == 'standard' + - jinja2>=3.1.5 ; extra == 'standard' + - python-multipart>=0.0.18 ; extra == 'standard' + - email-validator>=2.0.0 ; extra == 'standard' + - uvicorn[standard]>=0.12.0 ; extra == 'standard' + - fastapi-cli[standard]>=0.0.5 ; extra == 'all' + - httpx>=0.23.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - python-multipart>=0.0.18 ; extra == 'all' + - itsdangerous>=1.1.0 ; extra == 'all' + - pyyaml>=5.3.1 ; extra == 'all' + - ujson>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0 ; extra == 'all' + - orjson>=3.2.1 ; extra == 'all' + - email-validator>=2.0.0 ; extra == 'all' + - uvicorn[standard]>=0.12.0 ; extra == 'all' + - pydantic-settings>=2.0.0 ; extra == 'all' + - pydantic-extra-types>=2.0.0 ; extra == 'all' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py311h0f6cedb_3.conda + sha256: 27aad6269fb3fcb80170a0c9f2108644b7560c56c88ab2d6da951059593c38ca + md5: 847d4e1e49a6aec4c130b2db001c3802 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 202814 + timestamp: 1733462674178 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py311hb5d9ff4_3.conda + sha256: 72c5ac6f1c358fda23f7d68c92c9d2dd4e458b329ece1ad2c3714991c9f8f5f6 + md5: 5ebaa44b9a984799aea445996f63f002 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 147171 + timestamp: 1733462769936 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + name: idna + version: '3.10' + sha256: 946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + - flake8>=7.1.1 ; extra == 'all' + requires_python: '>=3.6' +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 29141 + timestamp: 1737420302391 +- pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + name: iniconfig + version: 2.0.0 + sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + purls: [] + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + purls: [] + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda + sha256: 0291d90706ac6d3eea73e66cd290ef6d805da3fad388d1d476b8536ec92ca9a8 + md5: 6565a715337ae279e351d0abd8ffe88a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 25354 + timestamp: 1733219879408 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda + sha256: 4f738a7c80e34e5e5d558e946b06d08e7c40e3cc4bdf08140bf782c359845501 + md5: 249e2f6f5393bb6b36b3d3a3eebdcdf9 + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24976 + timestamp: 1733219849253 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda + sha256: 3f4365e11b28e244c95ba8579942b0802761ba7bb31c026f50d1a9ea9c728149 + md5: a502d7aad449a1206efb366d6a12c52d + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8065890 + timestamp: 1707225944355 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda + sha256: 160a52a01fea44fe9753a2ed22cf13d7b55c8a89ea0b8738546fdbf4795d6514 + md5: 3160b93669a0def35a7a8158ebb33816 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6652352 + timestamp: 1707226297967 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + name: pluggy + version: 1.5.0 + sha256: 44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 + requires_dist: + - pre-commit ; extra == 'dev' + - tox ; extra == 'dev' + - pytest ; extra == 'testing' + - pytest-benchmark ; extra == 'testing' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + name: pydantic + version: 2.10.6 + sha256: 427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 + requires_dist: + - annotated-types>=0.6.0 + - pydantic-core==2.27.2 + - typing-extensions>=4.12.2 + - email-validator>=2.0.0 ; extra == 'email' + - tzdata ; python_full_version >= '3.9' and platform_system == 'Windows' and extra == 'timezone' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.27.2 + sha256: 26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7 + requires_dist: + - typing-extensions>=4.6.0,!=4.7.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.27.2 + sha256: 1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048 + requires_dist: + - typing-extensions>=4.6.0,!=4.7.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl + name: pytest + version: 8.3.4 + sha256: 50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6 + requires_dist: + - colorama ; sys_platform == 'win32' + - exceptiongroup>=1.0.0rc8 ; python_full_version < '3.11' + - iniconfig + - packaging + - pluggy>=1.5,<2 + - tomli>=1 ; python_full_version < '3.11' + - argcomplete ; extra == 'dev' + - attrs>=19.2 ; extra == 'dev' + - hypothesis>=3.56 ; extra == 'dev' + - mock ; extra == 'dev' + - pygments>=2.7.2 ; extra == 'dev' + - requests ; extra == 'dev' + - setuptools ; extra == 'dev' + - xmlschema ; extra == 'dev' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda + build_number: 1 + sha256: b29ce0836fce55bdff8d5c5b71c4921a23f87d3b950aea89a9e75784120b06b0 + md5: 8387070aa413ce9a8cc35a509fae938b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: Python-2.0 + purls: [] + size: 30624804 + timestamp: 1733409665928 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.11-hc22306f_1_cpython.conda + build_number: 1 + sha256: 94e198f6a5affa1431401fca7e3b27fda68c59f5ee726083288bff1f6bed8c7f + md5: 8d81dcd0be5bdcdd98e0f2482bf63784 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: Python-2.0 + purls: [] + size: 14647146 + timestamp: 1733409012105 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda + build_number: 5 + sha256: 2660b8059b3ee854bc5d3c6b1fce946e5bd2fe8fbca7827de2c5885ead6209de + md5: 139a8d40c8a2f430df31048949e450de + constrains: + - python 3.11.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6211 + timestamp: 1723823324668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda + build_number: 5 + sha256: adc05729b7e0aca7b436e60a86f10822a92185dfcb48d66d6444e3629d3a1f6a + md5: 3b855e3734344134cb56c410f729c340 + constrains: + - python 3.11.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6308 + timestamp: 1723823096865 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.5.1-py3.11_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: cc2ee559c2104436d8752182986de576d1cc697e2111045a6cc10ac3ed4fb21f + md5: 4e8e3c2f5231d79c0b3540c16d98e542 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.11,<3.12.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.1.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 1572203154 + timestamp: 1729655678747 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.5.1-py3.11_0.tar.bz2 + sha256: 8519364bc14837a5b3461d71d68688daebe332c978c1a203ee9f58ce65100e86 + md5: c1c26d3ce34cc8ad40d6b55c61852714 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.11,<3.12.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 62801112 + timestamp: 1729651308831 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + purls: [] + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + purls: [] + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + sha256: d107ad62ed5c62764fba9400f2c423d89adf917d687c7f2e56c3bfed605fb5b3 + md5: 014417753f948da1f70d132b2de573be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 213136 + timestamp: 1737454846598 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + sha256: 2af6006c9f692742181f4aa2e0656eb112981ccb0b420b899d3dd42c881bd72f + md5: 250b2ee8777221153fd2de9c279a7efa + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 196951 + timestamp: 1737454935552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py311h7deb3e3_0.conda + sha256: bd6309ef4629744aaaccd9b33d6389dfe879e9864386137e6e4ecc7e1b9ed0f3 + md5: 52457fbaa0aef8136d5dd7bb8a36db9e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 392547 + timestamp: 1738271109731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py311h01f2145_0.conda + sha256: 29255e5ca9f0b50d551fce4d5b7745fa11b4e672418a6d88a4c3f1a974dd4e44 + md5: 4c5daee5a983fb515460a2714b612126 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 370170 + timestamp: 1738271259321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-h074ec65_10.conda + sha256: 1c7b8a24296bf1309f866d363a1152a796d495f97a87d0c6f35b845e6c153250 + md5: 4b2fa94e6d42231ffee6707dfe578915 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.11.* *_cp311 + - sentencepiece-python 0.2.0 py311hf886319_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19473 + timestamp: 1735628355599 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-hf736513_10.conda + sha256: 16826ce65b4a391990fa85dd2af7d0cd98549be9e993181f18e6d633185a0bd9 + md5: 4b55d377c0ba17934ab1515b608b8276 + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.11.* *_cp311 + - sentencepiece-python 0.2.0 py311hb1a73f2_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 19753 + timestamp: 1735628583443 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py311hf886319_10.conda + sha256: 6d92d183dbe714d2b2b042542b36e1a875f307c83bde4324f24a6a1ea62400b6 + md5: 90c0c6f0d4d58d2383373e3ab7bc4d19 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2350779 + timestamp: 1735627954130 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py311hb1a73f2_10.conda + sha256: 877e5831eb93d1b18c2218284806d8e6fb623a484c368bb0de785ca8586d97bf + md5: 2c13a5b72d87bad8a5af1f4b100e6a36 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sentencepiece?source=hash-mapping + size: 2498193 + timestamp: 1735628323682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + name: sniffio + version: 1.3.1 + sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl + name: starlette + version: 0.45.3 + sha256: dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d + requires_dist: + - anyio>=3.6.2,<5 + - typing-extensions>=3.10.0 ; python_full_version < '3.10' + - httpx>=0.27.0,<0.29.0 ; extra == 'full' + - itsdangerous ; extra == 'full' + - jinja2 ; extra == 'full' + - python-multipart>=0.0.18 ; extra == 'full' + - pyyaml ; extra == 'full' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.1.0-py311.tar.bz2 + build_number: 1 + sha256: e07291e5dee2e59a32db462d95ebde2d137ac4cae7f71b222dbbd81fff547a0b + md5: 5fc754aece8ef7de578e4e1282df340e + depends: + - filelock + - python >=3.11,<3.12.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + size: 245178453 + timestamp: 1727971110674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda + sha256: afa3489113154b5cb0724b0bf120b62df91f426dabfe5d02f2ba09e90d346b28 + md5: df3aee9c3e44489257a840b8354e77b9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 855653 + timestamp: 1732616048886 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py311h917b07b_0.conda + sha256: 80b79a7d4ed8e16019b8c634cca66935d18fc98be358c76a6ead8c611306ee14 + md5: 183b74c576dc7f920dae168997dbd1dd + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 858954 + timestamp: 1732616142626 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 diff --git a/tutorials/max-graph-api/magic.lock b/tutorials/max-graph-api/magic.lock new file mode 100644 index 0000000000..842de2d2f9 --- /dev/null +++ b/tutorials/max-graph-api/magic.lock @@ -0,0 +1,4414 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + - url: https://conda.anaconda.org/pytorch/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-7.1.0-gpl_ha1cb39d_715.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.3.0-h76408a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h7c63dc7_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.20.6-h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-hba53ac1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.71-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2025.0.0-hdc3f47d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2025.0.0-h4d9b6c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2025.0.0-h4d9b6c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2025.0.0-h981d57b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2025.0.0-hdc3f47d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2025.0.0-hdc3f47d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2025.0.0-hdc3f47d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2025.0.0-h981d57b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2025.0.0-h6363af5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2025.0.0-h6363af5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2025.0.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2025.0.0-h630ec5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2025.0.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.3-h3dc2cb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.3-h9a4d06a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.9-h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.27-h520f47e_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.0-hc4a0caf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.1-h861ebed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.4.0-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.50-h9b8e6db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.4-h3083f51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.0-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.0.0-py312.tar.bz2 + - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.19.0-py312_cu124.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.41-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.4.0-py3.12_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.19.0-py312_cpu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + build_number: 2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5744 + timestamp: 1650742457817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda + sha256: f507b58f77eabc0cc133723cb7fc45c053d551f234df85e70fb3ede082b0cd53 + md5: ae1370588aa6a5157c34c73e9bbb36a0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: GPL + size: 560238 + timestamp: 1731489643707 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + sha256: b08ef033817b5f9f76ce62dfcac7694e7b6b4006420372de22494503decac855 + md5: 346722a0be40f6edc53f12640d301338 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 2706396 + timestamp: 1718551242397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + md5: d9c69a24ad678ffce24c6543a0176b00 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 71042 + timestamp: 1660065501192 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2 + build_number: 16 + sha256: 87056ebdc90b6d1ea6726d04d42b844cc302112e80508edbf7bf1f1a4fd3fed2 + md5: c196a26abf6b4f132c88828ab7c2231c + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 16_linux64_mkl + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=10.4.0 + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - llvm-openmp >=14.0.4 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 13258 + timestamp: 1660094704275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: a7da65ca4e0322317cbc4d387c4a5f075cdc7fcd12ad9f7f18da758c7532749a + md5: 3f92c1c9e1c0e183462c5071aa02cae1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - mkl >=2022.1.0,<2023.0a0 + - mkl-devel 2022.1.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 12630 + timestamp: 1660094595212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux + license: ISC + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + arch: arm64 + platform: osx + license: ISC + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda + sha256: de7d0d094e53decc005cb13e527be2635b8f604978da497d4c0d282c7dc08385 + md5: b34c2833a1f56db610aeb27f206d800d + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-only or MPL-1.1 + size: 978868 + timestamp: 1733790976384 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d + depends: + - python >=3.9 + license: ISC + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_0.conda + noarch: generic + sha256: f5c7ad0bd23fa8645ac279d99bddba656ff61483dc6312af12aae13910dfb210 + md5: a5b10f166467fecec692abaee84d16aa + depends: + - python 3.12.9.* + - python_abi * *_cp312 + license: Python-2.0 + size: 44836 + timestamp: 1739519561557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-he02047a_2.conda + sha256: d8ad0be647dad6378119c110572bbf9f6b1e8c820393ed159d45f02588979c07 + md5: a748faa52331983fc3adcc3b116fe0e4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.4.127 h85509e4_2 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 22563 + timestamp: 1715710703269 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h85509e4_2.conda + sha256: 1f1b3e0bf6b5e665860ecbdf509c1e02760c14d25e3f3893a712f90f7f8a5abc + md5: 329163110a96514802e9e64d971edf43 + depends: + - cuda-version >=12.4,<12.5.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 186886 + timestamp: 1715710690964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.4.127-he02047a_2.conda + sha256: db9ebc57fd583711bbdd12e54d00e4153a7b414f929f77fca2f44547c02204b8 + md5: 46422ef1b1161fb180027e50c598ecd0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 1918773 + timestamp: 1715665119069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-libraries-12.4.1-ha770c72_1.conda + sha256: cb30e83f33c7480caa68a1e35e6ff4102d17ff0a94239ca18555afff1df2f70e + md5: 6bb3f998485d4344a7539e0b218b3fc1 + depends: + - cuda-cudart 12.4.127.* + - cuda-nvrtc 12.4.127.* + - cuda-opencl 12.4.127.* + - libcublas 12.4.5.8.* + - libcufft 11.2.1.3.* + - libcufile 1.9.1.3.* + - libcurand 10.3.5.147.* + - libcusolver 11.6.1.9.* + - libcusparse 12.3.1.170.* + - libnpp 12.2.5.30.* + - libnvfatbin 12.4.127.* + - libnvjitlink 12.4.127.* + - libnvjpeg 12.3.1.117.* + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 20180 + timestamp: 1713304266920 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.4.127-he02047a_2.conda + sha256: c4aba5e152526db7cad7c8a5191497b0c6365c912ed845dc9c427d29893486a1 + md5: 80baf6262f4a1a0dde42d85aaa393402 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 18825627 + timestamp: 1715711095870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.4.127-he02047a_2.conda + sha256: 8f499785edaec6198a934e8a9dd1f8b6f79aabcc135962d6050dd7328c76d3dc + md5: 656a004b6e44f50ce71c65cab0d429b4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 31691 + timestamp: 1715731339952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-opencl-12.4.127-he02047a_1.conda + sha256: 75d912a70719a9d0bca9f234a79a857815d8feec3c54c145e6e41589de4ff5be + md5: 1e98deda07c14d26c80d124cf0eb011a + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - ocl-icd >=2.3.2,<3.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 30406 + timestamp: 1715711329543 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.1-ha804496_0.conda + sha256: 61a593347c91a9bcd18329f7aa780bd1fb1e20dd1b61b16a451bd4a6b60dabf0 + md5: 48829f4ef6005ae8d4867b99168ff2b8 + depends: + - __linux + - cuda-libraries 12.4.1.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 20034 + timestamp: 1712683445348 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + constrains: + - cudatoolkit 12.4|12.4.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 21022 + timestamp: 1709765922936 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 + md5: 418c6ca5929a611cbd69204907a83995 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 760229 + timestamp: 1685695754230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 618596 + timestamp: 1640112124844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda + sha256: 1848c7db9e264e3b8036ee133d570dd880422983cd20dd9585a505289606d276 + md5: 1d6afef758879ef5ee78127eb4cd2c4a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat 2.6.4 h5888daf_0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 138145 + timestamp: 1730967050578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-7.1.0-gpl_ha1cb39d_715.conda + sha256: 6effcce8adc5b1d9a22e021c3121eaa6b6fbe93467956765dbebd0f6f5839469 + md5: 18046f211e7aaeae13430827b7a8d692 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.13,<1.3.0a0 + - aom >=3.9.1,<3.10.0a0 + - bzip2 >=1.0.8,<2.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - gmp >=6.3.0,<7.0a0 + - harfbuzz >=10.3.0,<11.0a0 + - lame >=3.100,<3.101.0a0 + - libass >=0.17.3,<0.17.4.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libopenvino >=2025.0.0,<2025.0.1.0a0 + - libopenvino-auto-batch-plugin >=2025.0.0,<2025.0.1.0a0 + - libopenvino-auto-plugin >=2025.0.0,<2025.0.1.0a0 + - libopenvino-hetero-plugin >=2025.0.0,<2025.0.1.0a0 + - libopenvino-intel-cpu-plugin >=2025.0.0,<2025.0.1.0a0 + - libopenvino-intel-gpu-plugin >=2025.0.0,<2025.0.1.0a0 + - libopenvino-intel-npu-plugin >=2025.0.0,<2025.0.1.0a0 + - libopenvino-ir-frontend >=2025.0.0,<2025.0.1.0a0 + - libopenvino-onnx-frontend >=2025.0.0,<2025.0.1.0a0 + - libopenvino-paddle-frontend >=2025.0.0,<2025.0.1.0a0 + - libopenvino-pytorch-frontend >=2025.0.0,<2025.0.1.0a0 + - libopenvino-tensorflow-frontend >=2025.0.0,<2025.0.1.0a0 + - libopenvino-tensorflow-lite-frontend >=2025.0.0,<2025.0.1.0a0 + - libopus >=1.3.1,<2.0a0 + - librsvg >=2.58.4,<3.0a0 + - libstdcxx >=13 + - libva >=2.22.0,<3.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libvpx >=1.14.1,<1.15.0a0 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.6,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - openh264 >=2.6.0,<2.6.1.0a0 + - openssl >=3.4.1,<4.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - sdl2 >=2.32.50,<3.0a0 + - svt-av1 >=3.0.0,<3.0.1.0a0 + - x264 >=1!164.3095,<1!165 + - x265 >=3.5,<3.6.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + constrains: + - __cuda >=12.4 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 10401213 + timestamp: 1740543495852 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 265599 + timestamp: 1730283881107 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + size: 4102 + timestamp: 1566932280397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 + md5: ac7bc6a654f8f41b352b38f4051135f8 + depends: + - libgcc-ng >=7.5.0 + arch: x86_64 + platform: linux + license: LGPL-2.1 + size: 114383 + timestamp: 1604416621168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + sha256: d5283b95a8d49dcd88d29b360d8b38694aaa905d968d156d72ab71d32b38facb + md5: 201db6c2d9a3c5e46573ac4cb2e92f4f + depends: + - libgcc-ng >=12 + - libglib >=2.80.2,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 528149 + timestamp: 1715782983957 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda + sha256: 9d93e75a63a8ca8f86d1be09f68f1211754e6f1e9ee4fa6d90b9d46ee0f1dabb + md5: 0754038c806eae440582da1c3af85577 + depends: + - __glibc >=2.17,<3.0.a0 + - gettext-tools 0.23.1 h5888daf_0 + - libasprintf 0.23.1 h8e693c7_0 + - libasprintf-devel 0.23.1 h8e693c7_0 + - libgcc >=13 + - libgettextpo 0.23.1 h5888daf_0 + - libgettextpo-devel 0.23.1 h5888daf_0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 484344 + timestamp: 1739038829530 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda + sha256: dd2b54a823ea994c2a7908fcce40e1e612ca00cb9944f2382624ff2d3aa8db03 + md5: 2f659535feef3cfb782f7053c8775a32 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 2967824 + timestamp: 1739038787800 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h7201bc8_3.conda + sha256: addd0bc226ca86c11f1223ab322d12b67501c2b3d93749bdab2068ccaedd8ef0 + md5: 673ef4d6611f5b4ca7b5c1f8c65a38dc + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 209631 + timestamp: 1733462668219 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.1.5-py312h524cf62_3.conda + sha256: 0ea196e4b706321951af1eebdb6a4eb9307faa1fd5361bcf49acb150e71774f7 + md5: ab7a5d10c7b4e249a9fe7bc280909803 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 147983 + timestamp: 1733462785197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + md5: f87c7b7c2cb45f323ffbce941c78ab7c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.0-or-later + license_family: LGPL + size: 96855 + timestamp: 1711634169756 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.3.0-h76408a6_0.conda + sha256: fbccddfbbfaf139102e5513a2a053010338809348ade18bbf16cb6b92a53d294 + md5: 0a06f278e5d9242057673b1358a75e8f + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.2,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1671633 + timestamp: 1740154398990 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h7c63dc7_2.conda + sha256: 5e44a3a4b9791d1268636811628555ad40d4a8dd5c3be3334062df75580ae25b + md5: f56277b7f079f1b13cbf7fb9b4f194c4 + depends: + - alsa-lib >=1.2.10,<1.3.0.0a0 + - libdb >=6.2.32,<6.3.0a0 + - libgcc-ng >=12 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.0-only + license_family: LGPL + size: 464144 + timestamp: 1693879949990 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda + sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472 + md5: 01f8d123c96816249efd255a31ad7712 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 671240 + timestamp: 1740155456116 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.20.6-h84d6215_0.conda + sha256: d91b1fcdead51bae9d4972f8105217dd29ef12dd89e5570046c752f267e0e9af + md5: 15a7a302f9a67ac83897dc3d8b5e4097 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 553269 + timestamp: 1739970787243 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda + sha256: 13b863584fccbb9089de73a2442e540703ce4873e4719c9d98c98e4a8e12f9d1 + md5: 988f4937281a66ca19d1adb3b5e3f859 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 43179 + timestamp: 1739038705987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda + sha256: b05a859fe5a2b43574f3a5d93552061232b92d17017b27ecab1eccca1dbb2fe4 + md5: 2827e722a963b779ce878ef9b5474534 + depends: + - __glibc >=2.17,<3.0.a0 + - libasprintf 0.23.1 h8e693c7_0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 34282 + timestamp: 1739038733352 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-hba53ac1_1.conda + sha256: aaf38bcb9b78963f4eb58d882a9a6a350f500cfa162bd8a80f7f215d3831afa2 + md5: f5e75fe79d446bf4975b41d375314605 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - harfbuzz >=10.1.0,<11.0a0 + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - libiconv >=1.17,<2.0a0 + arch: x86_64 + platform: linux + license: ISC + size: 153294 + timestamp: 1733786555242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 24e656f13b402b6fceb88df386768445ab9beb657d451a8e5a88d4b3380cf7a4 + md5: 85f61af03fd291dae33150ffe89dc09a + depends: + - mkl >=2022.1.0,<2023.0a0 + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 13102 + timestamp: 1660094562739 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d + md5: f50b1fd98593278e18319653cff9c475 + depends: + - libopenblas >=0.3.24,<0.3.25.0a0 + - libopenblas >=0.3.24,<1.0a0 + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14817 + timestamp: 1697484577887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.71-h39aace5_0.conda + sha256: 2bbefac94f4ab8ff7c64dc843238b6c8edcc9ff1f2b5a0a48407a904dc7ccfb2 + md5: dd19e4e3043f6948bd7454b946ee0983 + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 102268 + timestamp: 1729940917945 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 892ba10508f22310ccfe748df1fd3b6c7f20e7b6f6b79e69ed337863551c1bd8 + md5: 361bf757b95488de76c4f123805742d3 + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - liblapack 3.9.0 16_linux64_mkl + - liblapacke 3.9.0 16_linux64_mkl + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 12791 + timestamp: 1660094570921 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 + md5: 5460a8d1beffd7f63994d891e6a20da4 + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - liblapack 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14738 + timestamp: 1697484590682 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.5.8-he02047a_2.conda + sha256: 168e664423e875f7107697dfa7935399675872ea8abffa92621db98007258d66 + md5: d446adae085aa1ff37c44b69988a6f06 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 240665617 + timestamp: 1715711552741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.2.1.3-he02047a_2.conda + sha256: 242e1ed210a85fc0dc2a4e86bf0b75120f1768ab66497502c5e6d69e801bf9dc + md5: d2641a67c207946ef96f1328c4a8e8ed + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 174980358 + timestamp: 1715711515585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.9.1.3-he02047a_2.conda + sha256: 7fa7a608d52064b724241e4026f0e0cc244c6f725623e2c26c810be99822fa28 + md5: a051267bcb1912467c81d802a7d3465e + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 924329 + timestamp: 1715720836466 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.5.147-he02047a_2.conda + sha256: 7db821fc8f566dbb8d4e40dae62edb07d638db8c028d677a0063ece66872d19c + md5: 9c4886d513fd477df88d411cd274c202 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 41590169 + timestamp: 1715711553620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.1.9-he02047a_2.conda + sha256: df4f8a94bffb59dc3da28fb5a892c1ef2553f8afd49f141d3e2da8c92f276a56 + md5: 9f6877f8936be962f598db5e9b8efc51 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libcublas >=12.4.5.8,<12.5.0a0 + - libcusparse >=12.3.1.170,<12.4.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 81594879 + timestamp: 1715711788074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.1.170-he02047a_2.conda + sha256: f2254e41c93a8c3529690c19350556708182ef699ca658c6554eeb7eb4b8c3de + md5: 1c4c7ff54dc5b947f2ab8f5ff8a28dae + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libnvjitlink >=12.4.127,<12.5.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 117818451 + timestamp: 1715711610677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2 + sha256: 21fac1012ff05b131d4b5d284003dbbe7b5c4c652aa9e401b46279ed5a784372 + md5: 3f3258d8f841fbac63b36b75bdac1afd + depends: + - libgcc-ng >=9.3.0 + - libstdcxx-ng >=9.3.0 + arch: x86_64 + platform: linux + license: AGPL-3.0-only + license_family: AGPL + size: 24409456 + timestamp: 1609539093147 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda + sha256: f0d5ffbdf3903a7840184d14c14154b503e1a96767c328f61d99ad24b6963e52 + md5: 8bc89311041d7fcb510238cf0848ccae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpciaccess >=0.18,<0.19.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 242533 + timestamp: 1733424409299 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 44840 + timestamp: 1731330973553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda + sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792 + md5: ef504d1acbd74b7cc6849ef8af47dd03 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h767d61c_2 + - libgcc-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 847885 + timestamp: 1740240653082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda + sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904 + md5: a2222a6ada71fb478682efe483ce0f92 + depends: + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53758 + timestamp: 1740240660904 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda + sha256: ffc3602f9298da248786f46b00d0594d26a18feeb1b07ce88f3d7d61075e39e6 + md5: e55712ff40a054134d51b89afca57dbc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgpg-error >=1.51,<2.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 586185 + timestamp: 1732523190369 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda + sha256: 190097140d9c16637aa516757d8087f17e8c22cc844c87288da64404b81ef43c + md5: a09ce5decdef385bcce78c32809fa794 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 166867 + timestamp: 1739038720211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda + sha256: 90f29ec7a7e2d758cb61459e643dcb54933dcf92194be6c29b0a1591fcbb163e + md5: 7a5d5c245a6807deab87558e9efd3ef0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgettextpo 0.23.1 h5888daf_0 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + size: 36818 + timestamp: 1739038746565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 + depends: + - libgfortran 14.2.0 h69a702a_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 134712 + timestamp: 1731330998354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda + sha256: f0804a9e46ae7b32ca698d26c1c95aa82a91f71b6051883d4a46bea725be9ea4 + md5: 37d1af619d999ee8f1f73cf5a06f4e2f + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_1 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 3923974 + timestamp: 1737037491054 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 132463 + timestamp: 1731330968309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: LicenseRef-libglvnd + size: 75504 + timestamp: 1731330988898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda + sha256: 9e0c09c1faf2151ade3ccb64e52d3c1f2dde85c00e37c6a3e6a8bced2aba68be + md5: 168cc19c031482f83b23c4eebbb94e26 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 268740 + timestamp: 1731920927644 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: d6201f860b2d76ed59027e69c2bbad6d1cb211a215ec9705cc487cde488fa1fa + md5: a2f166748917d6d6e4707841ca1f519e + depends: + - libblas 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - liblapacke 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 12791 + timestamp: 1660094578903 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + build_number: 19 + sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 + md5: 3638eacb084c374f41f9efa40d20a47b + depends: + - libblas 3.9.0 19_osxarm64_openblas + constrains: + - libcblas 3.9.0 19_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 19_osxarm64_openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14721 + timestamp: 1697484603691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2 + build_number: 16 + sha256: 935036dc46c483cba8288c6de58d461ab3f42915715ffe9485105ad1dd203a0e + md5: 44ccc4d4dca6a8d57fa17442bc64b5a1 + depends: + - libblas 3.9.0 16_linux64_mkl + - libcblas 3.9.0 16_linux64_mkl + - liblapack 3.9.0 16_linux64_mkl + constrains: + - blas * mkl + - mkl <2025 + arch: x86_64 + platform: linux + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + size: 12793 + timestamp: 1660094586875 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnpp-12.2.5.30-he02047a_2.conda + sha256: d8c97716825955c48681f4a3cde2f0cbbacc77c91b4cd944d4906f63385487df + md5: a96a1edd18bee676cf2dcca251d3d6a4 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 99461229 + timestamp: 1715711634268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.4.127-he02047a_2.conda + sha256: d40f37532f86cbbe63439489be0e88561819190392cc519c69365b3fc47a2c5b + md5: d746b76642b4ac6e40f1219405672beb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 792025 + timestamp: 1715711761341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.4.127-he02047a_2.conda + sha256: 31382c8ef388a51bd2c283a239e037b8b30f9c7ecf6ec9744824445b59db39b6 + md5: 303845d6c48bf4185dc4138634650468 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 16571958 + timestamp: 1715711715842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjpeg-12.3.1.117-he02047a_2.conda + sha256: 49a182f8da4ba30fbfee9692976d9da349371175c9c9576768d4754a51fef326 + md5: 8f3ed0e41a4b505de40b4f96f4bfb0fa + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.4,<12.5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: LicenseRef-NVIDIA-End-User-License-Agreement + size: 2491500 + timestamp: 1715711780068 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda + sha256: 5eda3fe92b99b25dd4737226a9485078ab405672d9f621be75edcb68f1e9026d + md5: 601bfb4b3c6f0b844443bb81a56651e0 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 205914 + timestamp: 1719301575771 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 + md5: aacb05989f358affe1bafd4ea7294db4 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=15.0.7 + constrains: + - openblas >=0.3.24,<0.3.25.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2849225 + timestamp: 1693784744674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2025.0.0-hdc3f47d_1.conda + sha256: 49c22b9122d4486f0443df60aeb0abb5b9ea599e985d832a4df85d30626c49a4 + md5: ff14d34bee58e2b5f75606334974d87b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2021.13.0 + arch: x86_64 + platform: linux + size: 5639813 + timestamp: 1738909524141 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2025.0.0-h4d9b6c2_1.conda + sha256: f2b01232826000e0d92130f86458ce89c91bd809a408d4db31193d35e243f4be + md5: fc72b0f92faeb3fa78c10e78d9bf4838 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - tbb >=2021.13.0 + arch: x86_64 + platform: linux + size: 112220 + timestamp: 1738909545158 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2025.0.0-h4d9b6c2_1.conda + sha256: 8b431c4ddbce91bb1cb90af276177eaa43bf63153ffe34eb77c7049013752447 + md5: 738958195251706a5a0a6de99031ec22 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - tbb >=2021.13.0 + arch: x86_64 + platform: linux + size: 238442 + timestamp: 1738909557573 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2025.0.0-h981d57b_1.conda + sha256: f0131b50df323c81f6310ce822e708b2498b967b74824da2f900892ef0ae3f67 + md5: 41ea2673be5ab0289ef4b577f8a85ad9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - pugixml >=1.15,<1.16.0a0 + arch: x86_64 + platform: linux + size: 195779 + timestamp: 1738909570181 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2025.0.0-hdc3f47d_1.conda + sha256: bb84bcbf3e7db8e872fdbfb1016a1cf221b3f51ebaaa2605baeba70aca893255 + md5: 1fdc53d6075e6849ad692eb8100ace05 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2021.13.0 + arch: x86_64 + platform: linux + size: 12364806 + timestamp: 1738909583182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2025.0.0-hdc3f47d_1.conda + sha256: e3c1a36a413dfefff62210e2a65f0a50aa9ed29451f604b5ec984321e7974858 + md5: e0a14de49ba878949901305fb671022c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - ocl-icd >=2.3.2,<3.0a0 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2021.13.0 + arch: x86_64 + platform: linux + size: 10030542 + timestamp: 1738909622462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2025.0.0-hdc3f47d_1.conda + sha256: 62286505dd251573024c94dd7300e2d10452019c8e70962adfe55530995cd3c4 + md5: 33d33d9b6494ab96a0b026c549f78bee + depends: + - __glibc >=2.17,<3.0.a0 + - level-zero >=1.20.3,<2.0a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2021.13.0 + arch: x86_64 + platform: linux + size: 1087865 + timestamp: 1738909654683 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2025.0.0-h981d57b_1.conda + sha256: a05b798429eb6496f7317913ce793ebdc117ccce2fdf3c6e556d2a275ad862e7 + md5: b00858b2c5328dc5353be09742ea54d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + - pugixml >=1.15,<1.16.0a0 + arch: x86_64 + platform: linux + size: 206167 + timestamp: 1738909668116 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2025.0.0-h6363af5_1.conda + sha256: 89efe46f944bd58002d95784f70cb0b37a3d078dafc6eaee6b1597b2662af920 + md5: 6eb4c9e84623c749f8f1c210d1de11ae + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + size: 1652945 + timestamp: 1738909681015 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2025.0.0-h6363af5_1.conda + sha256: 1358bac09d08abe76f7f9915c3ef7b524e669b49d208b2f563b02eef07ce195e + md5: 444a64a0bbf0b83a595f3dc18dee9417 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + size: 678731 + timestamp: 1738909695599 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2025.0.0-h5888daf_1.conda + sha256: b26726a52836441f18f40d6eeb16f7a697a40c53fbfbc3fd59b873b54e3b1c64 + md5: cfd1ea36718a47d10d2dbad9c2792f75 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + arch: x86_64 + platform: linux + size: 1100691 + timestamp: 1738909709817 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2025.0.0-h630ec5c_1.conda + sha256: 5cf431ab5e4eb3412757faad4698032c8427ea6ae80fdb22cf050f11890cb907 + md5: c3f2c6e29fdf509e57acd7ecd4dc95db + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - snappy >=1.2.1,<1.3.0a0 + arch: x86_64 + platform: linux + size: 1294838 + timestamp: 1738909723984 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2025.0.0-h5888daf_1.conda + sha256: 355a0d5a14b6451a103531adba066ada50be21bd0d7ba53761fe578f25cab5dd + md5: af2ac1ba29a7c00a0e5fbb03f7a13ae5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopenvino 2025.0.0 hdc3f47d_1 + - libstdcxx >=13 + arch: x86_64 + platform: linux + size: 481998 + timestamp: 1738909737796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + md5: 15345e56d527b330e1cacbdf58676e8f + depends: + - libgcc-ng >=9.3.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 260658 + timestamp: 1606823578035 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + sha256: c0a30ac74eba66ea76a4f0a39acc7833f5ed783a632ca3bb6665b2d81aabd2fb + md5: 48f4330bfcd959c3cfb704d424903c82 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 28361 + timestamp: 1707101388552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda + sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f + md5: 3550e05e3af94a3fa9cef2694417ccdf + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + size: 259332 + timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda + sha256: 475013475a3209c24a82f9e80c545d56ccca2fa04df85952852f3d73caa38ff9 + md5: b9846db0abffb09847e2cb0fec4b4db6 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.2,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - gdk-pixbuf >=2.42.12,<3.0a0 + - harfbuzz >=10.1.0,<11.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libxml2 >=2.13.5,<3.0a0 + - pango >=1.54.0,<2.0a0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 6342757 + timestamp: 1734902068235 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-h8e10757_10.conda + sha256: dc399e0f04a09f8c1807c3b36e578eb81f81891c0ddf21de9c1fb9f048ce4031 + md5: 4f43dbcfacd3cc9a183dd3a48b94d3c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 823649 + timestamp: 1735627841126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-he13a0af_10.conda + sha256: 3347a8840d085ce1661928e736229f068d56c84312fbed90886e059023d85611 + md5: 1f67e5e30edd56e0a0bf6df6bb711a9d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 754657 + timestamp: 1735628030895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 915956 + timestamp: 1739953155793 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda + sha256: 266639fb10ca92287961574b0b4d6031fa40dd9d723d64a0fcb08513a24dab03 + md5: c83357a21092bd952933c36c5cb4f4d6 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 898767 + timestamp: 1739953312379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda + sha256: 8f5bd92e4a24e1d35ba015c5252e8f818898478cb3bc50bd8b12ab54707dc4da + md5: a78c856b6dc6bf4ea8daeb9beaaa3fb0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 14.2.0 h767d61c_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3884556 + timestamp: 1740240685253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda + sha256: e86f38b007cf97cc2c67cd519f2de12a313c4ee3f5ef11652ad08932a5e34189 + md5: c75da67f045c2627f59e6fcb5f4e3a9b + depends: + - libstdcxx 14.2.0 h8f9b012_2 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53830 + timestamp: 1740240722530 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.3-h3dc2cb9_0.conda + sha256: dd566e2ef4a83b27d2b26d988cbbed50456294892744639f30f19954d2ee3287 + md5: df057752e83bd254f6d65646eb67cd2e + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.71,<2.72.0a0 + - libgcc >=13 + - libgcrypt-lib >=1.11.0,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 487271 + timestamp: 1739569869860 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.3-h9a4d06a_0.conda + sha256: 35bdafc4b02f61a327f82bb11263c31466367e50b4e5efab3d413509315cb0a7 + md5: e7817c912b25f7599a50eba270e1a463 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.71,<2.72.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 142897 + timestamp: 1739569881116 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2 + sha256: f2ac872920833960e514ce9efd8f7c08ce66dd870738d73839d1bce1ac497de6 + md5: a730b2badd586580c5752cc73842e068 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 75491 + timestamp: 1638450786937 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.9-h84d6215_0.conda + sha256: bfa34a5a929d792dfcfbbe2d9ee21bd870d73d646512e21c871dab0b80194468 + md5: ecd409e7bfcf4ee73f74d7a2cc91a4c3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 121336 + timestamp: 1738604403935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.27-h520f47e_100.conda + sha256: c641cdf5c398441df9863291c20574c37b1e4a6113b18a41c6a43ccc1df1b92c + md5: 82e46dc001ab1ef291554ead981b0cde + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libudev1 >=255 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 86196 + timestamp: 1706828413450 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda + sha256: 0bd81019e02cce8d9d4077c96b82ca03c9b0ece67831c7437f977ca1f5a924a3 + md5: 139262125a3eac8ff6eef898598745a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libdrm >=2.4.123,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libglx >=1.7.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - wayland >=1.23.1,<2.0a0 + - wayland-protocols + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxfixes + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 217708 + timestamp: 1726828458441 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + sha256: 53080d72388a57b3c31ad5805c93a7328e46ff22fab7c44ad2a86d712740af33 + md5: 309dec04b70a3cc0f1e84a4013683bc0 + depends: + - libgcc-ng >=9.3.0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=9.3.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 286280 + timestamp: 1610609811627 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda + sha256: e7d2daf409c807be48310fcc8924e481b62988143f582eb3a58c5523a6763b13 + md5: cde393f461e0c169d9ffb2fc70f81c33 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 1022466 + timestamp: 1717859935011 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.0-hc4a0caf_0.conda + sha256: 583203155abcfb03938d8473afbf129156b5b30301a0f796c8ecca8c5b7b2ed2 + md5: f1656760dbf05f47f962bfdc59fc3416 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.5,<3.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + arch: x86_64 + platform: linux + license: MIT/X11 Derivative + license_family: MIT + size: 642349 + timestamp: 1738735301999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 690296 + timestamp: 1739952967309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda + sha256: 7c67d383a8b1f3e7bf9e046e785325c481f6868194edcfb9d78d261da4ad65d4 + md5: 589c9a3575a050b583241c3d688ad9aa + depends: + - libzlib >=1.2.13,<2.0.0a0 + constrains: + - openmp 15.0.7|15.0.7.* + arch: x86_64 + platform: linux + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 3268766 + timestamp: 1673584331056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda + sha256: 6cc4cf021fc1f06df3b97598bf9583fe7a04fad6a4eef9882558f7932f362bc0 + md5: 358164e15a9320f11b84a53fb8d8e446 + constrains: + - openmp 15.0.7|15.0.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 263326 + timestamp: 1673584823527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda + noarch: python + sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd + md5: 01fe5e0cf46c84a6345e323ad1316764 + depends: + - max-core ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022718 release + - mojo-jupyter ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 9905 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda + sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a + md5: fc5a9ae36c7805979bd58ca55a25066f + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 249811868 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda + sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 + md5: dd8734453f7276a258f3351cc5c506c3 + depends: + - mblack ==25.2.0.dev2025022718 release + license: LicenseRef-Modular-Proprietary + size: 217273450 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 + md5: f828ace91aa057e4774e84ad459adccf + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 123584411 + timestamp: 1740680254354 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 + md5: b16d498a148aa61dca2a6bfec5cb8e46 + depends: + - max-core ==25.2.0.dev2025022718 release + - click >=8.0.0 + - numpy >=1.18,<2.0 + - sentencepiece >=0.2.0 + - tqdm >=4.67.1 + constrains: + - aiohttp >=3.11.12 + - fastapi >=0.114.2 + - gguf >=0.14.0 + - hf-transfer >=0.1.9 + - httpx >=0.28.1 + - huggingface_hub >=0.24.0 + - nvitop >=1.4.1 + - opentelemetry-api >=1.29.0 + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-sdk >=1.29.0,<2.0 + - pillow >=10.3.0 + - prometheus_client >=0.21.0 + - prometheus-async >=22.2.0 + - psutil >=6.1.1 + - pydantic + - pydantic-settings >=2.7.1 + - pyinstrument >=5.0.1 + - python-json-logger >=2.0.7 + - requests >=2.32.3 + - rich >=13.9.4 + - safetensors >=0.5.2 + - sentinel >=0.3.0 + - sse-starlette >=2.1.2 + - tokenizers >=0.19.0 + - pytorch >=2.2.2,<=2.5.1 + - transformers >=4.40.1 + - uvicorn >=0.34.0 + - uvloop >=0.21.0 + - xgrammar ==0.1.11 + license: LicenseRef-Modular-Proprietary + size: 112658409 + timestamp: 1740681819160 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + noarch: python + sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 + md5: 719ca7123d53415adcdd7f0cb8396c51 + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - typing_extensions >=v4.12.2 + - python + license: MIT + size: 130852 + timestamp: 1740680254353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 + md5: b9c8f925797a93dbff45e1626b025a6b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=14.0.3 + - tbb 2021.* + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 209326825 + timestamp: 1652946040193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 + sha256: 93d957608b17ada3039ff0acad2b8596451caa6829b3502fe87375e639ffc34e + md5: 69ba49e445f87aea2cba343a71a35ca2 + depends: + - mkl 2022.1.0 h84fe81f_915 + - mkl-include 2022.1.0 h84fe81f_915 + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 25614 + timestamp: 1652946458276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 + sha256: 63415fe64e99f8323d0191d45ea5b1ec3973317e728b9071267ffb7ff3b38364 + md5: 2dcd1acca05c11410d4494d7fc7dfa2a + arch: x86_64 + platform: linux + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 762563 + timestamp: 1652946186347 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + noarch: python + sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 + md5: 6b8d00b15817db11e026f824f7f0ba14 + depends: + - max-core ==25.2.0.dev2025022718 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22981 + timestamp: 1740680254354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 + md5: aa14b9a5196a6d8dd364164b7ce56acf + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + - mpfr >=4.2.1,<5.0a0 + arch: x86_64 + platform: linux + license: LGPL-3.0-or-later + license_family: LGPL + size: 116777 + timestamp: 1725629179524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-or-later + license_family: LGPL + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 + md5: 2eeb50cab6652538eee8fc0bc3340c81 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: LGPL-3.0-only + license_family: LGPL + size: 634751 + timestamp: 1725746740014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + arch: arm64 + platform: osx + license: LGPL-3.0-only + license_family: LGPL + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: LGPL + size: 491140 + timestamp: 1730581373280 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 + md5: fd40bf7f7f4bc4b647dc8512053d9873 + depends: + - python >=3.10 + - python + constrains: + - numpy >=1.24 + - scipy >=1.10,!=1.11.0,!=1.11.1 + - matplotlib >=3.7 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + size: 1265008 + timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hb9d3cd8_2.conda + sha256: 96ddd13054032fabd54636f634d50bc74d10d8578bc946405c429b2d895db6f2 + md5: 2e8d2b469559d6b2cb6fd4b34f9c8d7f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 94934 + timestamp: 1732915114536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2024.10.24-h5888daf_0.conda + sha256: 7e1d3ad55d4ad3ddf826e205d4603b9ed40c5e655a9dfd66b56f459d7ba14db3 + md5: 3ba02cce423fdac1a8582bd6bb189359 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 54060 + timestamp: 1732912937444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda + sha256: 3f231f2747a37a58471c82a9a8a80d92b7fece9f3fce10901a5ac888ce00b747 + md5: b28cf020fd2dead0ca6d113608683842 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 731471 + timestamp: 1739400677213 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2939306 + timestamp: 1739301879343 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.1-h81ee809_0.conda + sha256: 4f8e2389e1b711b44182a075516d02c80fa7a3a7e25a71ff1b5ace9eae57a17a + md5: 75f9f0c7b1740017e2db83a53ab9a28e + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2934522 + timestamp: 1739301896733 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.1-h861ebed_0.conda + sha256: 20e5e280859a7803e8b5a09f18a7e43b56d1b8e61e4888c1a24cbb0d5b9cabd3 + md5: 59e660508a4de9401543303d5f576aeb + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.2,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=10.2.0,<11.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.45,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 451406 + timestamp: 1737510786003 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d + md5: df359c09c41cd186fffb93a2d87aa6f5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 952308 + timestamp: 1723488734144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 + md5: d3894405f05b2c0f351d5de3ae26fa9c + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 42749785 + timestamp: 1735929845390 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee + md5: 94d6ba8cd468668a9fb04193b0f4b36e + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + size: 42852329 + timestamp: 1735930118976 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + sha256: 747c58db800d5583fee78e76240bf89cbaeedf7ab1ef339c2990602332b9c4be + md5: 5e2a7acfa2c24188af39e7944e1b3604 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 381072 + timestamp: 1733698987122 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda + sha256: 23c98a5000356e173568dc5c5770b53393879f946f3ace716bbdefac2a8b23d2 + md5: b11a4c6bf6f6f44e5e143f759ffa2087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 118488 + timestamp: 1736601364156 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda + sha256: b27c0c8671bd95c205a61aeeac807c095b60bc76eb5021863f919036d7a964fc + md5: 07f45f1be1c25345faddb8db0de8039b + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=12 + - libglib >=2.78.3,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=255 + constrains: + - pulseaudio 17.0 *_0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + size: 757633 + timestamp: 1705690081905 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.4,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31581682 + timestamp: 1739521496324 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_0_cpython.conda + sha256: cbf81a78d3ca6e663e827523e6ddbc28369cac488da047a28f83875eb52fe5f6 + md5: 1d105a6c46a753e3c0bab54a1ad24063 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.4,<6.0a0 + - libsqlite >=3.48.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12947786 + timestamp: 1739520092196 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-2.4.0-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2 + sha256: 6e08b3195666379cecc64a4c11a2c9e40f7b77ee4ff83673d49d5290b75269c1 + md5: 9731ae9086ed66acc02e8e4aba5d9990 + depends: + - blas * mkl + - filelock + - jinja2 + - llvm-openmp <16 + - mkl >=2018 + - networkx + - python >=3.12,<3.13.0a0 + - pytorch-cuda >=12.4,<12.5 + - pytorch-mutex 1.0 cuda + - pyyaml + - sympy + - torchtriton 3.0.0 + - typing_extensions + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD 3-Clause + license_family: BSD + size: 1441602064 + timestamp: 1720546288249 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/pytorch-2.4.0-py3.12_0.tar.bz2 + sha256: 085c312a4b2b8fb86d4ec3ea427d3c5bcd708f398f4bdc053a2a1123614893c1 + md5: 6618b115b8b33e9b41b840e1ffa0ca76 + depends: + - filelock + - jinja2 + - llvm-openmp <16 + - networkx + - python >=3.12,<3.13.0a0 + - pyyaml + - sympy + - typing_extensions + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD 3-Clause + license_family: BSD + size: 60396276 + timestamp: 1720541827975 +- conda: https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_7.tar.bz2 + sha256: 4ce6352f6270673aaf335909da2bbdd70ad8aaae489319e1e3a5ac0aae720314 + md5: 06635b1bbf5e2fef4a8b9b282500cd7b + depends: + - cuda-cudart >=12.4,<12.5 + - cuda-cupti >=12.4,<12.5 + - cuda-libraries >=12.4,<12.5 + - cuda-nvrtc >=12.4,<12.5 + - cuda-nvtx >=12.4,<12.5 + - cuda-runtime >=12.4,<12.5 + - libcublas >=12.4.5.8,<12.5.2.13 + - libcufft >=11.2.1.3,<11.2.3.18 + - libcusolver >=11.6.1.9,<11.6.2.40 + - libcusparse >=12.3.1.170,<12.4.1.18 + - libnpp >=12.2.5.30,<12.3.0.116 + - libnvjitlink >=12.4.127,<12.5.40 + - libnvjpeg >=12.3.1.117,<12.3.2.38 + arch: x86_64 + platform: linux + size: 7189 + timestamp: 1724179791784 +- conda: https://conda.anaconda.org/pytorch/noarch/pytorch-mutex-1.0-cuda.tar.bz2 + build_number: 100 + sha256: c16316183f51b74ca5eee4dcb8631052f328c0bbf244176734a0b7d390b81ee3 + md5: a948316e36fb5b11223b3fcfa93f8358 + size: 2906 + timestamp: 1628062930777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 382698 + timestamp: 1738271121975 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py312hf4875e0_0.conda + sha256: 70d398b334668dc597d33e27847ede1b0829a639b9c91ee845355e52c86c2293 + md5: bfbefdb140b546a80827ff7c9d5ac7b8 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 364649 + timestamp: 1738271263898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.50-h9b8e6db_1.conda + sha256: c253ddeafdc46bb53cdac722d1305a94bbbd9905e6a112e295ce7bb9e7a2f7e7 + md5: 0d27110a2f613abc268e31b3c1d5fb4f + depends: + - __glibc >=2.17,<3.0.a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - sdl3 >=3.2.4,<4.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 513266 + timestamp: 1740516135153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.4-h3083f51_0.conda + sha256: d19f33b8c73cf461698b3f6d81aa354aed68d50f8d64f72c0cccc507d183803c + md5: c0d92f268209e0a0fd27954a5667c11d + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.13.6,<2.0a0 + - jack >=1.9.22,<1.10.0a0 + - libdrm >=2.4.124,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - libudev1 >=256.7 + - libunwind >=1.6.2,<1.7.0a0 + - liburing >=2.9,<2.10.0a0 + - libusb >=1.0.27,<2.0a0 + - libxkbcommon >=1.8.0,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - wayland >=1.23.1,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 + arch: x86_64 + platform: linux + license: Zlib + size: 1728090 + timestamp: 1739801388543 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_10.conda + sha256: a1bde55ceb9dc5bd7879283d0f594a6ce65c07fda3de76230c65a4a5df47858a + md5: 480e915dfc6c592615ef6f217e615aa6 + depends: + - libsentencepiece 0.2.0 h8e10757_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312hb6b8a2b_10 + - sentencepiece-spm 0.2.0 h8e10757_10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19470 + timestamp: 1735628377167 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_10.conda + sha256: 526c934b897131bd274697649c3b1c492a7d66c03368885a954112468b3c1424 + md5: 346abe448f69949a65473b336856860a + depends: + - libsentencepiece 0.2.0 he13a0af_10 + - python_abi 3.12.* *_cp312 + - sentencepiece-python 0.2.0 py312h155166a_10 + - sentencepiece-spm 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 19759 + timestamp: 1735628533490 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb6b8a2b_10.conda + sha256: 37df7fb659564587b950b39c936769d9b5095afb7bc223f42d6248a5540c6567 + md5: 7908b7b977e2e123a5f6a29906f2ce44 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2411182 + timestamp: 1735628106455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h155166a_10.conda + sha256: 2d59614aeafbf54cc718805798c11c2d0a3b4b8d947d1bd81c87c484b4883077 + md5: 6e11367ef670296fce01fc9860be944d + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2433303 + timestamp: 1735628083958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-h8e10757_10.conda + sha256: 6b55e1121545357d63c3aa0766931720e8aafc52d88641ba7631c8cbaa68c52f + md5: e977b7be5ac26c55825e121e00b90493 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 h8e10757_10 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 89076 + timestamp: 1735628334078 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-he13a0af_10.conda + sha256: b760aeee02e2afbfcce3f559e8a227aa4c94139157b1702fdfb41a057dad0e52 + md5: 9b7300f23cd330da8664cd072c162e5f + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsentencepiece 0.2.0 he13a0af_10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 83826 + timestamp: 1735628514667 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.0-h5888daf_0.conda + sha256: 01ae1e86f79e05b9e687ef3b963e7f4f8a7554ac9f5af4dc1e3dc11ed79548b2 + md5: d86fc7eb811593abc06b328d3d72c001 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 2746763 + timestamp: 1740096577511 +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=0.19 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 4523617 + timestamp: 1736248315124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/pytorch/linux-64/torchtriton-3.0.0-py312.tar.bz2 + build_number: 1 + sha256: 5b6fe1e0a065ad16342daa82faff86700a4b413f7b07090b106c61ae74ce508f + md5: e53c6345daef28009cd51187a5c5af73 + depends: + - filelock + - python >=3.12,<3.13.0a0 + - pytorch + arch: x86_64 + platform: linux + license: MIT + size: 244858431 + timestamp: 1721333095180 +- conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.19.0-py312_cu124.tar.bz2 + build_number: 0 + sha256: 100fa1adae081158dcac29149dce22942b71761f378aaa00a99a2d3ac3d9f971 + md5: 73e63c252ebd5db1cea947085d6f8e75 + depends: + - ffmpeg >=4.2 + - libjpeg-turbo + - libpng + - numpy >=1.23.5 + - pillow >=5.3.0,!=8.3.* + - python >=3.12,<3.13.0a0 + - pytorch 2.4.0 + - pytorch-cuda 12.4.* + - pytorch-mutex 1.0 cuda + - requests + constrains: + - cpuonly <0 + arch: x86_64 + platform: linux + license: BSD + size: 8820903 + timestamp: 1720563863032 +- conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.19.0-py312_cpu.tar.bz2 + sha256: c08a2f63ab3a0c5d0b508a23e1c54193b8568fc471e0797ac15b69ee624880ae + md5: 555b0caf9b1cfdf1dd524974ac0ada21 + depends: + - libjpeg-turbo + - libpng + - numpy >=1.23.5 + - pillow >=5.3.0,!=8.3.* + - python >=3.12,<3.13.0a0 + - pytorch 2.4.0 + - requests + constrains: + - cpuonly + arch: arm64 + platform: osx + license: BSD + size: 7117982 + timestamp: 1720563247605 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + sha256: 0884b2023a32d2620192cf2e2fc6784b8d1e31cf9f137e49e00802d4daf7d1c1 + md5: 0a732427643ae5e0486a727927791da1 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=13 + - libstdcxx-ng >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 321561 + timestamp: 1724530461598 +- conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.41-hd8ed1ab_0.conda + sha256: caabd9f067a3a7075925b50246a0d4e832062fa1f7a4f9f89392c1ae82a26163 + md5: 790080ec41dc3f081663da8e99cd233e + license: MIT + license_family: MIT + size: 130039 + timestamp: 1739890398910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + sha256: 175315eb3d6ea1f64a6ce470be00fa2ee59980108f246d3072ab8b977cb048a5 + md5: 6c99772d483f566d59e25037fea2c4b1 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 897548 + timestamp: 1660323080555 +- conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + sha256: 76c7405bcf2af639971150f342550484efac18219c0203c5ee2e38b8956fe2a0 + md5: e7f6ed84d4623d52ee581325c1587a6b + depends: + - libgcc-ng >=10.3.0 + - libstdcxx-ng >=10.3.0 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + size: 3357188 + timestamp: 1646609687141 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + sha256: 0d89b5873515a1f05d311f37ea4e087bbccc0418afa38f2f6189e97280db3179 + md5: f725c7425d6d7c15e31f3b99a88ea02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 389475 + timestamp: 1727840188958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda + sha256: 760f43df6c2ce8cbbbcb8f2f3b7fc0f306716c011e28d1d340f3dfa8ccf29185 + md5: 4c3e9fab69804ec6077697922d70c6e2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 27198 + timestamp: 1734229639785 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda + sha256: a0e7fca9e341dc2455b20cd320fc1655e011f7f5f28367ecf8617cccd4bb2821 + md5: b6eb6d0cb323179af168df8fe16fb0a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 835157 + timestamp: 1738613163812 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 50060 + timestamp: 1727752228921 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19575 + timestamp: 1727794961233 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + sha256: 58e8fc1687534124832d22e102f098b5401173212ac69eb9fd96b16a3e2c8cb2 + md5: 303f7a0e9e0cd7d250bb6b952cecda90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14412 + timestamp: 1727899730073 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 405089 + timestamp: 1714723101397 From 1e5f87773b5b83c2ecfef8427c4fda0ba71a36ed Mon Sep 17 00:00:00 2001 From: Patrick Dougherty Date: Thu, 27 Feb 2025 17:02:55 -0600 Subject: [PATCH 23/44] [CI] Validating post merge (#4037) --- .github/workflows/test_pre_commit.yml | 2 +- .pre-commit-config.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_pre_commit.yml b/.github/workflows/test_pre_commit.yml index 99a2ddf73d..8e65864e5a 100644 --- a/.github/workflows/test_pre_commit.yml +++ b/.github/workflows/test_pre_commit.yml @@ -48,5 +48,5 @@ jobs: pre-commit install - name: Run pre-commit - run: magic run pre-commit run --all-files + run: magic run --manifest-path mojo pre-commit run --all-files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b04addfbb6..59ab737652 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,9 +3,9 @@ repos: hooks: - id: mojo-format name: mojo-format - entry: mojo format mojo + entry: mojo format language: system - files: '\.(mojo|🔥|py)$' + files: '^(mojo|examples/mojo).*\.(mojo|🔥|py)$' stages: [commit] - id: check-docstrings name: check-docstrings @@ -17,7 +17,7 @@ repos: name: check-license entry: mojo mojo/stdlib/scripts/check_licenses.mojo language: system - files: '\.(mojo|🔥|py)$' + files: '^(mojo|examples/mojo).*\.(mojo|🔥|py)$' stages: [commit] - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.40.0 From 093b209f4a47202e49af7bbc4f640ad33553928e Mon Sep 17 00:00:00 2001 From: weiwei chen Date: Thu, 27 Feb 2025 13:11:20 -0500 Subject: [PATCH 24/44] [stdlib] Enable interpreter mode for `memcpy`. - [x] Enable simplified interpreter mode for memcpy (for fast interpreting). - [x] Add test. MODULAR_ORIG_COMMIT_REV_ID: 534b00b142ebca0b294d2bf8466f3ad37b47d7b9 --- .github/workflows/test_pre_commit.yml | 2 +- .pre-commit-config.yaml | 6 +++--- mojo/stdlib/src/memory/memory.mojo | 20 +++++++++++++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test_pre_commit.yml b/.github/workflows/test_pre_commit.yml index 8e65864e5a..99a2ddf73d 100644 --- a/.github/workflows/test_pre_commit.yml +++ b/.github/workflows/test_pre_commit.yml @@ -48,5 +48,5 @@ jobs: pre-commit install - name: Run pre-commit - run: magic run --manifest-path mojo pre-commit run --all-files + run: magic run pre-commit run --all-files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 59ab737652..b04addfbb6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,9 +3,9 @@ repos: hooks: - id: mojo-format name: mojo-format - entry: mojo format + entry: mojo format mojo language: system - files: '^(mojo|examples/mojo).*\.(mojo|🔥|py)$' + files: '\.(mojo|🔥|py)$' stages: [commit] - id: check-docstrings name: check-docstrings @@ -17,7 +17,7 @@ repos: name: check-license entry: mojo mojo/stdlib/scripts/check_licenses.mojo language: system - files: '^(mojo|examples/mojo).*\.(mojo|🔥|py)$' + files: '\.(mojo|🔥|py)$' stages: [commit] - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.40.0 diff --git a/mojo/stdlib/src/memory/memory.mojo b/mojo/stdlib/src/memory/memory.mojo index eada6c0467..2d2d845f88 100644 --- a/mojo/stdlib/src/memory/memory.mojo +++ b/mojo/stdlib/src/memory/memory.mojo @@ -253,11 +253,21 @@ fn memcpy[ count: The number of elements to copy. """ var n = count * sizeof[dest.type]() - _memcpy_impl( - dest.bitcast[Byte]().origin_cast[origin=MutableAnyOrigin](), - src.bitcast[Byte]().origin_cast[origin=MutableAnyOrigin](), - n, - ) + + if __mlir_op.`kgen.is_compile_time`(): + # A fast version for the interpreter to evaluate + # this function during compile time. + llvm_intrinsic["llvm.memcpy", NoneType]( + dest.bitcast[Byte]().origin_cast[origin=MutableAnyOrigin](), + src.bitcast[Byte]().origin_cast[origin=MutableAnyOrigin](), + n, + ) + else: + _memcpy_impl( + dest.bitcast[Byte]().origin_cast[origin=MutableAnyOrigin](), + src.bitcast[Byte]().origin_cast[origin=MutableAnyOrigin](), + n, + ) # ===-----------------------------------------------------------------------===# From ea31522342dde055693c7231935cfa6e426350f4 Mon Sep 17 00:00:00 2001 From: Patrick Dougherty Date: Thu, 27 Feb 2025 12:19:53 -0600 Subject: [PATCH 25/44] [CI] Add missed license MODULAR_ORIG_COMMIT_REV_ID: 0761f1c3c4629379ce11e037d05c0047b8104986 --- .pre-commit-config.yaml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b04addfbb6..5e3e2ec6e2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,16 @@ +##===----------------------------------------------------------------------===## +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +##===----------------------------------------------------------------------===## + repos: - repo: local hooks: @@ -22,5 +35,5 @@ repos: - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.40.0 hooks: - - id: markdownlint - args: ['--config', 'mojo/stdlib/scripts/.markdownlint.yaml', '--fix'] + - id: markdownlint + args: ["--config", "mojo/stdlib/scripts/.markdownlint.yaml", "--fix"] From ee76f6c69062256f2f4b364aeee1f3c1c6b65a4a Mon Sep 17 00:00:00 2001 From: Katherine Wu <31663267+k-w-w@users.noreply.github.com> Date: Thu, 27 Feb 2025 11:41:11 -0800 Subject: [PATCH 26/44] [Graph] Add weight sharding strategy for Multi-GPU (#56810) The PR adds sharding strategy to `Weight`, and allow weights to be sharded with `Weight.shard(shard_idx, device)`. Also deletes `LayerV2.to`, we can add it back later but for now the API isn't fully thought out. This functionally adds sharding to the Weights, although some aspects may have unexpected behavior (like getting the `shape` of a sharded weight actually returns the `shape` of the original weight). Also, `LayerV2` needs to adapt to handling sharded weights. MODULAR_ORIG_COMMIT_REV_ID: 191c2f8dc605d2ea0765ac7a693e3f44cf968591 --- src/max/pipelines/nn/layer/layer.py | 37 ++--------------------------- 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/src/max/pipelines/nn/layer/layer.py b/src/max/pipelines/nn/layer/layer.py index 3b76c479b6..31443d97e1 100644 --- a/src/max/pipelines/nn/layer/layer.py +++ b/src/max/pipelines/nn/layer/layer.py @@ -17,7 +17,6 @@ import threading from abc import ABC, abstractmethod from collections import deque -from dataclasses import dataclass from functools import wraps from inspect import signature from typing import ( @@ -34,7 +33,7 @@ import numpy as np from max.driver import DLPackArray, Tensor from max.dtype import DType -from max.graph import DeviceRef, ShapeLike, TensorValue, Weight +from max.graph import ShapeLike, Weight from max.graph.quantization import QuantizationEncoding from max.graph.weights import WeightData @@ -43,14 +42,6 @@ DLPackCompatible = Union[DLPackArray, np.ndarray] -@dataclass -class ShardingStrategy: - """Defines how to load and shard a weight onto multiple devices.""" - - host_device: DeviceRef - shard_value: Callable[[Weight], tuple[TensorValue, ...]] - - class Layer: """Base Layer class. @@ -79,7 +70,7 @@ def __call__(self, *args, **kwargs): class LayerV2(Layer, ABC): - """(new) Base class for model layers with weight and device management. + """(new) Base class for model layers with weight management. This will be merged with the above class once all layers have been moved to V2. @@ -95,20 +86,10 @@ def __init__(self): self._weight_values: dict[str, DLPackCompatible] = {} self._shared_weights: dict[str, Weight] = {} - # Update device list and sharding strategy to a singular object - # similar to a partition spec. - self._devices: tuple[DeviceRef, ...] = () - self._sharding_strategy: ShardingStrategy | None = None - def __setattr__(self, name, value): try: if isinstance(value, LayerV2): self._sublayers[name] = value - if self._devices or self._sharding_strategy: - value.to( - *self._devices, - sharding_strategy=self._sharding_strategy, - ) elif isinstance(value, Weight): self._layer_weights[value.name] = value except AttributeError: @@ -122,20 +103,6 @@ def __repr__(self): # TODO: Make this pretty return f"{type(self).__name__}({len(self.sublayers)} layers, {len(self.layer_weights)} weights)" - def to( - self, - *devices: DeviceRef, - sharding_strategy: ShardingStrategy | None = None, - ) -> None: - if len(self._devices) > 1 and not sharding_strategy: - raise ValueError( - "Must provide a sharding strategy if multiple devices are provided." - ) - - for _, layer in recursive_named_layers(self): - layer._devices = devices - layer._sharding_strategy = sharding_strategy - @property def layer_weights(self) -> dict[str, Weight]: return self._layer_weights From 89d6288e989b70e56c76c730b60b57dfeec2d153 Mon Sep 17 00:00:00 2001 From: kcaverly Date: Thu, 27 Feb 2025 15:41:47 -0500 Subject: [PATCH 27/44] [Pipelines] Add draft_model to PipelineConfig for Speculative Decoding MODULAR_ORIG_COMMIT_REV_ID: d387534a36e5bc9a7299fef2650dee9184fab56e --- src/max/pipelines/config.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/max/pipelines/config.py b/src/max/pipelines/config.py index b71b604777..005915d889 100644 --- a/src/max/pipelines/config.py +++ b/src/max/pipelines/config.py @@ -688,6 +688,9 @@ class PipelineConfig: "USE_EXPERIMENTAL_KERNELS", "false" ) + draft_model: Optional[str] = None + """Draft model for use during Speculative Decoding.""" + def __post_init__(self) -> None: # Validate if a provided max_length is non-negative. if self.max_length is not None and self.max_length < 0: @@ -802,6 +805,13 @@ def __post_init__(self) -> None: ): raise ValueError("gpu_profiling must be a boolean or 'detailed'") + if self.draft_model: + if not _repo_exists_with_retry(self.draft_model): + raise ValueError( + "draft_model provided does not exist on HuggingFace." + "Only public HuggingFace draft models currently supported." + ) + def __getstate__(self) -> dict[str, Any]: """Override `__getstate__` to exclude the Hugging Face config.""" state = self.__dict__.copy() @@ -1058,6 +1068,7 @@ def help() -> dict[str, str]: "force_download": "Specify whether to forcefully download a file even if it already exists in local cache. Set this to true if you want to ensure you have the latest version.", "enable_echo": "Whether the model should be built with echo capabilities. This defaults to false.", "gpu_profiling": "Whether to enable GPU profiling of the model. This defaults to false.", + "draft_model": "Draft model for use in speculative decoding.", } def huggingface_weights_repo(self) -> HuggingFaceRepo: From 3794d427bc7bea34d7a0a4c9cf609e005620d7f9 Mon Sep 17 00:00:00 2001 From: kcaverly Date: Thu, 27 Feb 2025 15:43:35 -0500 Subject: [PATCH 28/44] [Pipelines] Load Scaffolded SpeculativeDecodingTextGenerationPipeline via PIPELINE_REGISTRY MODULAR_ORIG_COMMIT_REV_ID: a786273ce5c0890ba2ed15bc6717afee46199966 --- src/max/pipelines/__init__.py | 2 + src/max/pipelines/registry.py | 51 +++++++++++++++++++-- src/max/pipelines/speculative_decoding.py | 56 +++++++++++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/max/pipelines/speculative_decoding.py diff --git a/src/max/pipelines/__init__.py b/src/max/pipelines/__init__.py index 33c02c405a..7e673e191f 100644 --- a/src/max/pipelines/__init__.py +++ b/src/max/pipelines/__init__.py @@ -50,6 +50,7 @@ upper_bounded_default, ) from .registry import PIPELINE_REGISTRY, SupportedArchitecture +from .speculative_decoding import SpeculativeDecodingTextGenerationPipeline from .tokenizer import ( IdentityPipelineTokenizer, PreTrainedPipelineTokenizer, @@ -96,5 +97,6 @@ "EmbeddingsGenerator", "EmbeddingsPipeline", "EmbeddingsResponse", + "SpeculativeDecodingTextGenerationPipeline", "upper_bounded_default", ] diff --git a/src/max/pipelines/registry.py b/src/max/pipelines/registry.py index 2e180772f2..1f8149e0fa 100644 --- a/src/max/pipelines/registry.py +++ b/src/max/pipelines/registry.py @@ -42,6 +42,7 @@ ) from .kv_cache import KVCacheStrategy from .pipeline import KVCacheMixin, PipelineModel, TextGenerationPipeline +from .speculative_decoding import SpeculativeDecodingTextGenerationPipeline from .tokenizer import TextAndVisionTokenizer, TextTokenizer logger = logging.getLogger("max.pipelines") @@ -54,10 +55,24 @@ SupportedEncoding.bfloat16: SupportedEncoding.float32, } -_PIPELINE_TASK_MAP = { - PipelineTask.TEXT_GENERATION: TextGenerationPipeline, - PipelineTask.EMBEDDINGS_GENERATION: EmbeddingsPipeline, -} + +def get_pipeline_for_task( + task: PipelineTask, pipeline_config: PipelineConfig +) -> ( + type[TextGenerationPipeline] + | type[EmbeddingsPipeline] + | type[SpeculativeDecodingTextGenerationPipeline] +): + if task == PipelineTask.TEXT_GENERATION: + if pipeline_config.draft_model is not None: + return SpeculativeDecodingTextGenerationPipeline + else: + return TextGenerationPipeline + elif task == PipelineTask.EMBEDDINGS_GENERATION: + return EmbeddingsPipeline + else: + msg = f"PipelineTask ({task}) does not have supported Pipeline" + raise ValueError(msg) _HF_PIPELINE_TASK_MAP: dict[ @@ -144,8 +159,34 @@ def architecture_details( else: return None + def _validate_pipeline_config_for_speculative_decoding( + self, pipeline_config: PipelineConfig + ) -> None: + # When `draft_model` is not provided, speculative decoding is disabled. + if not pipeline_config.draft_model: + return None + + # Assume `draft_model` is provided, and thus speculative decoding is enabled. + # We don't support running speculative decoding with the HuggingFace backend. + if pipeline_config.engine == PipelineEngine.HUGGINGFACE: + msg = ( + "Speculative Decoding not supported with the HuggingFace Engine" + ) + raise ValueError(msg) + def validate_pipeline_config( self, pipeline_config: PipelineConfig + ) -> PipelineConfig: + # Run Baseline Validation + pipeline_config = self._validate_pipeline_config(pipeline_config) + + # Run Additional Checks for Speculative Decoding + self._validate_pipeline_config_for_speculative_decoding(pipeline_config) + + return pipeline_config + + def _validate_pipeline_config( + self, pipeline_config: PipelineConfig ) -> PipelineConfig: """Update pipeline config with appropriate values if not provided. If invalid config is provided, error out with detailed reason.""" @@ -921,7 +962,7 @@ def retrieve_factory( # Keep MyPy happy. assert pipeline_config.architecture is not None - pipeline_class = _PIPELINE_TASK_MAP[task] + pipeline_class = get_pipeline_for_task(task, pipeline_config) # MAX pipeline arch = self.architectures[pipeline_config.architecture] diff --git a/src/max/pipelines/speculative_decoding.py b/src/max/pipelines/speculative_decoding.py new file mode 100644 index 0000000000..b72c1cf9f8 --- /dev/null +++ b/src/max/pipelines/speculative_decoding.py @@ -0,0 +1,56 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# mypy: disable-error-code="import-not-found" +"""Speculative Decoding Text Generation Pipeline""" + +from typing import Type, TypeVar + +from .config import PipelineConfig +from .context import InputContext +from .interfaces import TextGenerationResponse, TokenGenerator +from .pipeline import PipelineModel + +T = TypeVar("T", bound=InputContext) + + +class SpeculativeDecodingTextGenerationPipeline(TokenGenerator[T]): + """Generalized token generator pipeline with speculative decoding.""" + + def __init__( + self, + pipeline_config: PipelineConfig, + pipeline_model: Type[PipelineModel], + eos_token_id: int, + ) -> None: + raise NotImplementedError( + "init not yet implemented for SpeculativeDecodingTextGenerationPipeline" + ) + + def next_token( + self, batch: dict[str, T], num_steps: int + ) -> dict[str, TextGenerationResponse]: + """Provided a batch, execute both the draft model for num_steps and the target model for num_steps + 1 tokens, accepting final tokens via rejection sampling, returning the variable list of token integers.""" + raise NotImplementedError( + "next_token not yet implemented for SpeculativeDecodingTextGenerationPipeline" + ) + + def release(self, context: T) -> None: + """Releases resources associated with this context. + + Args: + context (TokenGeneratorContext): Finished context. + + """ + raise NotImplementedError( + "release not yet implemented for SpeculativeDecodingTextGenerationPipeline" + ) From fa342a77199fc6c61f1937615b779756f866308c Mon Sep 17 00:00:00 2001 From: Austin Doolittle Date: Thu, 27 Feb 2025 16:33:14 -0500 Subject: [PATCH 29/44] [KVCache] rework max_cache_length to max_context_length (#56592) We were previously passing areound the max number of encoded tokens in the cache before QKV projection. This, out, is less useful than the max context length, which is the sum of the number of encoded tokens in tthe KVCache plus the new tokens we're encoding in the active forward pass. This PR cleans this up, and is a prerequisite to work included in E2EOPT-25t l MODULAR_ORIG_COMMIT_REV_ID: 2ba4178bd602dabfce4b9fb10181b98e42e241cb --- src/max/pipelines/kv_cache/_utils.py | 3 ++- src/max/pipelines/kv_cache/continuous_batching_cache.py | 8 +++++--- src/max/pipelines/kv_cache/paged_cache.py | 8 +++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/max/pipelines/kv_cache/_utils.py b/src/max/pipelines/kv_cache/_utils.py index 6942ad7823..1c8389142a 100644 --- a/src/max/pipelines/kv_cache/_utils.py +++ b/src/max/pipelines/kv_cache/_utils.py @@ -28,6 +28,7 @@ def build_max_lengths_tensor( for step in range(num_steps): max_lengths_np[step, 0] = step_max_seq_length max_lengths_np[step, 1] = step_max_cache_length - step_max_cache_length += step_max_seq_length step_max_seq_length = 1 + step_max_cache_length += 1 + return Tensor.from_numpy(max_lengths_np) diff --git a/src/max/pipelines/kv_cache/continuous_batching_cache.py b/src/max/pipelines/kv_cache/continuous_batching_cache.py index b6f75e9c8a..cb7936d97a 100644 --- a/src/max/pipelines/kv_cache/continuous_batching_cache.py +++ b/src/max/pipelines/kv_cache/continuous_batching_cache.py @@ -255,7 +255,7 @@ def _fetch( cache_lengths_np = np.zeros(active_batch_size, np.uint32) max_seq_length = 0 - max_cache_length = 0 + max_context_length = 0 for i, (seq_id, prompt) in enumerate(seq_ids_and_prompts.items()): if seq_id > self.max_batch_size: @@ -281,7 +281,9 @@ def _fetch( # Update the maximum lengths seen so far. max_seq_length = max(max_seq_length, len(prompt)) - max_cache_length = max(max_cache_length, cache_len) + max_context_length = max( + max_context_length, cache_len + len(prompt) + ) cache_lengths = [ Tensor.from_numpy(cache_lengths_np).to(d) for d in self.devices @@ -294,7 +296,7 @@ def _fetch( # Build a tensor of maximum lengths. Each step slices the first row to # advance to the values for the next row. max_lengths_host = build_max_lengths_tensor( - num_steps, max_seq_length, max_cache_length + num_steps, max_seq_length, max_context_length ) result = [ diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py index ab33d3335e..aa2c392995 100644 --- a/src/max/pipelines/kv_cache/paged_cache.py +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -542,7 +542,7 @@ def _fetch( # Determine the number of pages required for each sequence. max_seq_length = 0 - max_cache_length = 0 + max_context_length = 0 total_sequence_length = 0 total_blocks_to_allocate = 0 blocks_to_allocate_by_seq = {} @@ -557,7 +557,9 @@ def _fetch( # Update the maximum lengths seen so far. max_seq_length = max(max_seq_length, len(prompt)) - max_cache_length = max(max_cache_length, cache_length) + max_context_length = max( + max_context_length, cache_length + len(prompt) + ) # Compute the total sequence length and the number of pages required to store it. total_sequence_length += data.seq_len @@ -604,7 +606,7 @@ def _fetch( # Build a tensor of maximum lengths. Each step slices the first row to # advance to the values for the next row. max_lengths_host = build_max_lengths_tensor( - num_steps, max_seq_length, max_cache_length + num_steps, max_seq_length, max_context_length ) lut_table_host = Tensor.from_numpy(lut_table_np) From 02b4fdb828f6299f4efdc0f0ec960770e46d3de1 Mon Sep 17 00:00:00 2001 From: Zac Bowling Date: Thu, 27 Feb 2025 13:41:51 -0800 Subject: [PATCH 30/44] [build] Don't use broken opentelemetry-exporter-prometheus (#56798) We only need to avoid the broken yanked version of this for conda (temporarily), not PyPI. MODULAR_ORIG_COMMIT_REV_ID: d0ca07b068ef783717aa2fef884e717b9479f7e1 --- src/max/pipelines/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/max/pipelines/requirements.txt b/src/max/pipelines/requirements.txt index dc050dddf6..708e101b5b 100644 --- a/src/max/pipelines/requirements.txt +++ b/src/max/pipelines/requirements.txt @@ -22,7 +22,7 @@ httpx>=0.28.1,<0.29 huggingface-hub>=0.24.0 opentelemetry-api>=1.29.0 opentelemetry-exporter-otlp-proto-http>=1.27.0 -opentelemetry-exporter-prometheus<1.0.0 +opentelemetry-exporter-prometheus>=0.48b0 opentelemetry-sdk>=1.29.0 pillow>=10.3.0 prometheus-async>=22.2.0 From aeedc3d65fb25615adbe5a750dffb54e8ce1b1bd Mon Sep 17 00:00:00 2001 From: Brian Zhang Date: Thu, 27 Feb 2025 14:13:18 -0800 Subject: [PATCH 31/44] [KVCache] Implement `query_fetch_stats` in `PagedKVCacheManager` (#56606) This new method will compute some statistics about running a fetch operation without actually running the fetch or mutating state. Such info includes - blocks reused from prefix cache - tokens to encode - new pages needed This will be needed by the scheduler when doing kvcache and prefix cache aware scheduling. To implement this, we split the prefix cache `fetch` and `fetch_cow` methods into additional smaller helper methods that also do not mutate state. To test this, I monkey patched each call to `paged_manager.fetch` to call `query_fetch_stats`. Then after running the original `fetch`, I compare the actual and predicted statistics. Towards E2EOPT-62 MODULAR_ORIG_COMMIT_REV_ID: 4f826941818a256c31455f51de548a2c78f1431e --- src/max/pipelines/kv_cache/paged_cache.py | 41 +++++ .../kv_cache/paged_cache_metadata.py | 17 ++ src/max/pipelines/kv_cache/prefix_cache.py | 158 ++++++++++++++---- 3 files changed, 186 insertions(+), 30 deletions(-) diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py index aa2c392995..11ce2356cb 100644 --- a/src/max/pipelines/kv_cache/paged_cache.py +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -471,6 +471,47 @@ def get_num_cached_tokens(self, prompt: np.ndarray) -> int: return 0 return self.prefix_cache.get_num_cached_tokens(prompt) + def query_fetch_stats( + self, seq_id: int, prompt: np.ndarray, num_steps: int = 1 + ) -> tuple[set[int], int, int]: + """Query about the stats about running the fetch operation for a given + sequence. + + This method does not modify the state of the paged cache. + + Returns: + - prefix_blocks: Prefix cache blocks that would be reused for this seq. + - tokens_to_encode: Number of tokens in prompt we need to encode when running the fetch. + - new_pages_needed: Number of new pages we need to allocate when running the fetch. + """ + data = self.active_requests.get( + seq_id, PagedCacheMetadata(self.page_size, self.max_seq_len) + ) + data.fetch(prompt, num_steps) + prefix_blocks: set[int] = set() + cache_hit_tokens = 0 + if self.prefix_cache is not None: + # copy on write does not impact the number of new blocks needed + prefix_blocks, cache_hit_tokens = ( + self.prefix_cache.query_fetch_stats(seq_id, data) + ) + assert cache_hit_tokens >= 0 + + tokens_to_encode = len(data.prompt_tokens) - cache_hit_tokens + assert tokens_to_encode >= 1 + # recall that if we have any full cache hits, we will need to release our + # partial block as it is replaced with a full block + num_existing_pages = len(data.blocks) + num_existing_pages += len(prefix_blocks) + total_pages_needed = ceildiv(data.seq_len, self.page_size) + new_pages_needed = total_pages_needed - num_existing_pages + assert new_pages_needed >= 0 + + # reverse the fetch operation so that this method does not mutate state + data.undo_fetch(prompt, num_steps) + + return prefix_blocks, tokens_to_encode, new_pages_needed + def _fetch( self, seq_ids_and_prompts: dict[int, np.ndarray], num_steps: int = 1 ) -> List[KVCacheInputs]: diff --git a/src/max/pipelines/kv_cache/paged_cache_metadata.py b/src/max/pipelines/kv_cache/paged_cache_metadata.py index abeb8f7a40..0e1d8f6e62 100644 --- a/src/max/pipelines/kv_cache/paged_cache_metadata.py +++ b/src/max/pipelines/kv_cache/paged_cache_metadata.py @@ -169,3 +169,20 @@ def step(self, new_tokens: np.ndarray) -> None: "After step, all tokens should have a backing KV projection in the cache" ) self._validate_indices() + + def undo_fetch(self, prompt: np.ndarray, num_steps: int) -> None: + """Remove prompt from token array and release inflight tokens.""" + self._validate_indices() + assert len(self.prompt_tokens) > 0 + assert len(self.prompt_tokens) == len(prompt) + num_inflight_tokens = num_steps - 1 + assert len(self.inflight_tokens) == num_inflight_tokens + self.tokens[self.cached_idx : self.inflight_idx] = 0 + self.seq_len -= len(prompt) + num_inflight_tokens + self.inflight_idx -= len(prompt) + assert len(self.inflight_tokens) == 0 + assert len(self.prompt_tokens) == 0 + self._validate_indices() + + def __repr__(self) -> str: + return f"PagedCacheMetadata(committed_idx={self.committed_idx}, cached_idx={self.cached_idx}, inflight_idx={self.inflight_idx}, seq_len={self.seq_len}, blocks={self.blocks})" diff --git a/src/max/pipelines/kv_cache/prefix_cache.py b/src/max/pipelines/kv_cache/prefix_cache.py index 191f53ffd2..751abbd6f5 100644 --- a/src/max/pipelines/kv_cache/prefix_cache.py +++ b/src/max/pipelines/kv_cache/prefix_cache.py @@ -202,40 +202,67 @@ def _release_partial_block( data.cached_idx -= partial_tokens assert data.committed_idx == data.cached_idx - def fetch( + def _fetch_query_cache( self, seq_id: int, data: PagedCacheMetadata, - free_block_fn: Callable[[int], None], - alloc_block_fn: Callable[[], int], - ) -> list[int]: - """Extend the kv cache for given request with any cached prefixes. + ) -> tuple[TrieNode, list[int]]: + """A helper method used by `fetch` which queries the prefix cache for + full blocks which the request should reuse. - This will increment the committed_idx and cached_idx if there is a cache - hit. The prompt will be trimmed in the event that cached_idx is bumped. + This method does not modify the state of the prefix cache. + + Returns: + - node: the new position of the trie node for a given sequence once + it adds the prefix blocks to its assigned blocks + - prefix_blocks: blocks the sequence should reuse from the cache """ + node = self.active_requests.get(seq_id, self.radix_trie.root) + # If there is only one committable token, that means that the prompt # is one token. We cannot reduce the prompt length any further since # the model expects a prompt of length at least 1. committable_tokens = data.committable_tokens[:-1] if len(committable_tokens) == 0: - return [] + return node, [] # Query trie for all but last token. - node = self.active_requests[seq_id] node, prefix_blocks = self.radix_trie.match_prefix( committable_tokens, node=node ) - self.active_requests[seq_id] = node - # Mark the prefix blocks we retrieved from the radix trie cache as - # in use by this sequence so they don't get evicted prematurely. - self.radix_trie.mark_in_use_by(node, seq_id) + return node, prefix_blocks + + def fetch( + self, + seq_id: int, + data: PagedCacheMetadata, + free_block_fn: Callable[[int], None], + alloc_block_fn: Callable[[], int], + ) -> list[int]: + """Extend the kv cache for given request with any cached prefixes. + + This will increment the committed_idx and cached_idx if there is a cache + hit. The prompt will be trimmed in the event that cached_idx is bumped. + """ + node, prefix_blocks = self._fetch_query_cache(seq_id, data) # Update the cache hit rate metrics. num_cache_hit_tokens = len(prefix_blocks) * self.page_size self.cache_hit_tokens += num_cache_hit_tokens - self.all_tokens += len(committable_tokens) + self.all_tokens += len(data.committable_tokens) - 1 + + # Exit early if there are no cache hits. + if len(prefix_blocks) == 0: + if self.enable_cow: + self._fetch_cow(seq_id, data, free_block_fn, alloc_block_fn) + return [] + + self.active_requests[seq_id] = node + + # Mark the prefix blocks we retrieved from the radix trie cache as + # in use by this sequence so they don't get evicted prematurely. + self.radix_trie.mark_in_use_by(node, seq_id) # If there is a block with partially cached tokens, we should release it # if the cache hit blocks already contain these tokens and more @@ -253,6 +280,47 @@ def fetch( return prefix_blocks + def _fetch_cow_query_cache( + self, + node: TrieNode, + committable_tokens: np.ndarray, + partial_tokens: int, + ) -> tuple[Optional[int], int]: + """A helper method used by `_fetch_cow` which queries the prefix cache + for a block resident in prefix cache to copy tokens from for COW. + + This method does not modify the state of the prefix cache. + + Returns: + - partial_match_block: block to copy tokens from, this is None in + the event that performing COW is not beneficial + - num_cache_hit_tokens: tokens to copy from the block + """ + assert self.enable_cow + assert self.page_size > 1 + assert self.cow_strided_memcpy_graph is not None + assert len(committable_tokens) > 0 + assert 0 <= partial_tokens < self.page_size + + # Match page_size tokens in the radix trie + committable_tokens = committable_tokens[:-1] + if len(committable_tokens) == 0: + return None, 0 + committable_tokens_cropped = list(committable_tokens[: self.page_size]) + res = node.find_block_with_largest_common_prefix( + committable_tokens_cropped + ) + if res is None: + return None, 0 + partial_match_block, num_cache_hit_tokens = res + assert 0 < num_cache_hit_tokens < self.page_size + + # No point in performing COW if we have more cached but uncommitted tokens + # in the existing partial block than the matched prefix length. + if num_cache_hit_tokens <= partial_tokens: + return None, 0 + return partial_match_block, num_cache_hit_tokens + def _fetch_cow( self, seq_id: int, @@ -274,25 +342,16 @@ def _fetch_cow( return assert self.cow_strided_memcpy_graph is not None - # Match page_size tokens in the radix trie - committable_tokens = data.committable_tokens[:-1] - if len(committable_tokens) == 0: - return - committable_tokens_cropped = list(committable_tokens[: self.page_size]) + committable_tokens = data.committable_tokens node = self.active_requests[seq_id] - res = node.find_block_with_largest_common_prefix( - committable_tokens_cropped - ) - if res is None: - return - partial_match_block, num_cache_hit_tokens = res - assert 0 < num_cache_hit_tokens < self.page_size - - # No point in performing COW if we have more cached but uncommitted tokens - # in the existing partial block than the matched prefix length. partial_tokens = data.cached_idx - data.committed_idx - if num_cache_hit_tokens <= partial_tokens: + partial_match_block, num_cache_hit_tokens = self._fetch_cow_query_cache( + node, committable_tokens, partial_tokens + ) + if partial_match_block is None: return + assert num_cache_hit_tokens > 0 + assert num_cache_hit_tokens > partial_tokens # If we have a partially cached block, we need to release it before # appending additional blocks. @@ -314,6 +373,45 @@ def _fetch_cow( assert len(data.prompt_tokens) > 0 assert data.cached_idx < data.inflight_idx + def query_fetch_stats( + self, seq_id: int, data: PagedCacheMetadata + ) -> tuple[set[int], int]: + """Query the prefix trie for the cache hit stats for the given sequence. + + This method does not modify the state of the prefix cache. + + Returns: + - prefix_blocks: Prefix cache blocks that would be reused for this seq. + - num_cache_hit_tokens: Number of new cached tokens retrieved from prefix cache. + """ + node, prefix_blocks = self._fetch_query_cache(seq_id, data) + num_cache_hit_tokens = len(prefix_blocks) * self.page_size + + # If COW is enabled, we should consider the number of additional cache + # hits that would be incurred by performing a COW operation. + if self.enable_cow and self.page_size > 1: + committable_tokens = data.committable_tokens + committable_tokens = committable_tokens[num_cache_hit_tokens:] + partial_tokens = data.cached_idx - data.committed_idx + if len(prefix_blocks) > 0: + partial_tokens = 0 + partial_match_block, num_cow_cache_hit_tokens = ( + self._fetch_cow_query_cache( + node, committable_tokens, partial_tokens + ) + ) + if partial_match_block is not None: + num_cache_hit_tokens += num_cow_cache_hit_tokens + + # Determine the number of cache hit tokens, excluding any tokens that + # were already cached in a partial block. + new_cached_idx = max( + data.committed_idx + num_cache_hit_tokens, data.cached_idx + ) + num_cache_hit_tokens = new_cached_idx - data.cached_idx + assert num_cache_hit_tokens >= 0 + return set(prefix_blocks), num_cache_hit_tokens + def step( self, seq_id: int, From c3a576c31ee418487c2e4dc07cea3d837af67e41 Mon Sep 17 00:00:00 2001 From: Patrick Dougherty Date: Thu, 27 Feb 2025 16:37:02 -0600 Subject: [PATCH 32/44] [CI] Fix script paths MODULAR_ORIG_COMMIT_REV_ID: 88187ea34fe16c74adb8dac66d27c711c3d23b53 --- .github/workflows/test_pre_commit.yml | 5 ++--- .pre-commit-config.yaml | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test_pre_commit.yml b/.github/workflows/test_pre_commit.yml index 99a2ddf73d..12ed62a50a 100644 --- a/.github/workflows/test_pre_commit.yml +++ b/.github/workflows/test_pre_commit.yml @@ -46,7 +46,6 @@ jobs: run: | pip install pre-commit pre-commit install - - - name: Run pre-commit - run: magic run pre-commit run --all-files + - name: Run pre-commit + run: magic run --manifest-path mojo pre-commit run --all-files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5e3e2ec6e2..0e7d167ade 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,9 +16,9 @@ repos: hooks: - id: mojo-format name: mojo-format - entry: mojo format mojo + entry: mojo format language: system - files: '\.(mojo|🔥|py)$' + files: '^(mojo|examples/mojo).*\.(mojo|🔥|py)$' stages: [commit] - id: check-docstrings name: check-docstrings @@ -30,7 +30,7 @@ repos: name: check-license entry: mojo mojo/stdlib/scripts/check_licenses.mojo language: system - files: '\.(mojo|🔥|py)$' + files: '^(mojo|examples/mojo).*\.(mojo|🔥|py)$' stages: [commit] - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.40.0 From 3b88d3b4129ab4c5c1bd44cae836051549f9d9d9 Mon Sep 17 00:00:00 2001 From: Brian Zhang Date: Thu, 27 Feb 2025 14:47:19 -0800 Subject: [PATCH 33/44] [KVCache][Scheduler] Remove O(ce_batch_size^2 * seqlen) loop in batch creation (#56644) Fixes very inefficient kvcache / prefix cache aware scheduling. We were previously see-ing batch creation times of upwards of 1s. This fixes the above issue. ``` // Before ce_batch = [] loop: // O(ce_batch_size) req = q.pop() if not paged_manager.can_fetch(ce_batch + res): // O(ce_batch_size * seq_len) break ce_batch += res // After ce_batch = [] free_blocks = paged_manager.avail_blocks + stale_blocks tot_new_pages_needed = 0 loop: // O(ce_batch_size) req = q.pop() cache_hit_blocks, tokens_to_encode, new_pages_needed = paged_manager.query_fetch_stats(req) // O(seq_len) if free_blocks - cache_hit_blocks < tot_new_pages_needed + new_pages_needed: break ce_batch += req tot_new_pages_needed += new_pages_needed free_blocks -= cache_hit_blocks ``` Server: ``` br //SDK/lib/API/python/max/entrypoints:pipelines --test_output=streamed --test_arg=-svv -- serve --model-path=meta-llama/Meta-Llama-3.1-8B-Instruct --quantization-encoding bfloat16 --use-gpu --cache-strategy paged --kv-cache-page-size 128 --max-batch-size 512 --max-num-steps 10 --max-length 2048 --pad-to-multiple-of 2 --enable-prefix-caching ``` Client: ``` python3 $(realpath open-source/max/benchmark/benchmark_serving.py) --backend modular --model meta-llama/Meta-Llama-3.1-8B-Instruct --dataset-name sonnet --dataset-path $(realpath utils/benchmarking/serving/sonnet_4x.txt) --endpoint /v1/completions --num-prompts 500 --sonnet-input-len 512 --sonnet-output-len 16 --sonnet-prefix 192 --request-rate inf --collect-gpu-stats --print-inputs-and-outputs ``` Results after warmup with different seed: ``` {'req_id': 498, 'output_len': 16, 'output': 'Here are the lines from the poem:\n\n1. FROM fairest creatures we desire'} {'req_id': 499, 'output_len': 16, 'output': 'Here are the lines from the poem:\n\n1. FROM fairest creatures we desire'} ============ Serving Benchmark Result ============ Successful requests: 500 Failed requests: 0 Benchmark duration (s): 12.11 Total input tokens: 232488 Total generated tokens: 8000 Request throughput (req/s): 41.28 Input token throughput (tok/s): 19192.00 Output token throughput (tok/s): 660.40 ---------------Time to First Token---------------- Mean TTFT (ms): 5806.47 Median TTFT (ms): 5896.86 P99 TTFT (ms): 10296.24 -----Time per Output Token (excl. 1st token)------ Mean TPOT (ms): 408.27 Median TPOT (ms): 402.32 P99 TPOT (ms): 725.17 ---------------Inter-token Latency---------------- Mean ITL (ms): 407.57 Median ITL (ms): 73.28 P99 ITL (ms): 8737.24 -------------------Token Stats-------------------- Max input tokens: 494 Max output tokens: 16 Max total tokens: 510 --------------------GPU Stats--------------------- GPU Utilization (%): 80.63 Peak GPU Memory Used (MiB): 76842.56 GPU Memory Available (MiB): 4313.19 ================================================== 00:39:24.134 INFO: benchmark_serving: finished benchmark run: Success. ``` Logs: ``` 3ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 14.1K tok/s, Generation Tput: 29.2 tok/s | Batch creation: 574.3us, Execution: 34.2ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed TG batch with 1 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 9.8 tok/s, Generation Tput: 97.9 tok/s | Batch creation: 90.4us, Execution: 102.2ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed TG batch with 1 reqs | Terminated: 1 reqs, Pending: 0 reqs | Prompt Tput: 9.8 tok/s, Generation Tput: 97.8 tok/s | Batch creation: 87.9us, Execution: 102.2ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 20 reqs | Prompt Tput: 28.9K tok/s, Generation Tput: 59.9 tok/s | Batch creation: 463.2us, Execution: 16.7ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.2%, All Preemptions: 0 reqs Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 69 reqs | Prompt Tput: 15.3K tok/s, Generation Tput: 33.2 tok/s | Batch creation: 312.9us, Execution: 30.1ms | KVCache usage: 0.2% of 3679 blocks, Cache hit rate: 20.2%, All Preemptions: 0 reqs Executed CE batch with 9 reqs | Terminated: 0 reqs, Pending: 489 reqs | Prompt Tput: 22.9K tok/s, Generation Tput: 49.3 tok/s | Batch creation: 1.7ms, Execution: 182.5ms | KVCache usage: 0.9% of 3679 blocks, Cache hit rate: 20.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 461 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.7 tok/s | Batch creation: 5.3ms, Execution: 520.9ms | KVCache usage: 3.3% of 3679 blocks, Cache hit rate: 20.6%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 451 reqs | Prompt Tput: 22.9K tok/s, Generation Tput: 52.6 tok/s | Batch creation: 1.8ms, Execution: 190.0ms | KVCache usage: 4.0% of 3679 blocks, Cache hit rate: 20.6%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 423 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 4.9ms, Execution: 522.4ms | KVCache usage: 6.3% of 3679 blocks, Cache hit rate: 20.9%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 413 reqs | Prompt Tput: 22.5K tok/s, Generation Tput: 50.9 tok/s | Batch creation: 1.8ms, Execution: 196.6ms | KVCache usage: 7.1% of 3679 blocks, Cache hit rate: 21.0%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 385 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.9ms, Execution: 523.2ms | KVCache usage: 9.5% of 3679 blocks, Cache hit rate: 21.2%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 375 reqs | Prompt Tput: 22.9K tok/s, Generation Tput: 52.9 tok/s | Batch creation: 1.9ms, Execution: 189.1ms | KVCache usage: 10.2% of 3679 blocks, Cache hit rate: 21.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 347 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 5.0ms, Execution: 523.3ms | KVCache usage: 12.6% of 3679 blocks, Cache hit rate: 21.5%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 337 reqs | Prompt Tput: 23.9K tok/s, Generation Tput: 54.3 tok/s | Batch creation: 1.8ms, Execution: 184.1ms | KVCache usage: 13.3% of 3679 blocks, Cache hit rate: 21.5%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 309 reqs | Prompt Tput: 25.7K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 5.0ms, Execution: 521.7ms | KVCache usage: 15.7% of 3679 blocks, Cache hit rate: 21.7%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 299 reqs | Prompt Tput: 23.5K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 1.7ms, Execution: 180.1ms | KVCache usage: 16.4% of 3679 blocks, Cache hit rate: 21.8%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 271 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 4.9ms, Execution: 521.8ms | KVCache usage: 18.7% of 3679 blocks, Cache hit rate: 22.0%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 261 reqs | Prompt Tput: 22.4K tok/s, Generation Tput: 50.1 tok/s | Batch creation: 1.9ms, Execution: 199.4ms | KVCache usage: 19.5% of 3679 blocks, Cache hit rate: 22.0%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 233 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 4.9ms, Execution: 522.8ms | KVCache usage: 21.9% of 3679 blocks, Cache hit rate: 22.2%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 223 reqs | Prompt Tput: 22.8K tok/s, Generation Tput: 54.1 tok/s | Batch creation: 1.8ms, Execution: 184.8ms | KVCache usage: 22.6% of 3679 blocks, Cache hit rate: 22.2%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 195 reqs | Prompt Tput: 25.4K tok/s, Generation Tput: 55.1 tok/s | Batch creation: 5.4ms, Execution: 526.8ms | KVCache usage: 25.0% of 3679 blocks, Cache hit rate: 22.4%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 185 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 55.7 tok/s | Batch creation: 1.9ms, Execution: 179.4ms | KVCache usage: 25.7% of 3679 blocks, Cache hit rate: 22.4%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 157 reqs | Prompt Tput: 25.6K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 5.0ms, Execution: 523.7ms | KVCache usage: 28.1% of 3679 blocks, Cache hit rate: 22.6%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 147 reqs | Prompt Tput: 22.9K tok/s, Generation Tput: 54.2 tok/s | Batch creation: 1.8ms, Execution: 184.4ms | KVCache usage: 28.8% of 3679 blocks, Cache hit rate: 22.6%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 119 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.3 tok/s | Batch creation: 5.0ms, Execution: 524.2ms | KVCache usage: 31.2% of 3679 blocks, Cache hit rate: 22.8%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 109 reqs | Prompt Tput: 23.7K tok/s, Generation Tput: 55.7 tok/s | Batch creation: 1.7ms, Execution: 179.6ms | KVCache usage: 31.9% of 3679 blocks, Cache hit rate: 22.8%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 81 reqs | Prompt Tput: 25.6K tok/s, Generation Tput: 55.3 tok/s | Batch creation: 4.9ms, Execution: 524.3ms | KVCache usage: 34.3% of 3679 blocks, Cache hit rate: 22.9%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 71 reqs | Prompt Tput: 23.7K tok/s, Generation Tput: 55.9 tok/s | Batch creation: 1.9ms, Execution: 179.0ms | KVCache usage: 35.0% of 3679 blocks, Cache hit rate: 23.0%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 43 reqs | Prompt Tput: 25.7K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 152.1ms, Execution: 521.8ms | KVCache usage: 37.4% of 3679 blocks, Cache hit rate: 23.1%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 33 reqs | Prompt Tput: 22.8K tok/s, Generation Tput: 53.9 tok/s | Batch creation: 2.0ms, Execution: 185.7ms | KVCache usage: 38.1% of 3679 blocks, Cache hit rate: 23.1%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 5 reqs | Prompt Tput: 25.4K tok/s, Generation Tput: 55.0 tok/s | Batch creation: 5.2ms, Execution: 527.0ms | KVCache usage: 40.4% of 3679 blocks, Cache hit rate: 23.2%, All Preemptions: 0 reqs Executed CE batch with 5 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 22.7K tok/s, Generation Tput: 57.7 tok/s | Batch creation: 1.1ms, Execution: 86.6ms | KVCache usage: 40.8% of 3679 blocks, Cache hit rate: 23.2%, All Preemptions: 0 reqs Executed TG batch with 500 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 952.5 tok/s, Generation Tput: 9.5K tok/s | Batch creation: 10.1ms, Execution: 524.9ms | KVCache usage: 40.8% of 3679 blocks, Cache hit rate: 21.7%, All Preemptions: 0 reqs Executed TG batch with 500 reqs | Terminated: 500 reqs, Pending: 0 reqs | Prompt Tput: 950.1 tok/s, Generation Tput: 9.5K tok/s | Batch creation: 10.0ms, Execution: 526.2ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs ``` Completes E2EOPT-62 Completes E2EOPT-67 Towards E2EOPT-46 MODULAR_ORIG_COMMIT_REV_ID: 25ff131ef8dc9e2ee93d5c4c1b65e91995a06695 --- src/max/pipelines/kv_cache/paged_cache.py | 51 +++++----------------- src/max/pipelines/kv_cache/prefix_cache.py | 13 ------ 2 files changed, 12 insertions(+), 52 deletions(-) diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py index 11ce2356cb..8d3ad3663f 100644 --- a/src/max/pipelines/kv_cache/paged_cache.py +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -418,64 +418,37 @@ def can_fetch( ) -> bool: """Checks if there are sufficient KV pages to run `fetch` on given batch. - It is OK if some seq_id are not in the cache. We assume the cache lengths - are zero in those cases. + Sequences which have not been previously added to the cache can be handled + by this method. We assume the cache lengths are zero in those cases. """ - total_blocks_to_allocate = 0 + tot_new_pages_needed = 0 all_cache_hit_blocks: set[int] = set() for seq_id, prompt in seq_ids_and_prompts.items(): - data = self.active_requests.get( - seq_id, PagedCacheMetadata(self.page_size, self.max_seq_len) + prefix_blocks, _, new_pages_needed = self.query_fetch_stats( + seq_id, prompt, num_steps ) + tot_new_pages_needed += new_pages_needed + all_cache_hit_blocks.update(prefix_blocks) - # Extend the kv cache for given request with any cached prefixes. - cached_blocks: list[int] = [] - if self.prefix_cache is not None: - cached_blocks = self.prefix_cache.get_cached_blocks( - seq_id, prompt - ) - - # Compute the total sequence length and the number of pages required to store it. - total_sequence_length = ( - data.cached_idx + len(prompt) + num_steps - 1 - ) - num_pages_required = ceildiv(total_sequence_length, self.page_size) - - # Compute the number of *new* pages we need to allocate. - blocks_to_allocate = ( - num_pages_required - len(data.blocks) - len(cached_blocks) - ) - - total_blocks_to_allocate += blocks_to_allocate - all_cache_hit_blocks.update(cached_blocks) - - num_evictable_blocks = 0 + num_stale_blocks = 0 if self.prefix_cache is not None: # the blocks in the prefix cache that will be used by sequences in # this batch are no longer eligible for eviction / allocation. - num_evictable_blocks = len( + num_stale_blocks = len( self.prefix_cache.stale_blocks - all_cache_hit_blocks ) - num_free_blocks = len(self.available_blocks) + num_evictable_blocks - - return total_blocks_to_allocate <= num_free_blocks + num_free_blocks = len(self.available_blocks) + num_stale_blocks - def get_num_cached_tokens(self, prompt: np.ndarray) -> int: - """Returns the number of tokens in the CE prompt that are found in the - prefix cache. - """ - if self.prefix_cache is None: - return 0 - return self.prefix_cache.get_num_cached_tokens(prompt) + return tot_new_pages_needed <= num_free_blocks def query_fetch_stats( self, seq_id: int, prompt: np.ndarray, num_steps: int = 1 ) -> tuple[set[int], int, int]: """Query about the stats about running the fetch operation for a given - sequence. + sequence. It is OK if some seq_id are not in the cache. This method does not modify the state of the paged cache. diff --git a/src/max/pipelines/kv_cache/prefix_cache.py b/src/max/pipelines/kv_cache/prefix_cache.py index 751abbd6f5..07c2de5092 100644 --- a/src/max/pipelines/kv_cache/prefix_cache.py +++ b/src/max/pipelines/kv_cache/prefix_cache.py @@ -155,19 +155,6 @@ def validate_req_state_valid( assert (tokens == committed_tokens).all() assert blocks == committed_blocks - def get_cached_blocks(self, seq_id: int, prompt: np.ndarray) -> list[int]: - """Returns the blocks from the prefix cache that can be reused for the given prompt.""" - node = self.active_requests.get(seq_id, self.radix_trie.root) - # Attempt to match all but the last token in the prompt. This is - # because the model expects a prompt of length at least 1. - _, cached_blocks = self.radix_trie.match_prefix(prompt[:-1], node=node) - return cached_blocks - - def get_num_cached_tokens(self, prompt: np.ndarray) -> int: - """Returns the number of tokens in the CE prompt that are found in the prefix cache.""" - _, prefix_blocks = self.radix_trie.match_prefix(prompt[:-1]) - return len(prefix_blocks) * self.page_size - def evict_blocks(self, blocks_to_evict: Optional[int] = None) -> list[int]: """Evict a percentage of all blocks according to a LRU policy on the trie leaves.""" if blocks_to_evict is None: From acf5fa66a9fcf1a48170e9624f0e3288aaaaca60 Mon Sep 17 00:00:00 2001 From: Brian Zhang Date: Thu, 27 Feb 2025 15:21:48 -0800 Subject: [PATCH 34/44] [KVCache] More efficient impl of `_token_prefix_match` (#56706) The new impl of `_token_prefix_match` is faster: ``` For inputs: tokens0 = np.random.random((512,)) tokens1 = np.random.random((512,)) tokens0[:300] = tokens1[:300] Timing: old: ~20us new: ~10us ``` This gets called O(10) times per request when making a CE batch. For a CE batch with 50 requests, this can save 100-1000us for batch creation. This leads to a small (<1 RPS) boost in prefix caching benchmark. Also wow, literally trivial python operations (eg: numpy slicing or dict lookup) can take a hundred of ns to a few us. This is crazy. Server: ``` br //SDK/lib/API/python/max/entrypoints:pipelines --test_output=streamed --test_arg=-svv -- serve --model-path=meta-llama/Meta-Llama-3.1-8B-Instruct --quantization-encoding bfloat16 --use-gpu --cache-strategy paged --kv-cache-page-size 128 --max-batch-size 512 --max-num-steps 10 --max-length 2048 --pad-to-multiple-of 2 --enable-prefix-caching ``` Client: ``` python3 $(realpath open-source/max/benchmark/benchmark_serving.py) --backend modular --model meta-llama/Meta-Llama-3.1-8B-Instruct --dataset-name sonnet --dataset-path $(realpath utils/benchmarking/serving/sonnet_4x.txt) --endpoint /v1/completions --num-prompts 500 --sonnet-input-len 512 --sonnet-output-len 16 --sonnet-prefix 192 --request-rate inf --collect-gpu-stats --print-inputs-and-outputs ``` After warmup with diff seed: ``` ... {'req_id': 498, 'output_len': 16, 'output': 'Here are the lines from the poem:\n\n1. FROM fairest creatures we desire'} {'req_id': 499, 'output_len': 16, 'output': 'Here are the lines from the poem:\n\n1. FROM fairest creatures we desire'} ============ Serving Benchmark Result ============ Successful requests: 500 Failed requests: 0 Benchmark duration (s): 12.05 Total input tokens: 232488 Total generated tokens: 8000 Request throughput (req/s): 41.50 Input token throughput (tok/s): 19294.81 Output token throughput (tok/s): 663.94 ---------------Time to First Token---------------- Mean TTFT (ms): 5749.38 Median TTFT (ms): 6021.95 P99 TTFT (ms): 10313.60 -----Time per Output Token (excl. 1st token)------ Mean TPOT (ms): 408.48 Median TPOT (ms): 390.12 P99 TPOT (ms): 725.80 ---------------Inter-token Latency---------------- Mean ITL (ms): 407.90 Median ITL (ms): 84.05 P99 ITL (ms): 8566.73 -------------------Token Stats-------------------- Max input tokens: 494 Max output tokens: 16 Max total tokens: 510 --------------------GPU Stats--------------------- GPU Utilization (%): 79.73 Peak GPU Memory Used (MiB): 76714.56 GPU Memory Available (MiB): 4441.19 ================================================== 00:28:48.863 INFO: benchmark_serving: finished benchmark run: Success. ``` Logs: ``` Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 14.5K tok/s, Generation Tput: 30.0 tok/s | Batch creation: 447.1us, Execution: 33.3ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed TG batch with 1 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 9.8 tok/s, Generation Tput: 97.6 tok/s | Batch creation: 83.0us, Execution: 102.4ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed TG batch with 1 reqs | Terminated: 1 reqs, Pending: 0 reqs | Prompt Tput: 9.8 tok/s, Generation Tput: 97.6 tok/s | Batch creation: 85.5us, Execution: 102.5ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 7 reqs | Prompt Tput: 29.1K tok/s, Generation Tput: 60.2 tok/s | Batch creation: 388.0us, Execution: 16.6ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.2%, All Preemptions: 0 reqs Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 35 reqs | Prompt Tput: 15.2K tok/s, Generation Tput: 33.1 tok/s | Batch creation: 314.0us, Execution: 30.2ms | KVCache usage: 0.2% of 3679 blocks, Cache hit rate: 20.2%, All Preemptions: 0 reqs Executed CE batch with 9 reqs | Terminated: 0 reqs, Pending: 489 reqs | Prompt Tput: 23.0K tok/s, Generation Tput: 49.7 tok/s | Batch creation: 1.7ms, Execution: 181.0ms | KVCache usage: 0.9% of 3679 blocks, Cache hit rate: 20.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 461 reqs | Prompt Tput: 25.6K tok/s, Generation Tput: 55.7 tok/s | Batch creation: 4.9ms, Execution: 520.5ms | KVCache usage: 3.3% of 3679 blocks, Cache hit rate: 20.6%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 451 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 54.3 tok/s | Batch creation: 1.8ms, Execution: 184.0ms | KVCache usage: 4.0% of 3679 blocks, Cache hit rate: 20.6%, All Preemptions: 0 reqs Executed CE batch with 9 reqs | Terminated: 0 reqs, Pending: 442 reqs | Prompt Tput: 22.8K tok/s, Generation Tput: 49.1 tok/s | Batch creation: 1.7ms, Execution: 183.1ms | KVCache usage: 4.8% of 3679 blocks, Cache hit rate: 20.7%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 414 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.7 tok/s | Batch creation: 4.8ms, Execution: 520.2ms | KVCache usage: 7.1% of 3679 blocks, Cache hit rate: 21.0%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 404 reqs | Prompt Tput: 22.6K tok/s, Generation Tput: 50.5 tok/s | Batch creation: 1.8ms, Execution: 197.9ms | KVCache usage: 7.9% of 3679 blocks, Cache hit rate: 21.0%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 376 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.9ms, Execution: 523.3ms | KVCache usage: 10.2% of 3679 blocks, Cache hit rate: 21.3%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 366 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 54.5 tok/s | Batch creation: 1.7ms, Execution: 183.4ms | KVCache usage: 11.0% of 3679 blocks, Cache hit rate: 21.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 338 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.9ms, Execution: 523.8ms | KVCache usage: 13.3% of 3679 blocks, Cache hit rate: 21.6%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 328 reqs | Prompt Tput: 22.4K tok/s, Generation Tput: 52.0 tok/s | Batch creation: 1.7ms, Execution: 192.4ms | KVCache usage: 14.1% of 3679 blocks, Cache hit rate: 21.6%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 300 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 4.8ms, Execution: 522.3ms | KVCache usage: 16.4% of 3679 blocks, Cache hit rate: 21.8%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 290 reqs | Prompt Tput: 22.7K tok/s, Generation Tput: 52.5 tok/s | Batch creation: 1.7ms, Execution: 190.4ms | KVCache usage: 17.2% of 3679 blocks, Cache hit rate: 21.9%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 262 reqs | Prompt Tput: 25.4K tok/s, Generation Tput: 55.1 tok/s | Batch creation: 4.8ms, Execution: 526.2ms | KVCache usage: 19.5% of 3679 blocks, Cache hit rate: 22.0%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 252 reqs | Prompt Tput: 22.3K tok/s, Generation Tput: 50.5 tok/s | Batch creation: 1.8ms, Execution: 198.0ms | KVCache usage: 20.3% of 3679 blocks, Cache hit rate: 22.1%, All Preemptions: 0 reqs Executed CE batch with 30 reqs | Terminated: 1 reqs, Pending: 223 reqs | Prompt Tput: 25.9K tok/s, Generation Tput: 57.2 tok/s | Batch creation: 5.1ms, Execution: 524.1ms | KVCache usage: 22.6% of 3679 blocks, Cache hit rate: 22.3%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 213 reqs | Prompt Tput: 23.4K tok/s, Generation Tput: 52.2 tok/s | Batch creation: 1.8ms, Execution: 191.5ms | KVCache usage: 23.4% of 3679 blocks, Cache hit rate: 22.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 185 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.2 tok/s | Batch creation: 4.8ms, Execution: 525.1ms | KVCache usage: 25.8% of 3679 blocks, Cache hit rate: 22.5%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 175 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 56.0 tok/s | Batch creation: 1.7ms, Execution: 178.5ms | KVCache usage: 26.5% of 3679 blocks, Cache hit rate: 22.5%, All Preemptions: 0 reqs Executed CE batch with 30 reqs | Terminated: 1 reqs, Pending: 146 reqs | Prompt Tput: 25.8K tok/s, Generation Tput: 57.1 tok/s | Batch creation: 4.9ms, Execution: 525.7ms | KVCache usage: 28.9% of 3679 blocks, Cache hit rate: 22.7%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 136 reqs | Prompt Tput: 22.5K tok/s, Generation Tput: 50.4 tok/s | Batch creation: 1.8ms, Execution: 198.3ms | KVCache usage: 29.7% of 3679 blocks, Cache hit rate: 22.7%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 108 reqs | Prompt Tput: 25.6K tok/s, Generation Tput: 55.3 tok/s | Batch creation: 4.8ms, Execution: 524.4ms | KVCache usage: 32.1% of 3679 blocks, Cache hit rate: 22.8%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 98 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 55.7 tok/s | Batch creation: 1.7ms, Execution: 179.5ms | KVCache usage: 32.8% of 3679 blocks, Cache hit rate: 22.9%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 70 reqs | Prompt Tput: 20.8K tok/s, Generation Tput: 45.2 tok/s | Batch creation: 4.7ms, Execution: 642.0ms | KVCache usage: 35.2% of 3679 blocks, Cache hit rate: 23.0%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 60 reqs | Prompt Tput: 23.0K tok/s, Generation Tput: 54.5 tok/s | Batch creation: 1.9ms, Execution: 183.3ms | KVCache usage: 35.9% of 3679 blocks, Cache hit rate: 23.0%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 32 reqs | Prompt Tput: 25.7K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 5.0ms, Execution: 522.6ms | KVCache usage: 38.2% of 3679 blocks, Cache hit rate: 23.1%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 22 reqs | Prompt Tput: 23.7K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 1.8ms, Execution: 180.0ms | KVCache usage: 39.0% of 3679 blocks, Cache hit rate: 23.2%, All Preemptions: 0 reqs Executed CE batch with 22 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 23.7K tok/s, Generation Tput: 50.7 tok/s | Batch creation: 3.9ms, Execution: 434.0ms | KVCache usage: 40.8% of 3679 blocks, Cache hit rate: 23.2%, All Preemptions: 0 reqs Executed TG batch with 500 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 949.0 tok/s, Generation Tput: 9.5K tok/s | Batch creation: 10.7ms, Execution: 526.9ms | KVCache usage: 40.8% of 3679 blocks, Cache hit rate: 21.7%, All Preemptions: 0 reqs Executed TG batch with 500 reqs | Terminated: 500 reqs, Pending: 0 reqs | Prompt Tput: 952.2 tok/s, Generation Tput: 9.5K tok/s | Batch creation: 9.6ms, Execution: 525.1ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs ``` Towards: E2EOPT-46 MODULAR_ORIG_COMMIT_REV_ID: 8424cff31060b25dc9e62a981762fb4d632290c5 --- src/max/pipelines/kv_cache/radix_trie.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/max/pipelines/kv_cache/radix_trie.py b/src/max/pipelines/kv_cache/radix_trie.py index fe848cbe9e..ac1be1b26b 100644 --- a/src/max/pipelines/kv_cache/radix_trie.py +++ b/src/max/pipelines/kv_cache/radix_trie.py @@ -25,6 +25,10 @@ from collections import OrderedDict +def align_down(x: int, y: int) -> int: + return (x // y) * y + + def _token_prefix_match_len( tokens0: np.ndarray, tokens1: np.ndarray, page_size: int ) -> int: @@ -38,10 +42,11 @@ def _token_prefix_match_len( assert len(tokens0) % page_size == 0 assert len(tokens1) % page_size == 0 shorter_len = min(len(tokens0), len(tokens1)) - for i in range(0, shorter_len, page_size): - if (tokens0[i : i + page_size] != tokens1[i : i + page_size]).any(): - return i - return shorter_len + diff = tokens0[:shorter_len] != tokens1[:shorter_len] + idx = np.nonzero(diff)[0] + if len(idx) == 0: + return shorter_len + return align_down(idx[0], page_size) def _token_to_key(tokens: np.ndarray, page_size: int) -> tuple[TokenId, ...]: @@ -106,7 +111,6 @@ def find_block_with_largest_common_prefix( if prefix_len == 0: return None assert prefix_len <= len(target) - assert target[:prefix_len] == key[:prefix_len] return self.children[tuple(key)].blocks[0], prefix_len def get_prefix_tokens_and_blocks(self) -> Tuple[np.ndarray, List[BlockId]]: @@ -316,7 +320,7 @@ def match_prefix_helper( if len(tokens) == 0: return node, [] - tokens = tokens[: len(tokens) // self.page_size * self.page_size] + tokens = tokens[: align_down(len(tokens), self.page_size)] curr = match_prefix_helper(node, tokens, blocks) return curr, blocks From b9433d746091848368bea5437dafc7b2b0797110 Mon Sep 17 00:00:00 2001 From: Ivan Posva Date: Thu, 27 Feb 2025 15:24:52 -0800 Subject: [PATCH 35/44] [SDK] Rename Mojo Device creation APIs to follow Python convention Update Mojo `Device` creation to follow Python MAX Driver APIs by dropping the `_device` suffix from `accelerator_device()` and `cpu_device()`. MODULAR_ORIG_COMMIT_REV_ID: 7d55784535e97994ac02e6a9a0eaadc37525870d --- examples/custom_ops/benchmarks.mojo | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/custom_ops/benchmarks.mojo b/examples/custom_ops/benchmarks.mojo index f02bb8b731..b2f7962c05 100644 --- a/examples/custom_ops/benchmarks.mojo +++ b/examples/custom_ops/benchmarks.mojo @@ -15,7 +15,7 @@ from kernels.top_k import TopK from kernels.matrix_multiplication import MatrixMultiplication from gpu.host import DeviceContext from utils import IndexList -from max.driver.device import cpu_device +from max.driver import cpu from max.tensor import ( ManagedTensorSlice, InputTensor, @@ -67,7 +67,7 @@ def top_k(): rand(in_vals, els) - var cpu_ctx_ptr = cpu_device().unsafe_ptr() + var cpu_ctx_ptr = cpu().unsafe_ptr() @parameter @always_inline @@ -189,7 +189,7 @@ def matmul(): rand(a_ptr, a_els) rand(b_ptr, b_els) - var cpu_ctx_ptr = cpu_device().unsafe_ptr() + var cpu_ctx_ptr = cpu().unsafe_ptr() var bench = Bench() var flops = ThroughputMeasure(BenchMetric.flops, FLOPS) var elements = ThroughputMeasure(BenchMetric.elements, M * N) From 2c6a976e6a9ba1a012a23da1c97f157b24146c0b Mon Sep 17 00:00:00 2001 From: Brian Zhang Date: Thu, 27 Feb 2025 15:56:14 -0800 Subject: [PATCH 36/44] [KVCache] Reduce python memory allocations by reusing PagedCacheMetadata (#56707) Stacked PRs: * #56844 * __->__#56707 --- --- --- ### [KVCache] Reduce python memory allocations by reusing PagedCacheMetadata Server: ``` br //SDK/lib/API/python/max/entrypoints:pipelines --test_output=streamed --test_arg=-svv -- serve --model-path=meta-llama/Meta-Llama-3.1-8B-Instruct --quantization-encoding bfloat16 --use-gpu --cache-strategy paged --kv-cache-page-size 128 --max-batch-size 512 --max-num-steps 10 --max-length 2048 --pad-to-multiple-of 2 --enable-prefix-caching ``` Client: ``` python3 $(realpath open-source/max/benchmark/benchmark_serving.py) --backend modular --model meta-llama/Meta-Llama-3.1-8B-Instruct --dataset-name sonnet --dataset-path $(realpath utils/benchmarking/serving/sonnet_4x.txt) --endpoint /v1/completions --num-prompts 500 --sonnet-input-len 512 --sonnet-output-len 16 --sonnet-prefix 192 --request-rate inf --collect-gpu-stats --print-inputs-and-outputs ``` After warmup with diff seed: ``` ============ Serving Benchmark Result ============ Successful requests: 500 Failed requests: 0 Benchmark duration (s): 12.08 Total input tokens: 232488 Total generated tokens: 8000 Request throughput (req/s): 41.38 Input token throughput (tok/s): 19241.35 Output token throughput (tok/s): 662.10 ---------------Time to First Token---------------- Mean TTFT (ms): 5743.03 Median TTFT (ms): 5965.71 P99 TTFT (ms): 10296.76 -----Time per Output Token (excl. 1st token)------ Mean TPOT (ms): 410.71 Median TPOT (ms): 395.74 P99 TPOT (ms): 718.80 ---------------Inter-token Latency---------------- Mean ITL (ms): 410.06 Median ITL (ms): 78.55 P99 ITL (ms): 8588.68 -------------------Token Stats-------------------- Max input tokens: 494 Max output tokens: 16 Max total tokens: 510 --------------------GPU Stats--------------------- GPU Utilization (%): 79.88 Peak GPU Memory Used (MiB): 76682.56 GPU Memory Available (MiB): 4473.19 ================================================== 00:24:04.695 INFO: benchmark_serving: finished benchmark run: Success. ``` Logs: ``` Executed CE batch with 1 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 14.4K tok/s, Generation Tput: 29.7 tok/s | Batch creation: 532.3us, Execution: 33.6ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed TG batch with 1 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 9.8 tok/s, Generation Tput: 97.5 tok/s | Batch creation: 70.3us, Execution: 102.5ms | KVCache usage: 0.1% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed TG batch with 1 reqs | Terminated: 1 reqs, Pending: 0 reqs | Prompt Tput: 9.7 tok/s, Generation Tput: 97.5 tok/s | Batch creation: 75.2us, Execution: 102.6ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs Executed CE batch with 3 reqs | Terminated: 0 reqs, Pending: 62 reqs | Prompt Tput: 26.9K tok/s, Generation Tput: 57.6 tok/s | Batch creation: 738.5us, Execution: 52.1ms | KVCache usage: 0.3% of 3679 blocks, Cache hit rate: 20.2%, All Preemptions: 0 reqs Executed CE batch with 14 reqs | Terminated: 0 reqs, Pending: 483 reqs | Prompt Tput: 23.6K tok/s, Generation Tput: 50.9 tok/s | Batch creation: 2.3ms, Execution: 274.8ms | KVCache usage: 1.4% of 3679 blocks, Cache hit rate: 20.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 455 reqs | Prompt Tput: 25.6K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 4.5ms, Execution: 521.2ms | KVCache usage: 3.8% of 3679 blocks, Cache hit rate: 20.6%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 445 reqs | Prompt Tput: 22.4K tok/s, Generation Tput: 51.5 tok/s | Batch creation: 1.6ms, Execution: 194.2ms | KVCache usage: 4.5% of 3679 blocks, Cache hit rate: 20.7%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 417 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 4.4ms, Execution: 521.6ms | KVCache usage: 6.8% of 3679 blocks, Cache hit rate: 21.0%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 407 reqs | Prompt Tput: 22.4K tok/s, Generation Tput: 50.2 tok/s | Batch creation: 1.7ms, Execution: 199.0ms | KVCache usage: 7.6% of 3679 blocks, Cache hit rate: 21.0%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 379 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.3 tok/s | Batch creation: 4.4ms, Execution: 524.6ms | KVCache usage: 9.9% of 3679 blocks, Cache hit rate: 21.3%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 369 reqs | Prompt Tput: 22.7K tok/s, Generation Tput: 52.4 tok/s | Batch creation: 1.5ms, Execution: 190.9ms | KVCache usage: 10.7% of 3679 blocks, Cache hit rate: 21.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 341 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.3 tok/s | Batch creation: 4.4ms, Execution: 524.2ms | KVCache usage: 13.0% of 3679 blocks, Cache hit rate: 21.5%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 331 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 54.3 tok/s | Batch creation: 1.6ms, Execution: 184.1ms | KVCache usage: 13.8% of 3679 blocks, Cache hit rate: 21.6%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 303 reqs | Prompt Tput: 25.6K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 4.5ms, Execution: 522.8ms | KVCache usage: 16.1% of 3679 blocks, Cache hit rate: 21.8%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 293 reqs | Prompt Tput: 23.9K tok/s, Generation Tput: 55.9 tok/s | Batch creation: 1.5ms, Execution: 178.9ms | KVCache usage: 16.9% of 3679 blocks, Cache hit rate: 21.8%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 265 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.4ms, Execution: 523.1ms | KVCache usage: 19.2% of 3679 blocks, Cache hit rate: 22.0%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 255 reqs | Prompt Tput: 22.3K tok/s, Generation Tput: 50.6 tok/s | Batch creation: 1.5ms, Execution: 197.6ms | KVCache usage: 20.0% of 3679 blocks, Cache hit rate: 22.1%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 227 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.5ms, Execution: 523.7ms | KVCache usage: 22.4% of 3679 blocks, Cache hit rate: 22.2%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 217 reqs | Prompt Tput: 22.5K tok/s, Generation Tput: 54.0 tok/s | Batch creation: 1.6ms, Execution: 185.1ms | KVCache usage: 23.1% of 3679 blocks, Cache hit rate: 22.3%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 189 reqs | Prompt Tput: 25.7K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.3ms, Execution: 523.3ms | KVCache usage: 25.4% of 3679 blocks, Cache hit rate: 22.4%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 179 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 55.5 tok/s | Batch creation: 1.6ms, Execution: 180.1ms | KVCache usage: 26.2% of 3679 blocks, Cache hit rate: 22.5%, All Preemptions: 0 reqs Executed CE batch with 9 reqs | Terminated: 0 reqs, Pending: 170 reqs | Prompt Tput: 24.8K tok/s, Generation Tput: 53.9 tok/s | Batch creation: 1.6ms, Execution: 166.9ms | KVCache usage: 26.9% of 3679 blocks, Cache hit rate: 22.5%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 142 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.2 tok/s | Batch creation: 4.5ms, Execution: 525.2ms | KVCache usage: 29.3% of 3679 blocks, Cache hit rate: 22.7%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 132 reqs | Prompt Tput: 23.8K tok/s, Generation Tput: 55.8 tok/s | Batch creation: 1.5ms, Execution: 179.1ms | KVCache usage: 30.0% of 3679 blocks, Cache hit rate: 22.7%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 104 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.4 tok/s | Batch creation: 4.4ms, Execution: 523.9ms | KVCache usage: 32.4% of 3679 blocks, Cache hit rate: 22.8%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 94 reqs | Prompt Tput: 22.8K tok/s, Generation Tput: 52.5 tok/s | Batch creation: 1.6ms, Execution: 190.5ms | KVCache usage: 33.1% of 3679 blocks, Cache hit rate: 22.9%, All Preemptions: 0 reqs Executed CE batch with 9 reqs | Terminated: 0 reqs, Pending: 85 reqs | Prompt Tput: 25.0K tok/s, Generation Tput: 53.9 tok/s | Batch creation: 1.5ms, Execution: 166.9ms | KVCache usage: 33.9% of 3679 blocks, Cache hit rate: 22.9%, All Preemptions: 0 reqs Executed CE batch with 9 reqs | Terminated: 0 reqs, Pending: 76 reqs | Prompt Tput: 25.0K tok/s, Generation Tput: 54.1 tok/s | Batch creation: 1.5ms, Execution: 166.5ms | KVCache usage: 34.6% of 3679 blocks, Cache hit rate: 22.9%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 48 reqs | Prompt Tput: 25.5K tok/s, Generation Tput: 55.2 tok/s | Batch creation: 4.5ms, Execution: 524.9ms | KVCache usage: 36.9% of 3679 blocks, Cache hit rate: 23.1%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 38 reqs | Prompt Tput: 23.7K tok/s, Generation Tput: 55.6 tok/s | Batch creation: 1.7ms, Execution: 179.9ms | KVCache usage: 37.7% of 3679 blocks, Cache hit rate: 23.1%, All Preemptions: 0 reqs Executed CE batch with 29 reqs | Terminated: 1 reqs, Pending: 10 reqs | Prompt Tput: 20.8K tok/s, Generation Tput: 45.1 tok/s | Batch creation: 4.5ms, Execution: 642.9ms | KVCache usage: 40.0% of 3679 blocks, Cache hit rate: 23.2%, All Preemptions: 0 reqs Executed CE batch with 10 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 24.1K tok/s, Generation Tput: 56.5 tok/s | Batch creation: 1.8ms, Execution: 177.0ms | KVCache usage: 40.8% of 3679 blocks, Cache hit rate: 23.2%, All Preemptions: 0 reqs Executed TG batch with 500 reqs | Terminated: 0 reqs, Pending: 0 reqs | Prompt Tput: 948.4 tok/s, Generation Tput: 9.5K tok/s | Batch creation: 7.4ms, Execution: 527.2ms | KVCache usage: 40.8% of 3679 blocks, Cache hit rate: 21.7%, All Preemptions: 0 reqs Executed TG batch with 500 reqs | Terminated: 500 reqs, Pending: 0 reqs | Prompt Tput: 948.6 tok/s, Generation Tput: 9.5K tok/s | Batch creation: 7.8ms, Execution: 527.1ms | KVCache usage: 0.0% of 3679 blocks, Cache hit rate: 20.1%, All Preemptions: 0 reqs ``` MODULAR_ORIG_COMMIT_REV_ID: a065e25c9c956299d6451a012665a1267b9dd08c --- src/max/pipelines/kv_cache/paged_cache.py | 17 ++++++++++++++--- .../pipelines/kv_cache/paged_cache_metadata.py | 12 +++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py index 8d3ad3663f..6e8ba7d7ee 100644 --- a/src/max/pipelines/kv_cache/paged_cache.py +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -260,6 +260,10 @@ def __init__( tensors=self.blocks, ) + # Preallocate a PagedCacheMetadata to use for sequences not in the cache. + # This is to reduce the number of allocations. This is NOT thread safe. + self.tmp_data = PagedCacheMetadata(self.page_size, self.max_seq_len) + # Whether to enable runtime correctness checks. These correctness checks # are expensive and should only be used in tests. self.enable_runtime_checks = enable_runtime_checks @@ -457,9 +461,13 @@ def query_fetch_stats( - tokens_to_encode: Number of tokens in prompt we need to encode when running the fetch. - new_pages_needed: Number of new pages we need to allocate when running the fetch. """ - data = self.active_requests.get( - seq_id, PagedCacheMetadata(self.page_size, self.max_seq_len) - ) + reusing_tmp_data = False + if seq_id in self.active_requests: + data = self.active_requests[seq_id] + else: + reusing_tmp_data = True + data = self.tmp_data + data.fetch(prompt, num_steps) prefix_blocks: set[int] = set() cache_hit_tokens = 0 @@ -483,6 +491,9 @@ def query_fetch_stats( # reverse the fetch operation so that this method does not mutate state data.undo_fetch(prompt, num_steps) + if reusing_tmp_data: + self.tmp_data.clear() + return prefix_blocks, tokens_to_encode, new_pages_needed def _fetch( diff --git a/src/max/pipelines/kv_cache/paged_cache_metadata.py b/src/max/pipelines/kv_cache/paged_cache_metadata.py index 0e1d8f6e62..28accfe316 100644 --- a/src/max/pipelines/kv_cache/paged_cache_metadata.py +++ b/src/max/pipelines/kv_cache/paged_cache_metadata.py @@ -36,7 +36,7 @@ class PagedCacheMetadata: - Committable tokens are tokens that are not yet committed but have a known value (i.e. not inflight). We can query the prefix cache for such tokens. - Inflight tokens are slots allocated for tokens that have not been generated - yet. Such tokens have a filler value of 0. After `fetch`, there should be + yet. Such tokens have a undefined values. After `fetch`, there should be `num_steps - 1` inflight tokens. They will be replaced with actual tokens in `step`. @@ -60,7 +60,7 @@ def __init__(self, page_size: int, max_seq_len: int) -> None: self.inflight_idx: int = 0 self.seq_len: int = 0 self.blocks: list[int] = [] - self.tokens: np.ndarray = np.full((max_seq_len,), 0, dtype=np.int64) + self.tokens: np.ndarray = np.empty((max_seq_len,), dtype=np.int64) @property def committed_blocks(self) -> list[int]: @@ -177,12 +177,18 @@ def undo_fetch(self, prompt: np.ndarray, num_steps: int) -> None: assert len(self.prompt_tokens) == len(prompt) num_inflight_tokens = num_steps - 1 assert len(self.inflight_tokens) == num_inflight_tokens - self.tokens[self.cached_idx : self.inflight_idx] = 0 self.seq_len -= len(prompt) + num_inflight_tokens self.inflight_idx -= len(prompt) assert len(self.inflight_tokens) == 0 assert len(self.prompt_tokens) == 0 self._validate_indices() + def clear(self) -> None: + assert len(self.blocks) == 0 + self.committed_idx = 0 + self.cached_idx = 0 + self.inflight_idx = 0 + self.seq_len = 0 + def __repr__(self) -> str: return f"PagedCacheMetadata(committed_idx={self.committed_idx}, cached_idx={self.cached_idx}, inflight_idx={self.inflight_idx}, seq_len={self.seq_len}, blocks={self.blocks})" From d8b8beb3bfcc1e6f9883979bd285b2c15e70ec47 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Thu, 27 Feb 2025 16:13:07 -0800 Subject: [PATCH 37/44] Add README links to the corresponding tutorials MODULAR_ORIG_COMMIT_REV_ID: 52fe2e414e3612a4b5e42e25b292effc735ff99c --- tutorials/hello-magic/README.md | 4 ++++ tutorials/helm/max-openai-api/README.md | 4 ++++ tutorials/max-graph-python/README.md | 6 +++++- tutorials/max-serve-cloud-configs/README.md | 4 ++++ tutorials/run-embeddings-with-max-serve/README.md | 4 ++++ 5 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tutorials/hello-magic/README.md create mode 100644 tutorials/max-serve-cloud-configs/README.md diff --git a/tutorials/hello-magic/README.md b/tutorials/hello-magic/README.md new file mode 100644 index 0000000000..57d5b941e8 --- /dev/null +++ b/tutorials/hello-magic/README.md @@ -0,0 +1,4 @@ +# Hello Magic + +This code corresponds to the tutorial, +[A step-by-step guide to Magic](https://docs.modular.com/max/tutorials/magic). diff --git a/tutorials/helm/max-openai-api/README.md b/tutorials/helm/max-openai-api/README.md index 5af9a9380c..c67353afcc 100644 --- a/tutorials/helm/max-openai-api/README.md +++ b/tutorials/helm/max-openai-api/README.md @@ -7,6 +7,10 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs The MAX platform unifies the leading AI development frameworks (TensorFlow, PyTorch, ONNX) and hardware backends in order to simplify deployment for AI production teams and accelerate innovation for AI developers. +For more information about using this Helm chart, see the tutorial to [Deploy +Llama 3 on GPU-powered Kubernetes +clusters](https://docs.modular.com/max/tutorials/deploy-max-serve-on-kubernetes/) + **Homepage:** ## Source Code diff --git a/tutorials/max-graph-python/README.md b/tutorials/max-graph-python/README.md index 4972b568c6..c1556efdad 100644 --- a/tutorials/max-graph-python/README.md +++ b/tutorials/max-graph-python/README.md @@ -3,6 +3,10 @@ This is an example of building a model with the MAX Graph API in Python and execute it with MAX Engine. +For more explanation about this code, see the tutorial to [Get started with MAX +Graph in +Python](https://docs.modular.com/max/tutorials/get-started-with-max-graph-in-python). + ## Usage First, install [Magic](https://docs.modular.com/magic/). @@ -37,7 +41,7 @@ You should see the following output: platform darwin -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0 rootdir: /max-repo configfile: pyproject.toml -collected 6 items +collected 6 items tests/test_addition.py ...... [100%] diff --git a/tutorials/max-serve-cloud-configs/README.md b/tutorials/max-serve-cloud-configs/README.md new file mode 100644 index 0000000000..698896c488 --- /dev/null +++ b/tutorials/max-serve-cloud-configs/README.md @@ -0,0 +1,4 @@ +# MAX Serve cloud configurations + +For usage instructions, see the tutorial to [Deploy Llama 3 on GPU with MAX +Serve](https://docs.modular.com/max/tutorials/max-serve-local-to-cloud). diff --git a/tutorials/run-embeddings-with-max-serve/README.md b/tutorials/run-embeddings-with-max-serve/README.md index 4fc60548b3..2afdea295e 100644 --- a/tutorials/run-embeddings-with-max-serve/README.md +++ b/tutorials/run-embeddings-with-max-serve/README.md @@ -14,3 +14,7 @@ search through documents semantically. ```bash python -m embeddings.kb_system ``` + +For a complete walkthrough, see the tutorial to [Deploy a text embedding model +with an +endpoint](https://docs.modular.com/max/tutorials/run-embeddings-with-max-serve) From e31b0fd5774033f43de1c1e3c78fa493599b7aca Mon Sep 17 00:00:00 2001 From: abdul dakkak Date: Thu, 27 Feb 2025 16:18:11 -0800 Subject: [PATCH 38/44] [Stdlib] Add string_literal.base64.encode/decode ops and tests. This allows one to perform base64 encode and decode StringLiteral via the compiler at compile time. MODULAR_ORIG_COMMIT_REV_ID: 90429a816e301f242830654b35a048d00b66c73a --- mojo/stdlib/src/builtin/string_literal.mojo | 18 ++++++++++++++++++ .../test/builtin/test_string_literal.mojo | 11 +++++++++++ 2 files changed, 29 insertions(+) diff --git a/mojo/stdlib/src/builtin/string_literal.mojo b/mojo/stdlib/src/builtin/string_literal.mojo index da60f9515c..6365aba14d 100644 --- a/mojo/stdlib/src/builtin/string_literal.mojo +++ b/mojo/stdlib/src/builtin/string_literal.mojo @@ -955,3 +955,21 @@ struct StringLiteral( A copy of the string with no leading whitespaces. """ return String(String(self).lstrip()) + + +fn _base64_encode[str: StringLiteral]() -> StringLiteral: + """Encode the string literal using Base64 encoding. + + Returns: + A new string literal with the Base64 encoded string. + """ + return __mlir_op.`pop.string.base64.encode`(str.value) + + +fn _base64_decode[str: StringLiteral]() -> StringLiteral: + """Decode the string literal using Base64 encoding. + + Returns: + A new string literal with the Base64 decoded string. + """ + return __mlir_op.`pop.string.base64.decode`(str.value) diff --git a/mojo/stdlib/test/builtin/test_string_literal.mojo b/mojo/stdlib/test/builtin/test_string_literal.mojo index 00ef2fec3f..de10a42d19 100644 --- a/mojo/stdlib/test/builtin/test_string_literal.mojo +++ b/mojo/stdlib/test/builtin/test_string_literal.mojo @@ -22,6 +22,7 @@ from testing import ( assert_raises, assert_true, ) +from builtin.string_literal import _base64_encode, _base64_decode def test_add(): @@ -525,6 +526,15 @@ def test_string_literal_from_stringable(): ) +def test_base64_encode_decode(): + assert_equal(_base64_encode["hello"](), "aGVsbG8=") + assert_equal(_base64_decode["aGVsbG8="](), "hello") + + alias encoded = _base64_encode["I'm a mojo string"]() + alias decoded = _base64_decode[encoded]() + assert_equal(decoded, "I'm a mojo string") + + def main(): test_add() test_iadd() @@ -558,3 +568,4 @@ def main(): test_splitlines() test_float_conversion() test_string_literal_from_stringable() + test_base64_encode_decode() From 3e034d828b1ff62edc4d30cae822f61647a29263 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Thu, 27 Feb 2025 18:33:31 -0600 Subject: [PATCH 39/44] [Examples] [Driver API] Provide an easy-to-read warning when building GPU function examples for CPUs When attempting to build the GPU function examples on a system without a MAX-supported GPU, they could provide a cryptic compilation error. This firmly gates compilation behind the presence or absence of a supported GPU and gives an easy-to-read warning if one is missing. MODULAR_ORIG_COMMIT_REV_ID: c361d392ad2f446c40d1950f539dc00b402f55df --- examples/gpu_functions/grayscale.mojo | 122 ++++++++-------- examples/gpu_functions/mandelbrot.mojo | 110 ++++++++------- .../naive_matrix_multiplication.mojo | 130 ++++++++++-------- examples/gpu_functions/vector_addition.mojo | 108 ++++++++------- 4 files changed, 252 insertions(+), 218 deletions(-) diff --git a/examples/gpu_functions/grayscale.mojo b/examples/gpu_functions/grayscale.mojo index f0bcc52566..ec8657fbba 100755 --- a/examples/gpu_functions/grayscale.mojo +++ b/examples/gpu_functions/grayscale.mojo @@ -23,6 +23,7 @@ from max.driver import ( cpu_device, ) from max.driver.accelerator import compile +from sys import has_nvidia_gpu_accelerator alias channel_dtype = DType.uint8 alias internal_float_dtype = DType.float32 @@ -65,60 +66,67 @@ fn color_to_grayscale_conversion( def main(): - # Attempt to connect to a compatible GPU. If one is not found, this will - # error out and exit. - gpu_device = accelerator_device() - host_device = cpu_device() - - alias IMAGE_WIDTH = 5 - alias IMAGE_HEIGHT = 10 - alias NUM_CHANNELS = 3 - - # Allocate the input image tensor on the host. - rgb_tensor = Tensor[channel_dtype, tensor_rank]( - (IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS), host_device - ) - - # Fill the image with initial colors. - for row in range(IMAGE_HEIGHT): - for col in range(IMAGE_WIDTH): - rgb_tensor[row, col, 0] = row + col - rgb_tensor[row, col, 1] = row + col + 20 - rgb_tensor[row, col, 2] = row + col + 40 - - # Move the image tensor to the accelerator. - rgb_tensor = rgb_tensor.move_to(gpu_device) - - # Allocate a tensor on the accelerator to host the grayscale image. - gray_tensor = Tensor[channel_dtype, tensor_rank]( - (IMAGE_HEIGHT, IMAGE_WIDTH, 1), gpu_device - ) - - # Compile the function to run across a grid on the GPU. - gpu_function = compile[color_to_grayscale_conversion](gpu_device) - - # The grid is divided up into blocks, making sure there's an extra - # full block for any remainder. This hasn't been tuned for any specific - # GPU. - alias BLOCK_SIZE = 16 - num_col_blocks = ceildiv(IMAGE_WIDTH, BLOCK_SIZE) - num_row_blocks = ceildiv(IMAGE_HEIGHT, BLOCK_SIZE) - - # Launch the compiled function on the GPU. The target device is specified - # first, followed by all function arguments. The last two named parameters - # are the dimensions of the grid in blocks, and the block dimensions. - gpu_function( - gpu_device, - IMAGE_WIDTH, - IMAGE_HEIGHT, - rgb_tensor.unsafe_slice(), - gray_tensor.unsafe_slice(), - grid_dim=Dim(num_col_blocks, num_row_blocks), - block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), - ) - - # Move the output tensor back onto the CPU so that we can read the results. - gray_tensor = gray_tensor.move_to(host_device) - - print("Resulting grayscale image:") - print_image[IMAGE_HEIGHT, IMAGE_WIDTH](gray_tensor) + @parameter + if has_nvidia_gpu_accelerator(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + alias IMAGE_WIDTH = 5 + alias IMAGE_HEIGHT = 10 + alias NUM_CHANNELS = 3 + + # Allocate the input image tensor on the host. + rgb_tensor = Tensor[channel_dtype, tensor_rank]( + (IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS), host_device + ) + + # Fill the image with initial colors. + for row in range(IMAGE_HEIGHT): + for col in range(IMAGE_WIDTH): + rgb_tensor[row, col, 0] = row + col + rgb_tensor[row, col, 1] = row + col + 20 + rgb_tensor[row, col, 2] = row + col + 40 + + # Move the image tensor to the accelerator. + rgb_tensor = rgb_tensor.move_to(gpu_device) + + # Allocate a tensor on the accelerator to host the grayscale image. + gray_tensor = Tensor[channel_dtype, tensor_rank]( + (IMAGE_HEIGHT, IMAGE_WIDTH, 1), gpu_device + ) + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[color_to_grayscale_conversion](gpu_device) + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + num_col_blocks = ceildiv(IMAGE_WIDTH, BLOCK_SIZE) + num_row_blocks = ceildiv(IMAGE_HEIGHT, BLOCK_SIZE) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + IMAGE_WIDTH, + IMAGE_HEIGHT, + rgb_tensor.unsafe_slice(), + gray_tensor.unsafe_slice(), + grid_dim=Dim(num_col_blocks, num_row_blocks), + block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + gray_tensor = gray_tensor.move_to(host_device) + + print("Resulting grayscale image:") + print_image[IMAGE_HEIGHT, IMAGE_WIDTH](gray_tensor) + else: + print( + "These examples require a MAX-compatible NVIDIA GPU and none was" + " detected." + ) diff --git a/examples/gpu_functions/mandelbrot.mojo b/examples/gpu_functions/mandelbrot.mojo index 4356e624b1..608eeea706 100755 --- a/examples/gpu_functions/mandelbrot.mojo +++ b/examples/gpu_functions/mandelbrot.mojo @@ -18,6 +18,7 @@ from gpu.id import thread_idx, block_dim, block_idx from math import ceildiv from max.driver import DynamicTensor, Tensor, accelerator_device, cpu_device from max.driver.accelerator import compile +from sys import has_nvidia_gpu_accelerator alias float_dtype = DType.float32 alias int_dtype = DType.int32 @@ -76,54 +77,61 @@ fn mandelbrot( def main(): - # Attempt to connect to a compatible GPU. If one is not found, this will - # error out and exit. - gpu_device = accelerator_device() - host_device = cpu_device() - - # Compile the function to run across a grid on the GPU. - gpu_function = compile[mandelbrot](gpu_device) - - # Set the resolution of the Mandelbrot set grid that will be calculated. - alias GRID_WIDTH = 60 - alias GRID_HEIGHT = 25 - - # The grid is divided up into blocks, making sure there's an extra - # full block for any remainder. This hasn't been tuned for any specific - # GPU. - alias BLOCK_SIZE = 16 - num_col_blocks = ceildiv(GRID_WIDTH, BLOCK_SIZE) - num_row_blocks = ceildiv(GRID_HEIGHT, BLOCK_SIZE) - - # Set the parameters for the area of the Mandelbrot set we'll be examining. - alias MIN_X: Scalar[float_dtype] = -2.0 - alias MAX_X: Scalar[float_dtype] = 0.7 - alias MIN_Y: Scalar[float_dtype] = -1.12 - alias MAX_Y: Scalar[float_dtype] = 1.12 - alias SCALE_X = (MAX_X - MIN_X) / GRID_WIDTH - alias SCALE_Y = (MAX_Y - MIN_Y) / GRID_HEIGHT - alias MAX_ITERATIONS = 100 - - # Allocate a tensor on the target device to hold the resulting set. - out_tensor = Tensor[int_dtype, 2]((GRID_HEIGHT, GRID_WIDTH), gpu_device) - - # Launch the compiled function on the GPU. The target device is specified - # first, followed by all function arguments. The last two named parameters - # are the dimensions of the grid in blocks, and the block dimensions. - gpu_function( - gpu_device, - MIN_X, - MIN_Y, - SCALE_X, - SCALE_Y, - MAX_ITERATIONS, - out_tensor.unsafe_slice(), - grid_dim=Dim(num_col_blocks, num_row_blocks), - block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), - ) - - # Move the output tensor back onto the CPU so that we can read the results. - out_tensor = out_tensor.move_to(host_device) - - # Draw the final Mandelbrot set. - draw_mandelbrot[GRID_HEIGHT, GRID_WIDTH](out_tensor, max=MAX_ITERATIONS) + @parameter + if has_nvidia_gpu_accelerator(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[mandelbrot](gpu_device) + + # Set the resolution of the Mandelbrot set grid that will be calculated. + alias GRID_WIDTH = 60 + alias GRID_HEIGHT = 25 + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + num_col_blocks = ceildiv(GRID_WIDTH, BLOCK_SIZE) + num_row_blocks = ceildiv(GRID_HEIGHT, BLOCK_SIZE) + + # Set the parameters for the area of the Mandelbrot set we'll be examining. + alias MIN_X: Scalar[float_dtype] = -2.0 + alias MAX_X: Scalar[float_dtype] = 0.7 + alias MIN_Y: Scalar[float_dtype] = -1.12 + alias MAX_Y: Scalar[float_dtype] = 1.12 + alias SCALE_X = (MAX_X - MIN_X) / GRID_WIDTH + alias SCALE_Y = (MAX_Y - MIN_Y) / GRID_HEIGHT + alias MAX_ITERATIONS = 100 + + # Allocate a tensor on the target device to hold the resulting set. + out_tensor = Tensor[int_dtype, 2]((GRID_HEIGHT, GRID_WIDTH), gpu_device) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + MIN_X, + MIN_Y, + SCALE_X, + SCALE_Y, + MAX_ITERATIONS, + out_tensor.unsafe_slice(), + grid_dim=Dim(num_col_blocks, num_row_blocks), + block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + out_tensor = out_tensor.move_to(host_device) + + # Draw the final Mandelbrot set. + draw_mandelbrot[GRID_HEIGHT, GRID_WIDTH](out_tensor, max=MAX_ITERATIONS) + else: + print( + "These examples require a MAX-compatible NVIDIA GPU and none was" + " detected." + ) diff --git a/examples/gpu_functions/naive_matrix_multiplication.mojo b/examples/gpu_functions/naive_matrix_multiplication.mojo index 515f87e2b5..1e0d6e0dd4 100755 --- a/examples/gpu_functions/naive_matrix_multiplication.mojo +++ b/examples/gpu_functions/naive_matrix_multiplication.mojo @@ -23,6 +23,7 @@ from max.driver import ( cpu_device, ) from max.driver.accelerator import compile +from sys import has_nvidia_gpu_accelerator alias float_dtype = DType.float32 alias tensor_rank = 2 @@ -47,64 +48,71 @@ fn naive_matrix_multiplication( def main(): - # Attempt to connect to a compatible GPU. If one is not found, this will - # error out and exit. - gpu_device = accelerator_device() - host_device = cpu_device() - - alias I = 5 - alias J = 4 - alias K = 6 - - # Allocate the two input matrices on the host. - m_tensor = Tensor[float_dtype, tensor_rank]((I, J), host_device) - n_tensor = Tensor[float_dtype, tensor_rank]((J, K), host_device) - - # Fill them with initial values. - for m_row in range(I): - for m_col in range(J): - m_tensor[m_row, m_col] = m_row - m_col - - for n_row in range(J): - for n_col in range(K): - n_tensor[n_row, n_col] = n_row + n_col - - print("M matrix:", m_tensor) - print("N matrix:", n_tensor) - - # Move the input matrices to the accelerator. - m_tensor = m_tensor.move_to(gpu_device) - n_tensor = n_tensor.move_to(gpu_device) - - # Allocate a tensor on the accelerator to host the calculation results. - p_tensor = Tensor[float_dtype, tensor_rank]((I, K), gpu_device) - - # Compile the function to run across a grid on the GPU. - gpu_function = compile[naive_matrix_multiplication](gpu_device) - - # The grid is divided up into blocks, making sure there's an extra - # full block for any remainder. This hasn't been tuned for any specific - # GPU. - alias BLOCK_SIZE = 16 - num_col_blocks = ceildiv(I, BLOCK_SIZE) - num_row_blocks = ceildiv(J, BLOCK_SIZE) - - # Launch the compiled function on the GPU. The target device is specified - # first, followed by all function arguments. The last two named parameters - # are the dimensions of the grid in blocks, and the block dimensions. - gpu_function( - gpu_device, - I, - J, - K, - m_tensor.unsafe_slice(), - n_tensor.unsafe_slice(), - p_tensor.unsafe_slice(), - grid_dim=Dim(num_col_blocks, num_row_blocks), - block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), - ) - - # Move the output tensor back onto the CPU so that we can read the results. - p_tensor = p_tensor.move_to(host_device) - - print("Resulting matrix:", p_tensor) + @parameter + if has_nvidia_gpu_accelerator(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + alias I = 5 + alias J = 4 + alias K = 6 + + # Allocate the two input matrices on the host. + m_tensor = Tensor[float_dtype, tensor_rank]((I, J), host_device) + n_tensor = Tensor[float_dtype, tensor_rank]((J, K), host_device) + + # Fill them with initial values. + for m_row in range(I): + for m_col in range(J): + m_tensor[m_row, m_col] = m_row - m_col + + for n_row in range(J): + for n_col in range(K): + n_tensor[n_row, n_col] = n_row + n_col + + print("M matrix:", m_tensor) + print("N matrix:", n_tensor) + + # Move the input matrices to the accelerator. + m_tensor = m_tensor.move_to(gpu_device) + n_tensor = n_tensor.move_to(gpu_device) + + # Allocate a tensor on the accelerator to host the calculation results. + p_tensor = Tensor[float_dtype, tensor_rank]((I, K), gpu_device) + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[naive_matrix_multiplication](gpu_device) + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + num_col_blocks = ceildiv(I, BLOCK_SIZE) + num_row_blocks = ceildiv(J, BLOCK_SIZE) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + I, + J, + K, + m_tensor.unsafe_slice(), + n_tensor.unsafe_slice(), + p_tensor.unsafe_slice(), + grid_dim=Dim(num_col_blocks, num_row_blocks), + block_dim=Dim(BLOCK_SIZE, BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + p_tensor = p_tensor.move_to(host_device) + + print("Resulting matrix:", p_tensor) + else: + print( + "These examples require a MAX-compatible NVIDIA GPU and none was" + " detected." + ) diff --git a/examples/gpu_functions/vector_addition.mojo b/examples/gpu_functions/vector_addition.mojo index dd4aaa4361..951eb3ed50 100755 --- a/examples/gpu_functions/vector_addition.mojo +++ b/examples/gpu_functions/vector_addition.mojo @@ -22,6 +22,7 @@ from max.driver import ( cpu_device, ) from max.driver.accelerator import compile +from sys import has_nvidia_gpu_accelerator alias float_dtype = DType.float32 alias tensor_rank = 1 @@ -42,52 +43,61 @@ fn vector_addition( def main(): - # Attempt to connect to a compatible GPU. If one is not found, this will - # error out and exit. - gpu_device = accelerator_device() - host_device = cpu_device() - - alias VECTOR_WIDTH = 10 - - # Allocate the two input tensors on the host. - lhs_tensor = Tensor[float_dtype, 1]((VECTOR_WIDTH), host_device) - rhs_tensor = Tensor[float_dtype, 1]((VECTOR_WIDTH), host_device) - - # Fill them with initial values. - for i in range(VECTOR_WIDTH): - lhs_tensor[i] = 1.25 - rhs_tensor[i] = 2.5 - - # Move the input tensors to the accelerator. - lhs_tensor = lhs_tensor.move_to(gpu_device) - rhs_tensor = rhs_tensor.move_to(gpu_device) - - # Allocate a tensor on the accelerator to host the calculation results. - out_tensor = Tensor[float_dtype, tensor_rank]((VECTOR_WIDTH), gpu_device) - - # Compile the function to run across a grid on the GPU. - gpu_function = compile[vector_addition](gpu_device) - - # The grid is divided up into blocks, making sure there's an extra - # full block for any remainder. This hasn't been tuned for any specific - # GPU. - alias BLOCK_SIZE = 16 - var num_blocks = ceildiv(VECTOR_WIDTH, BLOCK_SIZE) - - # Launch the compiled function on the GPU. The target device is specified - # first, followed by all function arguments. The last two named parameters - # are the dimensions of the grid in blocks, and the block dimensions. - gpu_function( - gpu_device, - VECTOR_WIDTH, - lhs_tensor.unsafe_slice(), - rhs_tensor.unsafe_slice(), - out_tensor.unsafe_slice(), - grid_dim=Dim(num_blocks), - block_dim=Dim(BLOCK_SIZE), - ) - - # Move the output tensor back onto the CPU so that we can read the results. - out_tensor = out_tensor.move_to(host_device) - - print("Resulting vector:", out_tensor) + @parameter + if has_nvidia_gpu_accelerator(): + # Attempt to connect to a compatible GPU. If one is not found, this will + # error out and exit. + gpu_device = accelerator_device() + host_device = cpu_device() + + alias VECTOR_WIDTH = 10 + + # Allocate the two input tensors on the host. + lhs_tensor = Tensor[float_dtype, 1]((VECTOR_WIDTH), host_device) + rhs_tensor = Tensor[float_dtype, 1]((VECTOR_WIDTH), host_device) + + # Fill them with initial values. + for i in range(VECTOR_WIDTH): + lhs_tensor[i] = 1.25 + rhs_tensor[i] = 2.5 + + # Move the input tensors to the accelerator. + lhs_tensor = lhs_tensor.move_to(gpu_device) + rhs_tensor = rhs_tensor.move_to(gpu_device) + + # Allocate a tensor on the accelerator to host the calculation results. + out_tensor = Tensor[float_dtype, tensor_rank]( + (VECTOR_WIDTH), gpu_device + ) + + # Compile the function to run across a grid on the GPU. + gpu_function = compile[vector_addition](gpu_device) + + # The grid is divided up into blocks, making sure there's an extra + # full block for any remainder. This hasn't been tuned for any specific + # GPU. + alias BLOCK_SIZE = 16 + var num_blocks = ceildiv(VECTOR_WIDTH, BLOCK_SIZE) + + # Launch the compiled function on the GPU. The target device is specified + # first, followed by all function arguments. The last two named parameters + # are the dimensions of the grid in blocks, and the block dimensions. + gpu_function( + gpu_device, + VECTOR_WIDTH, + lhs_tensor.unsafe_slice(), + rhs_tensor.unsafe_slice(), + out_tensor.unsafe_slice(), + grid_dim=Dim(num_blocks), + block_dim=Dim(BLOCK_SIZE), + ) + + # Move the output tensor back onto the CPU so that we can read the results. + out_tensor = out_tensor.move_to(host_device) + + print("Resulting vector:", out_tensor) + else: + print( + "These examples require a MAX-compatible NVIDIA GPU and none was" + " detected." + ) From 32883bcd85999e1f1ee2589cf366b76fa3848fff Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Thu, 27 Feb 2025 19:33:49 -0500 Subject: [PATCH 40/44] [Kernels] Improve ergonomics for custom ops benchmarking Allow constructing a `ManagedTensorSlice` with random / sequential numbers using the `StaticTensorSpec` to determine the number and type of elements to initialize. This improves ergonomics when testing and benchmarking custom ops. MODULAR_ORIG_COMMIT_REV_ID: 06122a82d16097ffdf1510ba50389691b2d82e10 --- examples/custom_ops/benchmarks.mojo | 127 +++++++++++++--------------- 1 file changed, 60 insertions(+), 67 deletions(-) diff --git a/examples/custom_ops/benchmarks.mojo b/examples/custom_ops/benchmarks.mojo index b2f7962c05..67490d0c16 100644 --- a/examples/custom_ops/benchmarks.mojo +++ b/examples/custom_ops/benchmarks.mojo @@ -61,13 +61,11 @@ def top_k(): out_lambda=None, ) - var in_vals = UnsafePointer[Scalar[val_dtype]].alloc(els) - var out_vals = UnsafePointer[Scalar[val_dtype]].alloc(els) - var out_idxs = UnsafePointer[Scalar[idx_dtype]].alloc(els) + var in_vals = InputTensor[static_spec=val_spec].rand() + var out_vals = OutputTensor[static_spec=val_spec].rand() + var out_idxs = OutputTensor[static_spec=idx_spec].rand() - rand(in_vals, els) - - var cpu_ctx_ptr = cpu().unsafe_ptr() + var cpu_ctx = DeviceContext(api="cpu") @parameter @always_inline @@ -76,10 +74,7 @@ def top_k(): @always_inline fn run_bench() raises: TopK.execute[K=K, target="cpu"]( - out_vals=OutputTensor[static_spec=val_spec](out_vals, shape), - out_idxs=OutputTensor[static_spec=idx_spec](out_idxs, shape), - in_vals=InputTensor[static_spec=val_spec](in_vals, shape), - ctx=cpu_ctx_ptr, + out_vals, out_idxs, in_vals, cpu_ctx ) b.iter[run_bench]() @@ -93,44 +88,48 @@ def top_k(): @parameter if has_nvidia_gpu_accelerator() or has_amd_gpu_accelerator(): var gpu_ctx = DeviceContext() - var dev_in_vals = gpu_ctx.enqueue_create_buffer[val_dtype](els) - var dev_out_vals = gpu_ctx.enqueue_create_buffer[val_dtype](els) - var dev_out_idxs = gpu_ctx.enqueue_create_buffer[idx_dtype](els) - gpu_ctx.copy(dev_in_vals, in_vals) + + var in_vals_dev_buff = gpu_ctx.enqueue_create_buffer[val_dtype](els) + var out_vals_dev_buff = gpu_ctx.enqueue_create_buffer[val_dtype](els) + var out_idxs_dev_buff = gpu_ctx.enqueue_create_buffer[idx_dtype](els) + + gpu_ctx.enqueue_copy(in_vals_dev_buff, in_vals.unsafe_ptr()) + + var out_vals_dev = OutputTensor[static_spec=val_spec]( + out_vals_dev_buff.unsafe_ptr(), shape + ) + var out_idxs_dev = OutputTensor[static_spec=idx_spec]( + out_idxs_dev_buff.unsafe_ptr(), shape + ) + var in_vals_dev = InputTensor[static_spec=val_spec]( + in_vals_dev_buff.unsafe_ptr(), shape + ) @parameter @always_inline fn bench_gpu(mut b: Bencher) raises: @parameter @always_inline - fn kernel_launch() raises: + fn kernel_launch(gpu_ctx: DeviceContext) raises: TopK.execute[K=K, target="gpu"]( - out_vals=OutputTensor[static_spec=val_spec]( - dev_out_vals.unsafe_ptr(), shape - ), - out_idxs=OutputTensor[static_spec=idx_spec]( - dev_out_idxs.unsafe_ptr(), shape - ), - in_vals=InputTensor[static_spec=val_spec]( - dev_in_vals.unsafe_ptr(), shape - ), - ctx=gpu_ctx, + out_vals_dev, out_idxs_dev, in_vals_dev, gpu_ctx ) - b.iter[kernel_launch]() + b.iter_custom[kernel_launch](gpu_ctx) b.bench_function[bench_gpu]( BenchId("top_k_custom", "gpu"), flops, elements ) - _ = gpu_ctx + _ = in_vals_dev_buff + _ = out_vals_dev_buff + _ = out_idxs_dev_buff b.config.verbose_metric_names = False print(b) - _ = cpu_ctx_ptr - in_vals.free() - out_vals.free() - out_idxs.free() + _ = in_vals + _ = out_vals + _ = out_idxs def matmul(): @@ -178,18 +177,11 @@ def matmul(): out_lambda=None, ) - var a_ptr = UnsafePointer[Scalar[dtype]].alloc(a_els) - var b_ptr = UnsafePointer[Scalar[dtype]].alloc(b_els) - var c_ptr = UnsafePointer[Scalar[dtype]].alloc(c_els) + var a = InputTensor[static_spec=a_spec].rand() + var b = InputTensor[static_spec=b_spec].rand() + var c = OutputTensor[static_spec=c_spec].rand() - var a = InputTensor[static_spec=a_spec](a_ptr, a_shape) - var b = InputTensor[static_spec=b_spec](b_ptr, b_shape) - var c = OutputTensor[static_spec=c_spec](c_ptr, c_shape) - - rand(a_ptr, a_els) - rand(b_ptr, b_els) - - var cpu_ctx_ptr = cpu().unsafe_ptr() + var cpu_ctx = DeviceContext(api="cpu") var bench = Bench() var flops = ThroughputMeasure(BenchMetric.flops, FLOPS) var elements = ThroughputMeasure(BenchMetric.elements, M * N) @@ -201,10 +193,7 @@ def matmul(): @always_inline fn run_bench() raises: MatrixMultiplication["naive"].execute[target="cpu"]( - c, - a, - b, - cpu_ctx_ptr, + c, a, b, cpu_ctx ) bencher.iter[run_bench]() @@ -214,14 +203,22 @@ def matmul(): @parameter if has_nvidia_gpu_accelerator() or has_amd_gpu_accelerator(): var gpu_ctx = DeviceContext() - var a_dev = gpu_ctx.enqueue_create_buffer[dtype](a_els) - var b_dev = gpu_ctx.enqueue_create_buffer[dtype](b_els) - var c_dev = gpu_ctx.enqueue_create_buffer[dtype](c_els) - var c = InputTensor[static_spec=c_spec](c_dev.unsafe_ptr(), c_shape) - var a = OutputTensor[static_spec=a_spec](a_dev.unsafe_ptr(), a_shape) - var b = OutputTensor[static_spec=b_spec](b_dev.unsafe_ptr(), b_shape) - gpu_ctx.copy(a_dev, a_ptr) - gpu_ctx.copy(b_dev, b_ptr) + var a_dev_buf = gpu_ctx.enqueue_create_buffer[dtype](a_els) + var b_dev_buf = gpu_ctx.enqueue_create_buffer[dtype](b_els) + var c_dev_buf = gpu_ctx.enqueue_create_buffer[dtype](c_els) + + gpu_ctx.enqueue_copy(a_dev_buf, a.unsafe_ptr()) + gpu_ctx.enqueue_copy(b_dev_buf, b.unsafe_ptr()) + + var c_dev = InputTensor[static_spec=c_spec]( + c_dev_buf.unsafe_ptr(), c_shape + ) + var a_dev = OutputTensor[static_spec=a_spec]( + a_dev_buf.unsafe_ptr(), a_shape + ) + var b_dev = OutputTensor[static_spec=b_spec]( + b_dev_buf.unsafe_ptr(), b_shape + ) @parameter def bench_matmul_kernel[impl: StringLiteral](): @@ -232,15 +229,10 @@ def matmul(): @always_inline fn kernel_launch(gpu_ctx: DeviceContext) raises: MatrixMultiplication[impl].execute[target="gpu"]( - c, - a, - b, - gpu_ctx, + c_dev, a_dev, b_dev, gpu_ctx ) - var gpu_ctx = DeviceContext() bench.iter_custom[kernel_launch](gpu_ctx) - _ = gpu_ctx bench.bench_function[bench_gpu]( BenchId("gpu", impl), flops, elements @@ -252,17 +244,18 @@ def matmul(): bench_matmul_kernel["tiled_register"]() bench_matmul_kernel["block_tiled"]() bench_matmul_kernel["block_tiled_vectorized"]() - _ = gpu_ctx - _ = a_dev - _ = b_dev - _ = c_dev + # TODO add origin to `ManagedTensorSlice` to avoid this + _ = a_dev_buf + _ = b_dev_buf + _ = c_dev_buf bench.config.verbose_metric_names = False print(bench) - a_ptr.free() - b_ptr.free() - c_ptr.free() + # TODO add origin to `ManagedTensorSlice` to avoid this + _ = a + _ = b + _ = c # TODO: arg parsing to select benchmarks From 6470b771e16d1f7147f25537dcc65ab253731568 Mon Sep 17 00:00:00 2001 From: Laszlo Kindrat Date: Thu, 27 Feb 2025 21:15:57 -0500 Subject: [PATCH 41/44] Revert "[KVCache] rework max_cache_length to max_context_length (#56592)" (#56872) This reverts commit 2ba4178bd602dabfce4b9fb10181b98e42e241cb because it breaks the MI300 CI tests, as well as the torch compile llama3 on ROCm. See [Internal link] MODULAR_ORIG_COMMIT_REV_ID: bc34143cebe46055fbadcb3da5094f735ee82d61 --- src/max/pipelines/kv_cache/_utils.py | 3 +-- src/max/pipelines/kv_cache/continuous_batching_cache.py | 8 +++----- src/max/pipelines/kv_cache/paged_cache.py | 8 +++----- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/max/pipelines/kv_cache/_utils.py b/src/max/pipelines/kv_cache/_utils.py index 1c8389142a..6942ad7823 100644 --- a/src/max/pipelines/kv_cache/_utils.py +++ b/src/max/pipelines/kv_cache/_utils.py @@ -28,7 +28,6 @@ def build_max_lengths_tensor( for step in range(num_steps): max_lengths_np[step, 0] = step_max_seq_length max_lengths_np[step, 1] = step_max_cache_length + step_max_cache_length += step_max_seq_length step_max_seq_length = 1 - step_max_cache_length += 1 - return Tensor.from_numpy(max_lengths_np) diff --git a/src/max/pipelines/kv_cache/continuous_batching_cache.py b/src/max/pipelines/kv_cache/continuous_batching_cache.py index cb7936d97a..b6f75e9c8a 100644 --- a/src/max/pipelines/kv_cache/continuous_batching_cache.py +++ b/src/max/pipelines/kv_cache/continuous_batching_cache.py @@ -255,7 +255,7 @@ def _fetch( cache_lengths_np = np.zeros(active_batch_size, np.uint32) max_seq_length = 0 - max_context_length = 0 + max_cache_length = 0 for i, (seq_id, prompt) in enumerate(seq_ids_and_prompts.items()): if seq_id > self.max_batch_size: @@ -281,9 +281,7 @@ def _fetch( # Update the maximum lengths seen so far. max_seq_length = max(max_seq_length, len(prompt)) - max_context_length = max( - max_context_length, cache_len + len(prompt) - ) + max_cache_length = max(max_cache_length, cache_len) cache_lengths = [ Tensor.from_numpy(cache_lengths_np).to(d) for d in self.devices @@ -296,7 +294,7 @@ def _fetch( # Build a tensor of maximum lengths. Each step slices the first row to # advance to the values for the next row. max_lengths_host = build_max_lengths_tensor( - num_steps, max_seq_length, max_context_length + num_steps, max_seq_length, max_cache_length ) result = [ diff --git a/src/max/pipelines/kv_cache/paged_cache.py b/src/max/pipelines/kv_cache/paged_cache.py index 6e8ba7d7ee..cc36c1bf3d 100644 --- a/src/max/pipelines/kv_cache/paged_cache.py +++ b/src/max/pipelines/kv_cache/paged_cache.py @@ -567,7 +567,7 @@ def _fetch( # Determine the number of pages required for each sequence. max_seq_length = 0 - max_context_length = 0 + max_cache_length = 0 total_sequence_length = 0 total_blocks_to_allocate = 0 blocks_to_allocate_by_seq = {} @@ -582,9 +582,7 @@ def _fetch( # Update the maximum lengths seen so far. max_seq_length = max(max_seq_length, len(prompt)) - max_context_length = max( - max_context_length, cache_length + len(prompt) - ) + max_cache_length = max(max_cache_length, cache_length) # Compute the total sequence length and the number of pages required to store it. total_sequence_length += data.seq_len @@ -631,7 +629,7 @@ def _fetch( # Build a tensor of maximum lengths. Each step slices the first row to # advance to the values for the next row. max_lengths_host = build_max_lengths_tensor( - num_steps, max_seq_length, max_context_length + num_steps, max_seq_length, max_cache_length ) lut_table_host = Tensor.from_numpy(lut_table_np) From 9116c0c43e894d0652fb662c69137f58ffa3d686 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Thu, 27 Feb 2025 20:47:26 -0800 Subject: [PATCH 42/44] Update README diagram MODULAR_ORIG_COMMIT_REV_ID: c9f17deec51aaf559b4b7546100228d046a4fe6c --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 24507ed98d..dec744d018 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ commonly fragmented AI deployment workflows. MAX accelerates time to market for the latest innovations by giving AI developers a single toolchain that unlocks full programmability, unparalleled performance, and seamless hardware portability. -![Modular Architecture Diagram](https://modular-assets.s3.amazonaws.com/images/modular_architecture_diagram_bg.png) +![](https://docs.modular.com/images/github/max-stack.png) [See here to get started with MAX](https://docs.modular.com/max/get-started) and when you want to report issues or request features, From b3dfb49827627801d2b8119ed1994edcc3fde772 Mon Sep 17 00:00:00 2001 From: abdul dakkak Date: Thu, 27 Feb 2025 20:59:45 -0800 Subject: [PATCH 43/44] [Stdlib] Add StringLiteral compress/decompress private functions This adds helper functions on StringLiteral to be able to do compile time compression/decompression. MODULAR_ORIG_COMMIT_REV_ID: a5e8b20e84e797dbab07bbb4c9b5384da63873bd --- mojo/stdlib/src/builtin/string_literal.mojo | 18 ++++++++++++++++++ .../test/builtin/test_string_literal.mojo | 17 ++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/mojo/stdlib/src/builtin/string_literal.mojo b/mojo/stdlib/src/builtin/string_literal.mojo index 6365aba14d..f72938df4b 100644 --- a/mojo/stdlib/src/builtin/string_literal.mojo +++ b/mojo/stdlib/src/builtin/string_literal.mojo @@ -973,3 +973,21 @@ fn _base64_decode[str: StringLiteral]() -> StringLiteral: A new string literal with the Base64 decoded string. """ return __mlir_op.`pop.string.base64.decode`(str.value) + + +fn _compress[str: StringLiteral]() -> StringLiteral: + """Compress the string literal using zlib. + + Returns: + A new string literal with the compressed string. + """ + return __mlir_op.`pop.string.compress`(str.value) + + +fn _decompress[str: StringLiteral]() -> StringLiteral: + """Decompress the string literal using zlib. + + Returns: + A new string literal with the decompressed string. + """ + return __mlir_op.`pop.string.decompress`(str.value) diff --git a/mojo/stdlib/test/builtin/test_string_literal.mojo b/mojo/stdlib/test/builtin/test_string_literal.mojo index de10a42d19..a8da563eb3 100644 --- a/mojo/stdlib/test/builtin/test_string_literal.mojo +++ b/mojo/stdlib/test/builtin/test_string_literal.mojo @@ -22,7 +22,12 @@ from testing import ( assert_raises, assert_true, ) -from builtin.string_literal import _base64_encode, _base64_decode +from builtin.string_literal import ( + _base64_encode, + _base64_decode, + _compress, + _decompress, +) def test_add(): @@ -535,6 +540,15 @@ def test_base64_encode_decode(): assert_equal(decoded, "I'm a mojo string") +def test_compress_decompress(): + alias compressed = _compress["hello"]() + alias decompressed = _decompress[compressed]() + alias compressed_base64 = _base64_encode[compressed]() + assert_equal(compressed_base64, "eNrLSM3JyQcABiwCFQ==") + assert_equal(len(compressed), 13) + assert_equal(decompressed, "hello") + + def main(): test_add() test_iadd() @@ -569,3 +583,4 @@ def main(): test_float_conversion() test_string_literal_from_stringable() test_base64_encode_decode() + test_compress_decompress() From b29a1f737e33d656bfee64e856069d3c68acce90 Mon Sep 17 00:00:00 2001 From: modularbot Date: Fri, 28 Feb 2025 07:09:14 +0000 Subject: [PATCH 44/44] Update lockfiles to point to latest nightly version: 25.2.0.dev2025022805 --- examples/custom_ops/magic.lock | 146 +++++------ examples/gpu_functions/magic.lock | 146 +++++------ examples/graph-api/magic.lock | 146 +++++------ .../inference/bert-c-torchscript/magic.lock | 146 +++++------ .../bert-mojo-torchscript/magic.lock | 146 +++++------ .../bert-python-torchscript/magic.lock | 146 +++++------ .../resnet50-python-torchscript/magic.lock | 146 +++++------ .../stable-diffusion-mojo-onnx/magic.lock | 146 +++++------ .../stable-diffusion-python-onnx/magic.lock | 146 +++++------ .../inference/yolo-python-onnx/magic.lock | 146 +++++------ examples/mojo/life/magic.lock | 146 +++++------ examples/mojo/magic.lock | 146 +++++------ examples/mojo/operators/magic.lock | 146 +++++------ examples/mojo/testing/magic.lock | 146 +++++------ examples/notebooks/magic.lock | 146 +++++------ examples/offline-inference/magic.lock | 227 +++++++++--------- mojo/magic.lock | 146 +++++------ src/max/magic.lock | 227 +++++++++--------- tutorials/hello-magic/local/magic.lock | 110 ++++----- tutorials/hello-magic/magic.lock | 130 +++++----- tutorials/max-graph-api/magic.lock | 110 ++++----- 21 files changed, 1569 insertions(+), 1571 deletions(-) diff --git a/examples/custom_ops/magic.lock b/examples/custom_ops/magic.lock index 9473097321..6014677668 100644 --- a/examples/custom_ops/magic.lock +++ b/examples/custom_ops/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -107,11 +107,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -163,11 +163,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1301,48 +1301,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1357,7 +1357,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1379,14 +1379,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1401,7 +1401,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1423,14 +1423,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1445,7 +1445,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1467,12 +1467,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1484,19 +1484,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/gpu_functions/magic.lock b/examples/gpu_functions/magic.lock index 9473097321..6014677668 100644 --- a/examples/gpu_functions/magic.lock +++ b/examples/gpu_functions/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -107,11 +107,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -163,11 +163,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1301,48 +1301,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1357,7 +1357,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1379,14 +1379,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1401,7 +1401,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1423,14 +1423,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1445,7 +1445,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1467,12 +1467,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1484,19 +1484,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/graph-api/magic.lock b/examples/graph-api/magic.lock index 9473097321..6014677668 100644 --- a/examples/graph-api/magic.lock +++ b/examples/graph-api/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -107,11 +107,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -163,11 +163,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1301,48 +1301,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1357,7 +1357,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1379,14 +1379,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1401,7 +1401,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1423,14 +1423,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1445,7 +1445,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1467,12 +1467,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1484,19 +1484,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/inference/bert-c-torchscript/magic.lock b/examples/inference/bert-c-torchscript/magic.lock index d732b1f8d7..5362cc4f1e 100644 --- a/examples/inference/bert-c-torchscript/magic.lock +++ b/examples/inference/bert-c-torchscript/magic.lock @@ -137,14 +137,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -310,11 +310,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -470,11 +470,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -4892,48 +4892,48 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -4948,7 +4948,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -4970,14 +4970,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -4992,7 +4992,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5014,14 +5014,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5036,7 +5036,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5058,12 +5058,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5075,7 +5075,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -5114,18 +5114,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/examples/inference/bert-mojo-torchscript/magic.lock b/examples/inference/bert-mojo-torchscript/magic.lock index 092e126f9f..e822223a82 100644 --- a/examples/inference/bert-mojo-torchscript/magic.lock +++ b/examples/inference/bert-mojo-torchscript/magic.lock @@ -139,14 +139,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -315,11 +315,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -478,11 +478,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -4885,48 +4885,48 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -4941,7 +4941,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -4963,14 +4963,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -4985,7 +4985,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5007,14 +5007,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5029,7 +5029,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5051,12 +5051,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5068,7 +5068,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -5107,18 +5107,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/examples/inference/bert-python-torchscript/magic.lock b/examples/inference/bert-python-torchscript/magic.lock index 092e126f9f..e822223a82 100644 --- a/examples/inference/bert-python-torchscript/magic.lock +++ b/examples/inference/bert-python-torchscript/magic.lock @@ -139,14 +139,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -315,11 +315,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -478,11 +478,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -4885,48 +4885,48 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -4941,7 +4941,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -4963,14 +4963,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -4985,7 +4985,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5007,14 +5007,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5029,7 +5029,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5051,12 +5051,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5068,7 +5068,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -5107,18 +5107,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/examples/inference/resnet50-python-torchscript/magic.lock b/examples/inference/resnet50-python-torchscript/magic.lock index 87999c426a..d2a25733af 100644 --- a/examples/inference/resnet50-python-torchscript/magic.lock +++ b/examples/inference/resnet50-python-torchscript/magic.lock @@ -148,14 +148,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -338,11 +338,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -515,11 +515,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -5304,48 +5304,48 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5360,7 +5360,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5382,14 +5382,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5404,7 +5404,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5426,14 +5426,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5448,7 +5448,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5470,12 +5470,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5487,7 +5487,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -5526,18 +5526,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/examples/inference/stable-diffusion-mojo-onnx/magic.lock b/examples/inference/stable-diffusion-mojo-onnx/magic.lock index 9220a3345d..10dde0f00b 100644 --- a/examples/inference/stable-diffusion-mojo-onnx/magic.lock +++ b/examples/inference/stable-diffusion-mojo-onnx/magic.lock @@ -148,14 +148,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -338,11 +338,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -515,11 +515,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -5350,48 +5350,48 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5406,7 +5406,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5428,14 +5428,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5450,7 +5450,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5472,14 +5472,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5494,7 +5494,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5516,12 +5516,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5533,7 +5533,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -5572,18 +5572,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/examples/inference/stable-diffusion-python-onnx/magic.lock b/examples/inference/stable-diffusion-python-onnx/magic.lock index 38419fcd65..4c5bcd186f 100644 --- a/examples/inference/stable-diffusion-python-onnx/magic.lock +++ b/examples/inference/stable-diffusion-python-onnx/magic.lock @@ -149,14 +149,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -339,11 +339,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.16-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -518,11 +518,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -5449,48 +5449,48 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5505,7 +5505,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5527,14 +5527,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5549,7 +5549,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5571,14 +5571,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5593,7 +5593,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5615,12 +5615,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5632,7 +5632,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -5671,18 +5671,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/examples/inference/yolo-python-onnx/magic.lock b/examples/inference/yolo-python-onnx/magic.lock index 59433dc061..8f5d689f15 100644 --- a/examples/inference/yolo-python-onnx/magic.lock +++ b/examples/inference/yolo-python-onnx/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -110,11 +110,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -169,11 +169,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1310,48 +1310,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1366,7 +1366,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1388,14 +1388,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1410,7 +1410,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1432,14 +1432,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1454,7 +1454,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1476,12 +1476,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1493,19 +1493,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/mojo/life/magic.lock b/examples/mojo/life/magic.lock index 1aec52b09f..585b1566bd 100644 --- a/examples/mojo/life/magic.lock +++ b/examples/mojo/life/magic.lock @@ -103,11 +103,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda @@ -258,11 +258,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.6-h2e0c361_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda @@ -384,11 +384,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpg123-1.32.9-hf642e45_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda @@ -3498,48 +3498,48 @@ packages: license_family: BSD size: 184953 timestamp: 1733740984533 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -3554,7 +3554,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -3576,14 +3576,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -3598,7 +3598,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -3620,14 +3620,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -3642,7 +3642,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -3664,12 +3664,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -3681,19 +3681,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 md5: c7f302fd11eeb0987a6a5e1f3aed6a21 diff --git a/examples/mojo/magic.lock b/examples/mojo/magic.lock index c06e7e4f53..a425fa05de 100644 --- a/examples/mojo/magic.lock +++ b/examples/mojo/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda @@ -107,11 +107,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py311h69ead2a_0.conda @@ -163,11 +163,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda @@ -1301,48 +1301,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1357,7 +1357,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1379,14 +1379,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1401,7 +1401,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1423,14 +1423,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1445,7 +1445,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1467,12 +1467,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1484,19 +1484,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/mojo/operators/magic.lock b/examples/mojo/operators/magic.lock index 9473097321..6014677668 100644 --- a/examples/mojo/operators/magic.lock +++ b/examples/mojo/operators/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -107,11 +107,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -163,11 +163,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1301,48 +1301,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1357,7 +1357,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1379,14 +1379,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1401,7 +1401,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1423,14 +1423,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1445,7 +1445,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1467,12 +1467,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1484,19 +1484,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/mojo/testing/magic.lock b/examples/mojo/testing/magic.lock index 9473097321..6014677668 100644 --- a/examples/mojo/testing/magic.lock +++ b/examples/mojo/testing/magic.lock @@ -42,11 +42,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -107,11 +107,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -163,11 +163,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1301,48 +1301,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1357,7 +1357,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1379,14 +1379,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1401,7 +1401,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1423,14 +1423,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1445,7 +1445,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1467,12 +1467,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1484,19 +1484,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/notebooks/magic.lock b/examples/notebooks/magic.lock index ee529cc1e2..274f502b9a 100644 --- a/examples/notebooks/magic.lock +++ b/examples/notebooks/magic.lock @@ -93,12 +93,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda @@ -260,12 +260,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda @@ -419,12 +419,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda @@ -2460,48 +2460,48 @@ packages: license_family: BSD size: 14467 timestamp: 1733417051523 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -2516,7 +2516,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -2538,14 +2538,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -2560,7 +2560,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -2582,14 +2582,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -2604,7 +2604,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -2626,12 +2626,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -2643,7 +2643,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda sha256: 63d5308ac732b2f8130702c83ee40ce31c5451ebcb6e70075b771cc8f7df0156 md5: 0982b0f06168fe3421d09f70596ca1f0 @@ -2654,18 +2654,18 @@ packages: license_family: BSD size: 68903 timestamp: 1739952304731 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/examples/offline-inference/magic.lock b/examples/offline-inference/magic.lock index c7344b5c98..3c530fd9ab 100644 --- a/examples/offline-inference/magic.lock +++ b/examples/offline-inference/magic.lock @@ -150,14 +150,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -248,9 +248,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.2.0-cuda126py312h5a3d8a8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda @@ -418,13 +418,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -515,9 +515,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/triton-3.2.0-cuda126py312h1ed5fa8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda @@ -665,13 +665,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -760,9 +760,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda @@ -5502,48 +5502,48 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda noarch: python - sha256: 1e46a465f1d8e75afa9822717e6c6ee75965c078d0cd7b217c4f8622847e9fb0 - md5: 7257078fedac4bbfb961c30a84e2c387 + sha256: 3d909e8fd23a5e058ab59ad760423a0ecd55f51ac474a282cd00f698dd958c33 + md5: f511490d5e1d505c3df07f17c3b6d1e6 depends: - - max-python ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022805 release - aiohttp >=3.11.12 - fastapi >=0.114.2 - gguf >=0.14.0 @@ -5553,7 +5553,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5575,14 +5575,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 10365 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 10380 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5597,7 +5597,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5619,14 +5619,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5641,7 +5641,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5663,14 +5663,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5685,7 +5685,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5707,12 +5707,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5724,7 +5724,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -5748,18 +5748,18 @@ packages: license_family: Proprietary size: 124718448 timestamp: 1730231808335 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf @@ -8294,42 +8294,41 @@ packages: license_family: MIT size: 103306412 timestamp: 1738676445445 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 - md5: 170a0398946d8f5b454e592672b6fc20 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + sha256: fa6eeb42e3bddff74126dd61b01b21a3f4f4791368e93bc5a5775563542b2d4e + md5: 1152565b06e3dc27794c3c11f1050005 depends: + - typer-slim-standard ==0.15.2 h801b22e_0 - python >=3.9 - - typer-slim-standard 0.15.1 hd8ed1ab_0 + - python license: MIT - license_family: MIT - size: 56175 - timestamp: 1733408582623 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 - md5: 0218b16f5a1dd569e575a7a6415489db + size: 76158 + timestamp: 1740697495168 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + sha256: c094713560bfacab0539c863010a5223171d9980cbd419cc799e474ae15aca08 + md5: 7c8d9609e2cfe08dd7672e10fe7e7de9 depends: - - click >=8.0.0 - python >=3.9 + - click >=8.0.0 - typing_extensions >=3.7.4.3 + - python constrains: + - typer 0.15.2.* - rich >=10.11.0 - - typer >=0.15.1,<0.15.2.0a0 - shellingham >=1.3.0 license: MIT - license_family: MIT - size: 43592 - timestamp: 1733408569554 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda - sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f - md5: 4e603c43bfdfc7b533be087c3e070cc9 + size: 45866 + timestamp: 1740697495167 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda + sha256: 79b6b34e90e50e041908939d53053f69285714b0082a0370fba6ab3b38315c8d + md5: ea164fc4e03f61f7ff3c1166001969af depends: + - typer-slim ==0.15.2 pyh29332c3_0 - rich - shellingham - - typer-slim 0.15.1 pyhd8ed1ab_0 license: MIT - license_family: MIT - size: 49531 - timestamp: 1733408570063 + size: 5409 + timestamp: 1740697495168 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda noarch: python sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 diff --git a/mojo/magic.lock b/mojo/magic.lock index 7c733a088a..d586b02bb2 100644 --- a/mojo/magic.lock +++ b/mojo/magic.lock @@ -43,11 +43,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -109,11 +109,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda @@ -166,11 +166,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lit-19.1.7-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -1313,48 +1313,48 @@ packages: license_family: APACHE size: 280830 timestamp: 1736986295869 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1369,7 +1369,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1391,14 +1391,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1413,7 +1413,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1435,14 +1435,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1457,7 +1457,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1479,12 +1479,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1496,19 +1496,19 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + timestamp: 1740719805200 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe md5: 29097e7ea634a45cc5386b95cac6568f diff --git a/src/max/magic.lock b/src/max/magic.lock index c7344b5c98..3c530fd9ab 100644 --- a/src/max/magic.lock +++ b/src/max/magic.lock @@ -150,14 +150,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -248,9 +248,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.2.0-cuda126py312h5a3d8a8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda @@ -418,13 +418,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -515,9 +515,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/triton-3.2.0-cuda126py312h1ed5fa8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda @@ -665,13 +665,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -760,9 +760,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.49.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda @@ -5502,48 +5502,48 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022718-release.conda - sha256: 250c35ecccd302e6c7de836ac200a5ece92e74508c2590c585d8803d488fd650 - md5: d88728b468c85902512a0f9b99251035 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.2.0.dev2025022805-release.conda + sha256: 2c06fc3f0a5ff31b90531e477e1bc8edcbf530a05146c9afb148819b3115d4a6 + md5: 654fe24f42ae167dd46e5858b512fd64 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 252108573 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 252165614 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/max-pipelines-25.2.0.dev2025022805-release.conda noarch: python - sha256: 1e46a465f1d8e75afa9822717e6c6ee75965c078d0cd7b217c4f8622847e9fb0 - md5: 7257078fedac4bbfb961c30a84e2c387 + sha256: 3d909e8fd23a5e058ab59ad760423a0ecd55f51ac474a282cd00f698dd958c33 + md5: f511490d5e1d505c3df07f17c3b6d1e6 depends: - - max-python ==25.2.0.dev2025022718 release + - max-python ==25.2.0.dev2025022805 release - aiohttp >=3.11.12 - fastapi >=0.114.2 - gguf >=0.14.0 @@ -5553,7 +5553,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5575,14 +5575,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 10365 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 10380 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5597,7 +5597,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5619,14 +5619,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: b9e5755b7bf6314a37a90ef0250c93f5e7c693954d7a6389a97ab9ef06e23cc3 - md5: bfd2e752d0fc9516b78a17169ce9cc78 + sha256: c741ded7e064aba732999cf95e43dda28e6e9cdc59a20254fe32b8bc49739ea6 + md5: ae9b9de4204cb583f9feeb3369809182 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5641,7 +5641,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5663,14 +5663,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 126004454 - timestamp: 1740680207793 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 125985562 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -5685,7 +5685,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -5707,12 +5707,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5724,7 +5724,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -5748,18 +5748,18 @@ packages: license_family: Proprietary size: 124718448 timestamp: 1730231808335 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf @@ -8294,42 +8294,41 @@ packages: license_family: MIT size: 103306412 timestamp: 1738676445445 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda - sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 - md5: 170a0398946d8f5b454e592672b6fc20 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda + sha256: fa6eeb42e3bddff74126dd61b01b21a3f4f4791368e93bc5a5775563542b2d4e + md5: 1152565b06e3dc27794c3c11f1050005 depends: + - typer-slim-standard ==0.15.2 h801b22e_0 - python >=3.9 - - typer-slim-standard 0.15.1 hd8ed1ab_0 + - python license: MIT - license_family: MIT - size: 56175 - timestamp: 1733408582623 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda - sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 - md5: 0218b16f5a1dd569e575a7a6415489db + size: 76158 + timestamp: 1740697495168 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda + sha256: c094713560bfacab0539c863010a5223171d9980cbd419cc799e474ae15aca08 + md5: 7c8d9609e2cfe08dd7672e10fe7e7de9 depends: - - click >=8.0.0 - python >=3.9 + - click >=8.0.0 - typing_extensions >=3.7.4.3 + - python constrains: + - typer 0.15.2.* - rich >=10.11.0 - - typer >=0.15.1,<0.15.2.0a0 - shellingham >=1.3.0 license: MIT - license_family: MIT - size: 43592 - timestamp: 1733408569554 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda - sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f - md5: 4e603c43bfdfc7b533be087c3e070cc9 + size: 45866 + timestamp: 1740697495167 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda + sha256: 79b6b34e90e50e041908939d53053f69285714b0082a0370fba6ab3b38315c8d + md5: ea164fc4e03f61f7ff3c1166001969af depends: + - typer-slim ==0.15.2 pyh29332c3_0 - rich - shellingham - - typer-slim 0.15.1 pyhd8ed1ab_0 license: MIT - license_family: MIT - size: 49531 - timestamp: 1733408570063 + size: 5409 + timestamp: 1740697495168 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda noarch: python sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 diff --git a/tutorials/hello-magic/local/magic.lock b/tutorials/hello-magic/local/magic.lock index 2d7db9d728..db19c74a8c 100644 --- a/tutorials/hello-magic/local/magic.lock +++ b/tutorials/hello-magic/local/magic.lock @@ -75,14 +75,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -154,11 +154,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -1400,40 +1400,40 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1448,7 +1448,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1470,14 +1470,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1492,7 +1492,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1514,12 +1514,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1531,7 +1531,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -1567,18 +1567,18 @@ packages: license_family: Proprietary size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/tutorials/hello-magic/magic.lock b/tutorials/hello-magic/magic.lock index d2c69e5aa3..eafcc2a768 100644 --- a/tutorials/hello-magic/magic.lock +++ b/tutorials/hello-magic/magic.lock @@ -77,14 +77,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -164,11 +164,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -286,14 +286,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -376,11 +376,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -1809,40 +1809,40 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24976 timestamp: 1733219849253 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1857,7 +1857,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1879,14 +1879,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -1901,7 +1901,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -1923,12 +1923,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -1940,7 +1940,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -1979,18 +1979,18 @@ packages: purls: [] size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf diff --git a/tutorials/max-graph-api/magic.lock b/tutorials/max-graph-api/magic.lock index 842de2d2f9..dd772b0a5b 100644 --- a/tutorials/max-graph-api/magic.lock +++ b/tutorials/max-graph-api/magic.lock @@ -160,14 +160,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-15.0.7-h0cdce71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2022.1.0-h84fe81f_915.tar.bz2 - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda @@ -292,11 +292,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-15.0.7-h7cfbb63_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda @@ -2851,40 +2851,40 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.2.0.dev2025022805-release.conda noarch: python - sha256: f3dcb14fed5470c0fc521542cbd2f1c56ca7e46d560f46176b8f926198cb3cbd - md5: 01fe5e0cf46c84a6345e323ad1316764 + sha256: 6fe952db050b07af9045ee094df2241255d72ee0bca5663edfd2ce1c9752ec09 + md5: 8e5bdfbc3312e58ca7af7e74b4c1a62a depends: - - max-core ==25.2.0.dev2025022718 release - - max-python ==25.2.0.dev2025022718 release - - mojo-jupyter ==25.2.0.dev2025022718 release - - mblack ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release + - max-python ==25.2.0.dev2025022805 release + - mojo-jupyter ==25.2.0.dev2025022805 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 9905 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022718-release.conda - sha256: 847d5767109a305d7bcad4ac29248a74a384034692934a0c54b00a590c27094a - md5: fc5a9ae36c7805979bd58ca55a25066f + size: 9906 + timestamp: 1740719805201 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.2.0.dev2025022805-release.conda + sha256: a507f8b798257c4505a296fd1d7900bcc9695b5eaa5990d5a447f588e203ffb7 + md5: 53a62d22b682cdf446cfcbb5e07a0b4d depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 249811868 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022718-release.conda - sha256: fb28d9e61aa507ea84b470082d3dc96844a24fe672d4e4c57e832655c5d0a202 - md5: dd8734453f7276a258f3351cc5c506c3 + size: 249837097 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.2.0.dev2025022805-release.conda + sha256: eb316eef88826b46d84532c0cfcde6d56a875aafcfe08d140cd6b90d752f8841 + md5: efed274ef0a65e98815933cfb8b609d2 depends: - - mblack ==25.2.0.dev2025022718 release + - mblack ==25.2.0.dev2025022805 release license: LicenseRef-Modular-Proprietary - size: 217273450 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022718-release.conda + size: 217300178 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 831b4d62f66f0083321121c6ba25dedab3ee41d5e9f19d9752969592214af398 - md5: f828ace91aa057e4774e84ad459adccf + sha256: 1724ba61123d73c5ae9194dddcaf61e7937123cbd49d0fb122fc78cee0673e6d + md5: 35a33686fe8cccc768034d43f604e672 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -2899,7 +2899,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -2921,14 +2921,14 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 123584411 - timestamp: 1740680254354 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022718-release.conda + size: 123624528 + timestamp: 1740719822740 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.2.0.dev2025022805-release.conda noarch: python - sha256: 7da9f4655082bb64c2b0cc996ffefa0ce5c49744854ed77a9b0d000e27cf5a55 - md5: b16d498a148aa61dca2a6bfec5cb8e46 + sha256: c56d9f6edeb5caa166d74eefca5d472556e29b4a22a4a7e799ff9f9482af0a62 + md5: c684a1ac57d5ca9a82884bffff428154 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - click >=8.0.0 - numpy >=1.18,<2.0 - sentencepiece >=0.2.0 @@ -2943,7 +2943,7 @@ packages: - nvitop >=1.4.1 - opentelemetry-api >=1.29.0 - opentelemetry-exporter-otlp-proto-http >=1.27.0 - - opentelemetry-exporter-prometheus <1.0.0 + - opentelemetry-exporter-prometheus >=0.48b0,<1.1.12.0rc1 - opentelemetry-sdk >=1.29.0,<2.0 - pillow >=10.3.0 - prometheus_client >=0.21.0 @@ -2965,12 +2965,12 @@ packages: - uvloop >=0.21.0 - xgrammar ==0.1.11 license: LicenseRef-Modular-Proprietary - size: 112658409 - timestamp: 1740681819160 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022718-release.conda + size: 112656033 + timestamp: 1740721042829 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.2.0.dev2025022805-release.conda noarch: python - sha256: ff042a8abfed0e2e36b207e3d4f59a2b4577dea7f099b08d1aaef128ab796f09 - md5: 719ca7123d53415adcdd7f0cb8396c51 + sha256: 8d5cc0e599b2ceecc816efe63442c4295304ae7b3016b42399097de4dbcf1769 + md5: 49a934446d5d99e86689f4373ecfe4c4 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -2982,7 +2982,7 @@ packages: - python license: MIT size: 130852 - timestamp: 1740680254353 + timestamp: 1740719805200 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.1.0-h84fe81f_915.tar.bz2 sha256: 767318c4f2057822a7ebc238d6065ce12c6ae60df4ab892758adb79b1057ce02 md5: b9c8f925797a93dbff45e1626b025a6b @@ -3018,18 +3018,18 @@ packages: license_family: Proprietary size: 762563 timestamp: 1652946186347 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022718-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.2.0.dev2025022805-release.conda noarch: python - sha256: 19c33e23b27e240fee0b2a1d56921802ac88558dc2da417837cd590175561e16 - md5: 6b8d00b15817db11e026f824f7f0ba14 + sha256: d0b2f5c55bb0baea04e0a76469a0106ef60ba50e13f305b653fefb4903b9da60 + md5: 5f877a177817719dfa2b616176dbc409 depends: - - max-core ==25.2.0.dev2025022718 release + - max-core ==25.2.0.dev2025022805 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22981 - timestamp: 1740680254354 + size: 22994 + timestamp: 1740719805201 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf