kernels-bot commited on
Commit
0c0c69f
·
verified ·
1 Parent(s): 4e97b86

Uploaded using `kernel-builder`.

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. build/torch211-cxx11-cu126-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} +2 -2
  2. build/torch211-cxx11-cu126-x86_64-linux/_ops.py +3 -3
  3. build/torch211-cxx11-cu126-x86_64-linux/metadata.json +3 -3
  4. build/torch211-cxx11-cu126-x86_64-linux/metadata.json.sigstore +1 -1
  5. build/torch211-cxx11-cu128-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} +2 -2
  6. build/torch211-cxx11-cu128-x86_64-linux/_ops.py +3 -3
  7. build/torch211-cxx11-cu128-x86_64-linux/metadata.json +3 -3
  8. build/torch211-cxx11-cu128-x86_64-linux/metadata.json.sigstore +1 -1
  9. build/torch211-cxx11-cu130-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} +2 -2
  10. build/torch211-cxx11-cu130-x86_64-linux/_ops.py +3 -3
  11. build/torch211-cxx11-cu130-x86_64-linux/metadata.json +5 -4
  12. build/torch211-cxx11-cu130-x86_64-linux/metadata.json.sigstore +1 -1
  13. build/torch212-cxx11-cu126-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} +2 -2
  14. build/torch212-cxx11-cu126-x86_64-linux/_ops.py +3 -3
  15. build/torch212-cxx11-cu126-x86_64-linux/metadata.json +3 -3
  16. build/torch212-cxx11-cu126-x86_64-linux/metadata.json.sigstore +1 -1
  17. build/torch212-cxx11-cu130-x86_64-linux/_mamba_ssm_cuda_2e4b976.abi3.so +3 -0
  18. build/torch212-cxx11-cu130-x86_64-linux/_mamba_ssm_cuda_785446d.abi3.so +0 -3
  19. build/torch212-cxx11-cu130-x86_64-linux/_ops.py +3 -3
  20. build/torch212-cxx11-cu130-x86_64-linux/metadata.json +5 -4
  21. build/torch212-cxx11-cu130-x86_64-linux/metadata.json.sigstore +1 -1
  22. build/torch212-cxx11-cu132-x86_64-linux/_mamba_ssm_cuda_2e4b976.abi3.so +3 -0
  23. build/torch212-cxx11-cu132-x86_64-linux/_mamba_ssm_cuda_785446d.abi3.so +0 -3
  24. build/torch212-cxx11-cu132-x86_64-linux/_ops.py +3 -3
  25. build/torch212-cxx11-cu132-x86_64-linux/metadata.json +5 -4
  26. build/torch212-cxx11-cu132-x86_64-linux/metadata.json.sigstore +1 -1
  27. build/torch213-cxx11-cu126-x86_64-linux/__init__.py +12 -0
  28. build/torch213-cxx11-cu126-x86_64-linux/_mamba_ssm_cuda_2e4b976.abi3.so +3 -0
  29. build/torch213-cxx11-cu126-x86_64-linux/_ops.py +9 -0
  30. build/torch213-cxx11-cu126-x86_64-linux/distributed/__init__.py +0 -0
  31. build/torch213-cxx11-cu126-x86_64-linux/distributed/distributed_utils.py +144 -0
  32. build/torch213-cxx11-cu126-x86_64-linux/distributed/tensor_parallel.py +296 -0
  33. build/torch213-cxx11-cu126-x86_64-linux/mamba_ssm/__init__.py +26 -0
  34. build/torch213-cxx11-cu126-x86_64-linux/metadata.json +62 -0
  35. build/torch213-cxx11-cu126-x86_64-linux/metadata.json.sigstore +1 -0
  36. build/torch213-cxx11-cu126-x86_64-linux/models/__init__.py +5 -0
  37. build/torch213-cxx11-cu126-x86_64-linux/models/config_mamba.py +18 -0
  38. build/torch213-cxx11-cu126-x86_64-linux/models/mixer_seq_simple.py +309 -0
  39. build/torch213-cxx11-cu126-x86_64-linux/modules/__init__.py +7 -0
  40. build/torch213-cxx11-cu126-x86_64-linux/modules/block.py +107 -0
  41. build/torch213-cxx11-cu126-x86_64-linux/modules/mamba2.py +502 -0
  42. build/torch213-cxx11-cu126-x86_64-linux/modules/mamba2_simple.py +229 -0
  43. build/torch213-cxx11-cu126-x86_64-linux/modules/mamba_simple.py +339 -0
  44. build/torch213-cxx11-cu126-x86_64-linux/modules/mha.py +294 -0
  45. build/torch213-cxx11-cu126-x86_64-linux/modules/mlp.py +34 -0
  46. build/torch213-cxx11-cu126-x86_64-linux/modules/ssd_minimal.py +111 -0
  47. build/torch213-cxx11-cu126-x86_64-linux/ops/__init__.py +1 -0
  48. build/torch213-cxx11-cu126-x86_64-linux/ops/selective_scan_interface.py +446 -0
  49. build/torch213-cxx11-cu126-x86_64-linux/ops/triton/__init__.py +2 -0
  50. build/torch213-cxx11-cu126-x86_64-linux/ops/triton/k_activations.py +169 -0
build/torch211-cxx11-cu126-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:6e0a31935185cc083ad1309de89b23766d64c4846ae17e6f62ff7fed398ed2ec
3
- size 444246120
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ee79bc4d4fb452e0a814943420ce0b8b8005761c7785e239444ffa33175c22e9
3
+ size 442368288
build/torch211-cxx11-cu126-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _mamba_ssm_cuda_785446d
3
- ops = torch.ops._mamba_ssm_cuda_785446d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_mamba_ssm_cuda_785446d::{op_name}"
 
1
  import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch211-cxx11-cu126-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "mamba-ssm",
3
- "id": "_mamba_ssm_cuda_785446d",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
@@ -23,8 +23,8 @@
23
  "algorithm": "sha256",
24
  "files": {
25
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
26
- "_mamba_ssm_cuda_785446d.abi3.so": "bgoxk1GFzAg60TCd6Jsjdm1kxIRq4X5vYv9/7TmO0uw=",
27
- "_ops.py": "sO7E/nXmre7S3JlSTlFyMKDDSyF50/25kbwfNXzpfzg=",
28
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
29
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
30
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
 
1
  {
2
  "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
 
23
  "algorithm": "sha256",
24
  "files": {
25
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
26
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "7nm8TU+0UuCoFJQ0IM4Li4AFdhx3heI5RE/6MxdcIuk=",
27
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
28
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
29
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
30
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
build/torch211-cxx11-cu126-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHdTCCBvqgAwIBAgIUYyX81VyT25p1bgyXqm9lQeH8kHYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY1OTI0WhcNMjYwNjE4MDcwOTI0WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEx+16r+d+2JzA1iQEGT915tf9JmVSeLp+GhDumrQ9a9jJkIPIDQfJekkFjKMysqbLE6KQunpvtpw6tHUO+mLRsqOCBhkwggYVMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUA5iUbrxpOfIuu5KLwd2XEHR1qqwwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYsGCisGAQQB1nkCBAIEfQR7AHkAdwDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZhwRYAAAEAwBIMEYCIQC8IT8xaei/F2Z8nI5/IXytBDubaqS1rfv6D0ozYZDntAIhALiCrGmLCcr2F2dhloBi+AnZmL6hEw7Hz0yEDHM5wZuVMAoGCCqGSM49BAMDA2kAMGYCMQDGautS02w6hi+lxyx1gtBoLLs0jgnpo+lpiN2c47sgUTw7sFo/QbOEatODZYYqXqYCMQCjY7/7i9zZ3w6Yj23sD2nl60DwL2mpoyfH2tpCYh+Ui2zoAXdYnG/qLt7yfvui9ig="},"tlogEntries":[{"logIndex":"1857846004","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781765965","inclusionPromise":{"signedEntryTimestamp":"MEUCIQDchIWUU+h8clVM4elLKnvgD5/mE8jfUk+N9NBaKn6rrwIgL0yI1/T3fWTI1DzhR1lUvmAAadUE6QsLutqSLn4XHQ8="},"inclusionProof":{"logIndex":"1735941742","rootHash":"B5qQttEkoXnytv5SG1N+wZhqLOn7QUEqEFfFq1cVABg=","treeSize":"1735941753","hashes":["/O/Zo3qBr8fViut1MmsTGuTGGB/fRN55YPrSqwqmEpo=","M7ObQQJ8kZJbtxbcN7elI0cnSyPyIk3GtRuTYLlVKwk=","ZNeETz6OHNtnGaiUVN36EqKxqZqoWwQn1AU5ti1lVHM=","8F/FaBHU1/+PeH5/jCPyVTFwCgEnmKY2NCKZZI082z8=","HVbO4YlXjghF6N5/yHG/Ip8Ez/5hQsHRyV1GTrDQXp0=","D0XpEpAXFDSGj/Vt7WQwB6iX48YgrzcJyjPCPu4S3Ck=","ABG+vg2shNQtTbo3ipwR9Z24CxAgSdArL5i7+D02Hf0=","Zj/ZY0eBi0gwVgBaoEOc3DrvBQix71RFSiNXK4sPli4=","Q7TdDu7WbPJBWdHFC09Xg6476ZNxZHnnk9EwtegIzjs=","TIqZLgA6aRph3LTsRCezw52mN9jLpsdRobJF4nyuDsk=","h8qmLE5ZM/33fkJcCpa82SXVNA+SsbijaPv7rG6xbIM=","dBGkiPcr9PeHrVdmtM5A5GHZYWYJVpP1XmzLNrrX7Pk=","95goX8Iw4H4P6V4eHvRqTdVdViLbhEhsF6i7ICnz/+A=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735941753\nB5qQttEkoXnytv5SG1N+wZhqLOn7QUEqEFfFq1cVABg=\n\n— rekor.sigstore.dev wNI9ajBFAiAeIOi0WRz7do+MWiVnqWali4/MXfhyrVoqyFpQuTrzFwIhAP/Jxoffc0vBAdyqbaz1ogY8HIh+Q/WSeUX1JGJWmwlN\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyMDVkNTFlYjRkMGMwZTE2YjgxMGEyNTZkNzhiOGU3NjIwYmQ1ZjQwNjk3ODgyOGUxNTIzZDA3YWQyZDAyM2RhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURnMGhmYm5lbjRGeUdIT2licklMcWFWT2pTSzh6cmRubHp0MjZyTjF1RGhRSWhBTHR3bWpkb080Yjc1aWt2TEVRaU9DOVhKYWN2MlZmOTdUMU5uMVdtcXozUCIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGtWRU5EUW5aeFowRjNTVUpCWjBsVldYbFlPREZXZVZReU5YQXhZbWQ1V0hGdE9XeFJaVWc0YTBoWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3hUMVJKTUZkb1kwNU5hbGwzVG1wRk5FMUVZM2RQVkVrd1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVY0S3pFMmNpdGtLekpLZWtFeGFWRkZSMVE1TVRWMFpqbEtiVlpUWlV4d0swZG9SSFVLYlhKUk9XRTVha3ByU1ZCSlJGRm1TbVZyYTBacVMwMTVjM0ZpVEVVMlMxRjFibkIyZEhCM05uUklWVThyYlV4U2MzRlBRMEpvYTNkbloxbFdUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZCTldsVkNtSnllSEJQWmtsMWRUVkxUSGRrTWxoRlNGSXhjWEYzZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYzBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmxGU04wRklhMEZrZDBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbWgzVWxsQlFVRkZRWGRDU1UxRldVTkpVVU00Q2tsVU9IaGhaV2t2UmpKYU9HNUpOUzlKV0hsMFFrUjFZbUZ4VXpGeVpuWTJSREJ2ZWxsYVJHNTBRVWxvUVV4cFEzSkhiVXhEWTNJeVJqSmthR3h2UW1rS0swRnVXbTFNTm1oRmR6ZEllakI1UlVSSVRUVjNXblZXVFVGdlIwTkRjVWRUVFRRNVFrRk5SRUV5YTBGTlIxbERUVkZFUjJGMWRGTXdNbmMyYUdrcmJBcDRlWGd4WjNSQ2IweE1jekJxWjI1d2J5dHNjR2xPTW1NME4zTm5WVlIzTjNOR2J5OVJZazlGWVhSUFJGcFpXWEZZY1ZsRFRWRkRhbGszTHpkcE9YcGFDak4zTmxscU1qTnpSREp1YkRZd1JIZE1NbTF3YjNsbVNESjBjRU5aYUN0VmFUSjZiMEZZWkZsdVJ5OXhUSFEzZVdaMmRXazVhV2M5Q2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIn19fX0="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgORb3MY0KNJbaLNO1CLAGu28E0tSP8U2CYN6lMbCFkKMCFCn/lioYVq2pmzI6Vfu5zfZIABKuGA8yMDI2MDYxODA2NTkyNVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdwwggHYAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNjE4MDY1OTI1WjAvBgkqhkiG9w0BCQQxIgQgT1NdCQmOKhCXe+wBSmL1s5tU6vgEz5HxuWaGwnW8qPEwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGgwZgIxAPNrjBaLJRoBLlOqrdh6oU4PHYVf8412+ZAbOB9S7fIqVfmrjlOqu6XtPdzcUH3jdAIxALL5/sNdwpbL3vjuwt2rzOBeE5MMipk8hZxYFJxNVMQ4hAoXCnX0QBFGNm1SSroq1A=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"IF1R600MDha4EKJW14uOdiC9X0BpeIKOFSPQetLQI9o="},"signature":"MEYCIQDg0hfbnen4FyGHOibrILqaVOjSK8zrdnlzt26rN1uDhQIhALtwmjdoO4b75ikvLEQiOC9XJacv2Vf97T1Nn1Wmqz3P"}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHSjCCBtCgAwIBAgIUPNwo2ZGnG1e2Lg67+KLIlRB11gcwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDE4WhcNMjYwNzAzMTM0NDE4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER9YpYQCLKzIkR2sM00hkOwBOx/1OEEP1uytmBqj4fcRDAY/E1u+nj+G9Ojqc1wrSOnst8zo7V+orv/g3VL/9z6OCBe8wggXrMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU1eZQ1hBndoGpQdpE6K538EdJSVowHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygv8nIAAAQDAEYwRAIgEBfC5izPOp1TziobcgW2zp/tGBcYsCwqvE+8ccLF3iYCIGl/cWSV7JKs1D477gmQYTHbEWrhcv6RslF4nLKB2DbvMAoGCCqGSM49BAMDA2gAMGUCMQCPWsalIATVKAyPLxWwHdzPaKHrKznotkO0wI/1YBCyGLzeBolbAfNOT2JIHyuJtCMCMAlxVuKmxBlBL04FPKVFyXnfdENI1Z33ebTmpoSeI14v7UR7sTMKhYkfu3lW8igFGg=="},"tlogEntries":[{"logIndex":"2061240866","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085659","inclusionPromise":{"signedEntryTimestamp":"MEQCIH+oiQS8jkXrgqdfbNTln05kPTRE6l5YCSXA5RZLa8FaAiAaVln/MeGee2ZnhkVi1axT3ZWr7VVsQgD3cl4R15ykfg=="},"inclusionProof":{"logIndex":"1939336604","rootHash":"52dyB9vNuXeM+G0GKzUkflpYfJq8VbJ7zpPNYqs2m+Y=","treeSize":"1939336619","hashes":["oEf909Cyt0+tZY9hVZcTfGPMvlbwq+mfxoVlUq3zdO8=","po7oZ62w67AEhYa9vmzxFzjrb/vkTYtH1QMIoTYEZm8=","0izAxgfSfWnBtYqFHFVrIgUMvs6XwW8yACHXUlzGQ8A=","2Wt8g2fwVhXgg7ssMMM8nml2FnEmi9mWdOEY2vAxGd0=","l9yvu4lzQ1e3WY7YKh1v6lOUrVKIerRbWp7nN61wrxQ=","8HIoi3sv9jqOJs3dGBKd9++00FtF8K2vYPXnBcLascI=","h980rCWgvIYBK607un+yEXr+dhGz3dLkSQPLL9ehjfk=","ZXt2arn7Eq2+M/NWf8R2Cv1Ylv3UNyk5CZUmY/xiCTc=","uX+G2XyrpFpfzpHxIMRb9vLFaSUsZr1fZfBXrYAh4E8=","dkxSFJ76QYfcYZd0FZ1ztNIYtDj8WF+edLXK0EwhgP0=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939336619\n52dyB9vNuXeM+G0GKzUkflpYfJq8VbJ7zpPNYqs2m+Y=\n\n— rekor.sigstore.dev wNI9ajBFAiA0Rf7buiBccqHaEb8r4ukNuq0/L8hRvEqDakBHiw2JSAIhALBffvU+YteIuQS/cGNdSvtvPcNJuQGLvRSh1TdbcDA3\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3NDczMGNmNTg3M2NiMDI4ZDAzNDgyMjk1YzdiNzIzYjFjZGUzYTY4NDg3M2RlMzFmNjk2NzhmODc1ZGE0NGEzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNMWjQ5cTkvbFN6OVNldDMzNEVuUDRjQ1VWV3lNZDFwRG16aTFkT1c0NHlRSWdjazAvSEFKSlVJdEdUUlNuWE41T0d5dGtvcG9Cekh4blhGMDhyOUNWSk1ZPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRha05EUW5SRFowRjNTVUpCWjBsVlVFNTNiekphUjI1SE1XVXlUR2MyTnl0TFRFbHNVa0l4TVdkamQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JGTkZkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkVVMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZTT1Zsd1dWRkRURXQ2U1d0U01uTk5NREJvYTA5M1FrOTRMekZQUlVWUU1YVjVkRzBLUW5GcU5HWmpVa1JCV1M5Rk1YVXJibW9yUnpsUGFuRmpNWGR5VTA5dWMzUTRlbTgzVml0dmNuWXZaek5XVEM4NWVqWlBRMEpsT0hkbloxaHlUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlV4WlZwUkNqRm9RbTVrYjBkd1VXUndSVFpMTlRNNFJXUktVMVp2ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwVVZsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTTjBKSWEwRUtaSGRDTVVGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM1k0YmtsQlFVRlJSQXBCUlZsM1VrRkpaMFZDWmtNMWFYcFFUM0F4VkhwcGIySmpaMWN5ZW5BdmRFZENZMWx6UTNkeGRrVXJPR05qVEVZemFWbERTVWRzTDJOWFUxWTNTa3R6Q2pGRU5EYzNaMjFSV1ZSSVlrVlhjbWhqZGpaU2MyeEdORzVNUzBJeVJHSjJUVUZ2UjBORGNVZFRUVFE1UWtGTlJFRXlaMEZOUjFWRFRWRkRVRmR6WVd3S1NVRlVWa3RCZVZCTWVGZDNTR1I2VUdGTFNISkxlbTV2ZEd0UE1IZEpMekZaUWtONVIweDZaVUp2YkdKQlprNVBWREpLU1VoNWRVcDBRMDFEVFVGc2VBcFdkVXR0ZUVKc1Frd3dORVpRUzFaR2VWaHVabVJGVGtreFdqTXpaV0pVYlhCdlUyVkpNVFIyTjFWU04zTlVUVXRvV1d0bWRUTnNWemhwWjBaSFp6MDlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgF149vUmjqFIJzFlSa1Idq9HbZsbnihZ7jqvZrPLRlVECFGsyOaNqgZb2WMleQ2wpXj4Zry7tGA8yMDI2MDcwMzEzMzQxOFowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNzAzMTMzNDE4WjAvBgkqhkiG9w0BCQQxIgQgXhKJrFXFmx1zJ35ANIW10zxYPuHmugBaSZ3tB14fSEgwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwNymTEwTAdBJ/qowwZvyt5ixNAf+u2gleAxjBpYt4XDXFSIX3C/Px1sBTuYzzWNgYAjEAw+I3CPd8mFwjZ4NguyDe4xiAwPldtblIH9QcYtJo4G+GAyF36FD0a1wIsZj9wQlU"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"dHMM9Yc8sCjQNIIpXHtyOxzeOmhIc94x9pZ4+HXaRKM="},"signature":"MEUCIQCLZ49q9/lSz9Set334EnP4cCUVWyMd1pDmzi1dOW44yQIgck0/HAJJUItGTRSnXN5OGytkopoBzHxnXF08r9CVJMY="}}
build/torch211-cxx11-cu128-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:77999c94a9872de9a9010ef6f5e550983afe84f4362856444ec78cb47290a352
3
- size 610651160
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f2e6d0d961fbc71b3d0239221e87d5ed36e702237ead252e11acfe0e3c02ab7
3
+ size 608726816
build/torch211-cxx11-cu128-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _mamba_ssm_cuda_785446d
3
- ops = torch.ops._mamba_ssm_cuda_785446d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_mamba_ssm_cuda_785446d::{op_name}"
 
1
  import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch211-cxx11-cu128-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "mamba-ssm",
3
- "id": "_mamba_ssm_cuda_785446d",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
@@ -26,8 +26,8 @@
26
  "algorithm": "sha256",
27
  "files": {
28
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
29
- "_mamba_ssm_cuda_785446d.abi3.so": "d5mclKmHLempAQ729eVQmDr+hPQ2KFZETseMtHKQo1I=",
30
- "_ops.py": "sO7E/nXmre7S3JlSTlFyMKDDSyF50/25kbwfNXzpfzg=",
31
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
32
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
33
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
 
1
  {
2
  "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
 
26
  "algorithm": "sha256",
27
  "files": {
28
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
29
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "Ty5tDZYfvHGz0COSIeh9XtNucCI36tJS4RrP4OPAKrc=",
30
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
31
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
32
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
33
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
build/torch211-cxx11-cu128-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHczCCBvmgAwIBAgIUXERNr8K9UqgRia3I4LgECVVc8VQwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY1OTI2WhcNMjYwNjE4MDcwOTI2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/NKkMJxzInga1xLEWy2HzXomLGGAEH91+VXfDc+2ATdAYF+yLKzXLsOE6cQv6PpA3coRSH982cSYPmqdxnwhfKOCBhgwggYUMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUXFTg08r73Fq/hGDk2dLT1nERVR0wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZhwqjAAAEAwBHMEUCIGp4cj2h3s/I9bjYQ9Z6KXGPrXIYJLDALSHX3Y15OPQJAiEAhuWcn1ArASXR5gr9637FeAc28Fn9wjoD40uI38Mza4UwCgYIKoZIzj0EAwMDaAAwZQIwbsCS76/qHSCTmZ0KlwLUx7In4ZC0SJKVadFMCJDk0nfeDAwLPj/PWOk7p8mtSpTDAjEAwo6vm+vzLrWXTmitTUD6hP5nelgo/XKUNp4Oxey1PXUou08EGBiZA34KMmuTkHeU"},"tlogEntries":[{"logIndex":"1857846088","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781765966","inclusionPromise":{"signedEntryTimestamp":"MEUCIQDd9r9K8yXI0DU+fzyps8g+gyORRR1C8efFFhvya1nkLAIgeoQ+WlF50QUXukZzMovSsGmVirdTZVp5M8Ka+5fnl0Y="},"inclusionProof":{"logIndex":"1735941826","rootHash":"WbrMBOlQcnX2VzHAkaXmR0DMvGjAhcz+legO8NobQp0=","treeSize":"1735941833","hashes":["BtnQuqkL2eK/M/xk+zrqT2wgV2Q3FbtH3jt8IbypTYA=","OyHWViw5tJfuElzvbjB7bWH8V9rH++OT4nDDC8urPss=","HCI9dPj1HL8xiMcRQ1u8s6DgFOogu7FqtZbHIg7ip+4=","HgPVRDKWxs+5ohbI2Z3NkTsB+5AxjqyTEVX8Um6sPvo=","PzPZQTao82r8UZb+uogmPIRgXvP9JrW6RfoXjchnd+U=","4MfuBMJOt4DoI733kEulZxbftVCx/i8sS36wdSfvkFY=","Zj/ZY0eBi0gwVgBaoEOc3DrvBQix71RFSiNXK4sPli4=","Q7TdDu7WbPJBWdHFC09Xg6476ZNxZHnnk9EwtegIzjs=","TIqZLgA6aRph3LTsRCezw52mN9jLpsdRobJF4nyuDsk=","h8qmLE5ZM/33fkJcCpa82SXVNA+SsbijaPv7rG6xbIM=","dBGkiPcr9PeHrVdmtM5A5GHZYWYJVpP1XmzLNrrX7Pk=","95goX8Iw4H4P6V4eHvRqTdVdViLbhEhsF6i7ICnz/+A=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735941833\nWbrMBOlQcnX2VzHAkaXmR0DMvGjAhcz+legO8NobQp0=\n\n— rekor.sigstore.dev wNI9ajBEAiBVeG1yd1ib85mvX2u/fDD9v6r6R3ZQMR2YD6eejvUS4wIgLWB36zMzm3V5GwJfCMEgJ0TZuloMlM1cPefAq/C0zRo=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI0MDJlYjlkZDUxOWE1OTQ4ZjljMzBhNzRkYjhkOTNkMmM3MWZlN2VlMmI0YTRiZDEzZGU5OGRkNDEyNGU4YTdiIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRlQwd080VllkNXA4dmIxejh2ak43dzM1cDM0WURSMGJ1d2laMzAybnBSd0FpRUEwb2lBWUlCbWRkeWo2WENiRnV6NDQwSXpCZXAxMFJmSnVaSE5jNE5ETnpnPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpla05EUW5adFowRjNTVUpCWjBsVldFVlNUbkk0U3psVmNXZFNhV0V6U1RSTVowVkRWbFpqT0ZaUmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3hUMVJKTWxkb1kwNU5hbGwzVG1wRk5FMUVZM2RQVkVreVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVV2VGt0clRVcDRla2x1WjJFeGVFeEZWM2t5U0hwWWIyMU1SMGRCUlVnNU1TdFdXR1lLUkdNck1rRlVaRUZaUml0NVRFdDZXRXh6VDBVMlkxRjJObEJ3UVROamIxSlRTRGs0TW1OVFdWQnRjV1I0Ym5kb1prdFBRMEpvWjNkbloxbFZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZZUmxSbkNqQTRjamN6Um5FdmFFZEVhekprVEZReGJrVlNWbEl3ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYjBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmtGU05rRklaMEZrWjBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbWgzY1dwQlFVRkZRWGRDU0UxRlZVTkpSM0EwQ21OcU1tZ3pjeTlKT1dKcVdWRTVXalpMV0VkUWNsaEpXVXBNUkVGTVUwaFlNMWt4TlU5UVVVcEJhVVZCYUhWWFkyNHhRWEpCVTFoU05XZHlPVFl6TjBZS1pVRmpNamhHYmpsM2FtOUVOREIxU1RNNFRYcGhORlYzUTJkWlNVdHZXa2w2YWpCRlFYZE5SR0ZCUVhkYVVVbDNZbk5EVXpjMkwzRklVME5VYlZvd1N3cHNkMHhWZURkSmJqUmFRekJUU2t0V1lXUkdUVU5LUkdzd2JtWmxSRUYzVEZCcUwxQlhUMnMzY0RodGRGTndWRVJCYWtWQmQyODJkbTByZG5wTWNsZFlDbFJ0YVhSVVZVUTJhRkExYm1Wc1oyOHZXRXRWVG5BMFQzaGxlVEZRV0ZWdmRUQTRSVWRDYVZwQk16UkxUVzExVkd0SVpWVUtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQg5H6MVT13SLGPELnSLFCvQlCt4bVtyHSE1556JQPJGPMCFGcwJaXCChyS030wbDhvwy6EmRu3GA8yMDI2MDYxODA2NTkyNlowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNjE4MDY1OTI2WjAvBgkqhkiG9w0BCQQxIgQgxyTra9fvfoO0Jm271UPaRnRjbDR9Yv1hKVVGYWdtNeowgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIxAJ0IHYJeQg/gtDJQKnAFKYXCG0K+XvqEl5HDNpnCYv71/8W5KmKoETWpPHRO+5Ka+AIwT9qZuno0Zcs+KbbWNoEfp2i1SZBDq6hPUtIZZwa4lWE0WdPaKeo34M/2NfJVAPBT"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"QC653VGaWUj5wwp0242T0scf5+4rSkvRPemN1BJOins="},"signature":"MEUCIFT0wO4VYd5p8vb1z8vjN7w35p34YDR0buwiZ302npRwAiEA0oiAYIBmddyj6XCbFuz440IzBep10RfJuZHNc4NDNzg="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHTDCCBtGgAwIBAgIUcQ7JtXDBJvEIWvzlqKl/vSmRrnYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDIwWhcNMjYwNzAzMTM0NDIwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERHc5QpoXeKMUQIg6wo9P1mwrzzZK3/alzbUPKjYXM2Rgmgdy6jW7KZD89HuBZySjcW5RpqLCBrXSyJO+P60HU6OCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUxlvR8GkrmZHmdrYwwNganbwWBCswHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygv+UwAAAQDAEcwRQIhAI5qk4nNHPL42pbHxOTOmAkJ20S8XQh78IK7zA/n3YnlAiAVOETUNi0g0551G2aap4djDg6CiM/Tl7j+zdbYAWolJzAKBggqhkjOPQQDAwNpADBmAjEAn4BAcNUlrchltXOFu5bE+oSkg/8jbEfkND/Mf3JzIbeW4OzowMXxx1yuXR5jPC2BAjEAuN2x8cLFLjvO3MErNsd/ekp3eweydVVoPlIXZ+HL3js8S1I1j7jY/6laCo1zzvK0"},"tlogEntries":[{"logIndex":"2061241287","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085660","inclusionPromise":{"signedEntryTimestamp":"MEQCIG86Cqh0X7H9W4cb18idgpdSySjao+wpyRqVcSRh+QiTAiB2rIl27fBRhn3tyVHlhmplu1Z9rEVXIdCErQdYRCMEqQ=="},"inclusionProof":{"logIndex":"1939337025","rootHash":"6q0wd1INgO+AwbXGXE8LHNWJD+achGJKFlxFrnNkvBs=","treeSize":"1939337070","hashes":["T86WrooJHTZJ6zz2kg+fJLhsGQBqiT1HZJPJFvZShjg=","oGvc2J8ySkXwZB4luR3iUcWBzIRmIPkGR2FGmGPBaoc=","q3kDAP0nS5DV144gQQjmfPbJTP1LpEVzn4M5CHdxkM4=","YJV6URO6PdUjA8hC8f454zEO9KpuR/uRc3e12wsmAdo=","jWOudmyvOFz/jojmkikryJh4FFiI4xTaOQTqxxwIddM=","BkB+gW66bQk/nZH+G/mBP8NmLL+WwJdk8mg3Pr/+CFE=","IZdlrN1VhC5en7uAO751ty+MPLN8mTONmizYlQ2+DxE=","ZwVhOIhjNPMClXSRMKKLbPt64fV9iQekLeKcr57b1Gw=","s5h75ZJxgo3ICUP+6oHnw6xd0IPQ9zP9DN2dbevEsoQ=","uX+G2XyrpFpfzpHxIMRb9vLFaSUsZr1fZfBXrYAh4E8=","dkxSFJ76QYfcYZd0FZ1ztNIYtDj8WF+edLXK0EwhgP0=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939337070\n6q0wd1INgO+AwbXGXE8LHNWJD+achGJKFlxFrnNkvBs=\n\n— rekor.sigstore.dev wNI9ajBFAiEA5ZZt9KM/yeuCk7YXEyYNDjrbwoUhLwKrN9ExtnQ/N0ICIBDKvhob2wjMMceawkkqT9cf3EKy40FxwkmGt95PKCBc\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJlNGY4M2RiOTA5MDFjY2Q1NGMyYTdmMDFmZWI3ZThiOGIxYmQyYWY4ZmNmMGQ5MzFjZWE5OGY0YjUwMDU1MjRlIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJSG9ESCtZMDRaUXNmNlNuM0llcXFkaTJVekM5bGZsWUhydXVMNytzK0VkbUFpQTY0Y25KZ1ZRM0lhemlSSURMTEpJRlRzZ1pXU0pZdE0vWk11Z3lycEFRNWc9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVSRU5EUW5SSFowRjNTVUpCWjBsVlkxRTNTblJZUkVKS2RrVkpWM1o2YkhGTGJDOTJVMjFTY201WmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JKZDFkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkVsM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZTU0dNMVVYQnZXR1ZMVFZWUlNXYzJkMjg1VURGdGQzSjZlbHBMTXk5aGJIcGlWVkFLUzJwWldFMHlVbWR0WjJSNU5tcFhOMHRhUkRnNVNIVkNXbmxUYW1OWE5WSndjVXhEUW5KWVUzbEtUeXRRTmpCSVZUWlBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlY0YkhaU0NqaEhhM0p0V2todFpISlpkM2RPWjJGdVluZFhRa056ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM1lyVlhkQlFVRlJSQXBCUldOM1VsRkphRUZKTlhGck5HNU9TRkJNTkRKd1lraDRUMVJQYlVGclNqSXdVemhZVVdnM09FbExOM3BCTDI0eldXNXNRV2xCVms5RlZGVk9hVEJuQ2pBMU5URkhNbUZoY0RSa2FrUm5Oa05wVFM5VWJEZHFLM3BrWWxsQlYyOXNTbnBCUzBKblozRm9hMnBQVUZGUlJFRjNUbkJCUkVKdFFXcEZRVzQwUWtFS1kwNVZiSEpqYUd4MFdFOUdkVFZpUlN0dlUydG5MemhxWWtWbWEwNUVMMDFtTTBwNlNXSmxWelJQZW05M1RWaDRlREY1ZFZoU05XcFFRekpDUVdwRlFRcDFUako0T0dOTVJreHFkazh6VFVWeVRuTmtMMlZyY0RObGQyVjVaRlpXYjFCc1NWaGFLMGhNTTJwek9GTXhTVEZxTjJwWkx6WnNZVU52TVhwNmRrc3dDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgc2i0pRSpntP6D31AOjM2ewh3ggjuADSrJiNIvuO/2h0CFGXcqmvbD62C/l8Ubd7gc6wJDHVBGA8yMDI2MDcwMzEzMzQyMFowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNzAzMTMzNDIwWjAvBgkqhkiG9w0BCQQxIgQgyw1SsArrl/UVbqKIQJ2ZWHaXJlSU/b0r51i64OCRqtYwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwC5zVw2dtsD2LFiWKzumI0ymiA7JHvyICv/bUV3RTO4Di6ltCWWovUBy42sKg0Jp+AjEAqmF2I+8OvcnPI8gDVYIMN5HhNTbBNYsQJnWWAQXAvV/bIHMaixWESkQcpQCs0soj"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"5Pg9uQkBzNVMKn8B/rfouLG9Kvj88NkxzqmPS1AFUk4="},"signature":"MEQCIHoDH+Y04ZQsf6Sn3Ieqqdi2UzC9lflYHruuL7+s+EdmAiA64cnJgVQ3IaziRIDLLJIFTsgZWSJYtM/ZMugyrpAQ5g=="}}
build/torch211-cxx11-cu130-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:5c2b1b941e8b0a5b8697cf678e52d5fb5dde48bf5841f40acf7f125e08b5532a
3
- size 446626856
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c5aff05bc30671a5e281dbac09629e720ac04a5a164669b2d5649a3c3f20473a
3
+ size 496401728
build/torch211-cxx11-cu130-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _mamba_ssm_cuda_785446d
3
- ops = torch.ops._mamba_ssm_cuda_785446d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_mamba_ssm_cuda_785446d::{op_name}"
 
1
  import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch211-cxx11-cu130-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "mamba-ssm",
3
- "id": "_mamba_ssm_cuda_785446d",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
@@ -11,7 +11,8 @@
11
  "archs": [
12
  "10.0",
13
  "11.0",
14
- "12.0+PTX",
 
15
  "7.5",
16
  "8.0",
17
  "8.6",
@@ -24,8 +25,8 @@
24
  "algorithm": "sha256",
25
  "files": {
26
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
27
- "_mamba_ssm_cuda_785446d.abi3.so": "XCsblB6LCluGl89njlLV+13eSL9YQfQKz38SXgi1Uyo=",
28
- "_ops.py": "sO7E/nXmre7S3JlSTlFyMKDDSyF50/25kbwfNXzpfzg=",
29
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
30
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
31
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
 
1
  {
2
  "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
 
11
  "archs": [
12
  "10.0",
13
  "11.0",
14
+ "12.0",
15
+ "12.1+PTX",
16
  "7.5",
17
  "8.0",
18
  "8.6",
 
25
  "algorithm": "sha256",
26
  "files": {
27
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
28
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "xa/wW8MGcaXigdusCWKecgrASloWRmmy1WSaPD8gRzo=",
29
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
30
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
31
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
32
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
build/torch211-cxx11-cu130-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHcjCCBvmgAwIBAgIULB0xPrzv5I/vDAtGTMj/8QRzWRUwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY1OTI4WhcNMjYwNjE4MDcwOTI4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgofpbxeizZQTxPqKp48Nmk7kH9oZcUxxLtnY9uY+PlslEhyD7lUaPMEmBfoceALBJfBhsCsMWYJdKuGlsk+KuaOCBhgwggYUMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUo19SSuXxgvKqDzjBCcqrYp3yamswHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZhxFuAAAEAwBHMEUCIE8IMAV24Bbx5fEKReVcXpejnPZvjGOmJ9/UyyT1qk0LAiEAptqH8Nef/HGOj1uYlLzZwA+67MN5dHhuQ+044dvMhBowCgYIKoZIzj0EAwMDZwAwZAIwRz5RQkwiGR+i4i2NfuTYLCF8YME6B3W3k1czrAOmpE4yUvqcW9LpC4pD2ZJXMcgDAjA8w20Q2/+BN6K+l59qYlt8MsSn/g51Qdq5mEn6N0dTgKmDuXTTVGN4RSqAw7QuMy0="},"tlogEntries":[{"logIndex":"1857846155","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781765968","inclusionPromise":{"signedEntryTimestamp":"MEYCIQDpJS1L8c1IHrU/CVtbItwGwmP7cOsk+ia5D8gMOuK0WAIhAKh1uHhmba+Yktxa/O6b/zGQQV9DHr/BMaezNOWyFg2w"},"inclusionProof":{"logIndex":"1735941893","rootHash":"8W0YRS3Tbi0J2X3kJwNB6hilyc2R6unwojUYH/Onnu4=","treeSize":"1735941894","hashes":["GOu0C0t4GFckcqQfCpyiPi9NSEFg3CZq4P4jHsoXf14=","tVvPUmt0XBkw14p+6aRX4YCsOwvaiNRL7PhmIlMqIHE=","I0d0D9LPIksW5sRdo73kOhT8Y/fQxDpijIkJ4M+9V1g=","Zj/ZY0eBi0gwVgBaoEOc3DrvBQix71RFSiNXK4sPli4=","Q7TdDu7WbPJBWdHFC09Xg6476ZNxZHnnk9EwtegIzjs=","TIqZLgA6aRph3LTsRCezw52mN9jLpsdRobJF4nyuDsk=","h8qmLE5ZM/33fkJcCpa82SXVNA+SsbijaPv7rG6xbIM=","dBGkiPcr9PeHrVdmtM5A5GHZYWYJVpP1XmzLNrrX7Pk=","95goX8Iw4H4P6V4eHvRqTdVdViLbhEhsF6i7ICnz/+A=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735941894\n8W0YRS3Tbi0J2X3kJwNB6hilyc2R6unwojUYH/Onnu4=\n\n— rekor.sigstore.dev wNI9ajBFAiEA7vTTle6Mhbb3m5YmmRae998RJ54wZ1GygP8FD0pJ+twCIG/EFOGHSh1LPLgblaS1jXL1q9H+oQd34fqFXqsUGqw5\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJlZmEyY2Q0NzMxMmY5OTkxNzkxMzIyZTgyMTU2NGFiNWY3MGViYWRkYWRjZGFjNGExNDNkOWJkNTI5YjZlODAxIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUNBOWRQU2xtUkhVd1FZZ2Z2UzNCNzBZeDRUc1pibDFlbTN3T2crcWpFSHJ3SWhBTEpzTlNXYUJreTNTZ2txbmhIQWxjdzFibldMVU9pM29lTHp4UERZdTV2WCIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpha05EUW5adFowRjNTVUpCWjBsVlRFSXdlRkJ5ZW5ZMVNTOTJSRUYwUjFSTmFpODRVVko2VjFKVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3hUMVJKTkZkb1kwNU5hbGwzVG1wRk5FMUVZM2RQVkVrMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZuYjJad1luaGxhWHBhVVZSNFVIRkxjRFE0VG0xck4ydElPVzlhWTFWNGVFeDBibGtLT1hWWksxQnNjMnhGYUhsRU4yeFZZVkJOUlcxQ1ptOWpaVUZNUWtwbVFtaHpRM05OVjFsS1pFdDFSMnh6YXl0TGRXRlBRMEpvWjNkbloxbFZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZ2TVRsVENsTjFXSGhuZGt0eFJIcHFRa05qY1hKWmNETjVZVzF6ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYjBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmtGU05rRklaMEZrWjBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbWg0Um5WQlFVRkZRWGRDU0UxRlZVTkpSVGhKQ2sxQlZqSTBRbUo0TldaRlMxSmxWbU5ZY0dWcWJsQmFkbXBIVDIxS09TOVZlWGxVTVhGck1FeEJhVVZCY0hSeFNEaE9aV1l2U0VkUGFqRjFXV3hNZWxvS2QwRXJOamROVGpWa1NHaDFVU3N3TkRSa2RrMW9RbTkzUTJkWlNVdHZXa2w2YWpCRlFYZE5SRnAzUVhkYVFVbDNVbm8xVWxGcmQybEhVaXRwTkdreVRncG1kVlJaVEVOR09GbE5SVFpDTTFjemF6RmplbkpCVDIxd1JUUjVWWFp4WTFjNVRIQkROSEJFTWxwS1dFMWpaMFJCYWtFNGR6SXdVVEl2SzBKT05rc3JDbXcxT1hGWmJIUTRUWE5UYmk5bk5URlJaSEUxYlVWdU5rNHdaRlJuUzIxRWRWaFVWRlpIVGpSU1UzRkJkemRSZFUxNU1EMEtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgZU084/b6CYI86/XNIPIERo0S3kyxCJa5uQsVLVMNmtoCFQDJm7D4uPYN85Aik2wFM5QYxW8DFhgPMjAyNjA2MTgwNjU5MjhaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYxODA2NTkyOFowLwYJKoZIhvcNAQkEMSIEIMVF7tgmZ2i5sUfSjE8lEkaStqM9+NrqOjVeti0RNrV2MIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMQDe/bg2M2COmmTOmaWAILOQgjCUClJaxprKKmN9Ip2/aZ/gf6d+KlqHVDciczzQz+cCMA75ixoaLhfUnRRVP+vxMMeB9CF6TcERpN1slsye25BaStqC94NTO+FOHDR3rqFQGA=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"76LNRzEvmZF5EyLoIVZKtfcOut2tzaxKFD2b1Sm26AE="},"signature":"MEYCIQCA9dPSlmRHUwQYgfvS3B70Yx4TsZbl1em3wOg+qjEHrwIhALJsNSWaBky3SgkqnhHAlcw1bnWLUOi3oeLzxPDYu5vX"}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHTDCCBtKgAwIBAgIUddQ3X+lFi9oJvb5J6e5raCqNGOgwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDIyWhcNMjYwNzAzMTM0NDIyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBN3JHjSEqplb9wumQW8YiiGAvUjO4qkr8MqcEHOAYSi+cOC0iTrIgEQvinkUBIPEvCtS3Z5f1Qqf+iK+c6nuG6OCBfEwggXtMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUlN9p01nRolcIYkZlnWr85Lkwh60wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygwAEsAAAQDAEgwRgIhAO+z4SUde/4XjnxVZ9asSS04Vs6dRFGflyYwu9SIYsvlAiEA+z07gZTLUaBvTFn3LwXZaZtagB3Id5dQtxBjC2eMucEwCgYIKoZIzj0EAwMDaAAwZQIwGmq8bFjdyqvUtfmjqI0STvKAOQ1hIpTukXLWhp30S8IlHIaCXonEKoqlcwltm7GTAjEAojKQNwxU2z5WkMQQniGLBIP+N6Lyi3J9lQXRo4+mgpJ9oTE+YdtTELvoah3jBuxI"},"tlogEntries":[{"logIndex":"2061241908","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085663","inclusionPromise":{"signedEntryTimestamp":"MEYCIQDNqu5q03BuhF76xYUcVWGV5C3sUU0XobHmlaSIJaZ5DQIhAJVgf+zncz0kGxAl4vwijAqdmITBnhBM+a6Dz9b8Z/+4"},"inclusionProof":{"logIndex":"1939337646","rootHash":"3C+noGoT4FmdIuVTizJaoQm6VNVBYuU57m8LHPBPMXo=","treeSize":"1939338121","hashes":["eORFUhxE+Fi7bUyR0GRZdugd/+6VOQfOVaSEcEpmRJI=","BbNn021DULBC1bPscukGQ4QKONd7xjUs/mgo1uB5ZBU=","WSKiOV7jjQVnr0NCsrN3+IhaUlcRg2cBXMK29UKIh10=","O5m9+4zppPVsq2s2IuRzEDkyZxKhoPMPBMMj7zVJ0qI=","2CIsXziSM3WK7YcHbKmjg4/YQk2rrcpohVzH2Q917yI=","FC1jTq6N3p5jQ0Tu155x2w1IHIYF4UsKK94H6fBtdcU=","4LBoy7xP5SywGarpMdyyibXTTOAYWM3DhakMetWXgcY=","at0BMioReFfQUJ6isVoixcbPcOW5lnVSBpFomYyzWvs=","n50kMCd6i6RmefEH9RcjB/KJ9e4j7eI5wQUAx7+0zto=","DsOPb6I67+ElLyJAS9yMR2r9kHqJIJLFldPObUfHl+Q=","DzrLfiUQC199WzQ89kUKfq6O8+cY/p7Y5Y+TrQlGzKo=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939338121\n3C+noGoT4FmdIuVTizJaoQm6VNVBYuU57m8LHPBPMXo=\n\n— rekor.sigstore.dev wNI9ajBFAiBGcpP2SJy4MhbPqZWSCNErleyAxXQsnS8nhMDUQKt3ggIhAP6qmAA5RS2z+RbWyAqnSBPT/eOy+vIlRS/kALir8moE\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJhMGMyMmFkNDMxZTRmODlmZWYxMjZjMTE2YmFiYjc0NWZjOWE5MDg3MDA0ZjAzZGI4NWY1MDQ5N2VhNGRiNzY1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUMyWTNGclFia2p6Y1cwZ1diRkNZM2Q5aklPak5DVUdubW9LYlROS3U4VFFBSWdLL2huYUQwMmpqM2tlMiswM0FNeElNaExnTXdVZmR1TjVFaWRFVXNFRFVJPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVSRU5EUW5STFowRjNTVUpCWjBsVlpHUlJNMWdyYkVacE9XOUtkbUkxU2pabE5YSmhRM0ZPUjA5bmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JKZVZkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkVsNVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZDVGpOS1NHcFRSWEZ3YkdJNWQzVnRVVmM0V1dscFIwRjJWV3BQTkhGcmNqaE5jV01LUlVoUFFWbFRhU3RqVDBNd2FWUnlTV2RGVVhacGJtdFZRa2xRUlhaRGRGTXpXalZtTVZGeFppdHBTeXRqTm01MVJ6WlBRMEptUlhkbloxaDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZzVGpsd0NqQXhibEp2YkdOSldXdGFiRzVYY2pnMVRHdDNhRFl3ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRUtaVkZDTTBGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM2RCUlhOQlFVRlJSQXBCUldkM1VtZEphRUZQSzNvMFUxVmtaUzgwV0dwdWVGWmFPV0Z6VTFNd05GWnpObVJTUmtkbWJIbFpkM1U1VTBsWmMzWnNRV2xGUVN0Nk1EZG5XbFJNQ2xWaFFuWlVSbTR6VEhkWVdtRmFkR0ZuUWpOSlpEVmtVWFI0UW1wRE1tVk5kV05GZDBObldVbExiMXBKZW1vd1JVRjNUVVJoUVVGM1dsRkpkMGR0Y1RnS1lrWnFaSGx4ZGxWMFptMXFjVWt3VTFSMlMwRlBVVEZvU1hCVWRXdFlURmRvY0RNd1V6aEpiRWhKWVVOWWIyNUZTMjl4YkdOM2JIUnROMGRVUVdwRlFRcHZha3RSVG5kNFZUSjZOVmRyVFZGUmJtbEhURUpKVUN0T05reDVhVE5LT1d4UldGSnZOQ3R0WjNCS09XOVVSU3RaWkhSVVJVeDJiMkZvTTJwQ2RYaEpDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQg1xudnUbJNJNBkZuRgfoXOQYfKzCHdAoAOoL2aFhL81kCFDzwPlMo0Ny49RPV8DzCUJbLdspHGA8yMDI2MDcwMzEzMzQyMlowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNzAzMTMzNDIyWjAvBgkqhkiG9w0BCQQxIgQgyrpW+WYeHm6o9wdARpo0ODkNMhCVf17cIetgXPnF3QEwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIxAK7V9J04t+QjWBUan3rjLUy50xFDHPe2VQQjWnXq8DXbFo/H5spICcMwWQRUfi2ZiwIwClA+j9c4yZzL0lMflFq4bdL/2dN0HkPeB5FHxcsycGWQVOXbNcIpW3Fy4BZ5CdfU"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"oMIq1DHk+J/vEmwRa6u3RfyakIcATwPbhfUEl+pNt2U="},"signature":"MEUCIQC2Y3FrQbkjzcW0gWbFCY3d9jIOjNCUGnmoKbTNKu8TQAIgK/hnaD02jj3ke2+03AMxIMhLgMwUfduN5EidEUsEDUI="}}
build/torch212-cxx11-cu126-x86_64-linux/{_mamba_ssm_cuda_785446d.abi3.so → _mamba_ssm_cuda_2e4b976.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:747a84095d835efa373c0eb87501cd3840315c48e7e519ec799814c392012457
3
- size 444247416
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c05d89323944ad6c0e94573aebaa7bd15ccecf4ed1919d3065d4543a64915551
3
+ size 442378000
build/torch212-cxx11-cu126-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _mamba_ssm_cuda_785446d
3
- ops = torch.ops._mamba_ssm_cuda_785446d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_mamba_ssm_cuda_785446d::{op_name}"
 
1
  import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch212-cxx11-cu126-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "mamba-ssm",
3
- "id": "_mamba_ssm_cuda_785446d",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
@@ -23,8 +23,8 @@
23
  "algorithm": "sha256",
24
  "files": {
25
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
26
- "_mamba_ssm_cuda_785446d.abi3.so": "dHqECV2DXvo3PA64dQHNOEAxXEjn5RnseZgUw5IBJFc=",
27
- "_ops.py": "sO7E/nXmre7S3JlSTlFyMKDDSyF50/25kbwfNXzpfzg=",
28
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
29
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
30
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
 
1
  {
2
  "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
 
23
  "algorithm": "sha256",
24
  "files": {
25
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
26
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "wF2JMjlErWwOlFc666p70VzOz07RkZ0wZdRUOmSRVVE=",
27
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
28
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
29
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
30
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
build/torch212-cxx11-cu126-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHcjCCBvmgAwIBAgIUFQycNKlOYzumi46Sf462lLEzUg8wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY1OTI5WhcNMjYwNjE4MDcwOTI5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmuhVBab+VqzvkZhb+i/T52EFbOrXNdOmSIlx/106rFblPw1QSk66cb//MLeMELs7KxrzuHspB6FiY5XzkfShWKOCBhgwggYUMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUPF4rmwbN6fSoX6VgD4GcrpEV9RAwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZhxdBAAAEAwBHMEUCIQD32LYF9TAgMMfRrZqjPne+w+lYUfgfCOaJo2xYvWW1ZgIgbqlmbXZaQRdefpJFvfeAZkk3XXdYGMCfC/ahcGKkEf4wCgYIKoZIzj0EAwMDZwAwZAIwVS88Zop+zMezxr5XiNH3RsROoZ/OUWA3jjq3segJH/YwSAEzrrRaw6yBkicy1VduAjA1rsYQqx21ekD3upF0fGQfaTcF8koFiMCzb7o3BU/CCI2lWpZOfbVe2yfb/ARN77g="},"tlogEntries":[{"logIndex":"1857846197","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781765969","inclusionPromise":{"signedEntryTimestamp":"MEQCICdc1oq55Vgzkd7/VVorVuJ5z8UX4TFB2M82QhEr8YwfAiBiCrMzlUg9FltLA2NOFiIfzWFpjSmpWDtIS91G1QUDIw=="},"inclusionProof":{"logIndex":"1735941935","rootHash":"Uy8J72GH0z9A+iQ7dDveWGw9YLb6AiGC11tsUHkilV4=","treeSize":"1735941940","hashes":["1rlmh5+zDjjUIpsMQnn+nvaT3aQXEYR88cqfRbe6UPw=","/MbZtYZaBkrLwp6MOYbsGzjiVKdW4AjK1OHhYHaKdB0=","ldYsjgI9b/M4TTF36w6F/GEWGLS9zt8i+ORKnwUhg5U=","7Gb87c7D+NJL9brYcmaiqmXZAs3COClr/Ppex1m2gNk=","1dy1db1UxECvaJFSozZjLZDqPfVA1RrnlXZkSZJuP7o=","BB97qlwVzyc5X3CFK32LTQ9Uz98Snt4remtrrwkXIkc=","I0d0D9LPIksW5sRdo73kOhT8Y/fQxDpijIkJ4M+9V1g=","Zj/ZY0eBi0gwVgBaoEOc3DrvBQix71RFSiNXK4sPli4=","Q7TdDu7WbPJBWdHFC09Xg6476ZNxZHnnk9EwtegIzjs=","TIqZLgA6aRph3LTsRCezw52mN9jLpsdRobJF4nyuDsk=","h8qmLE5ZM/33fkJcCpa82SXVNA+SsbijaPv7rG6xbIM=","dBGkiPcr9PeHrVdmtM5A5GHZYWYJVpP1XmzLNrrX7Pk=","95goX8Iw4H4P6V4eHvRqTdVdViLbhEhsF6i7ICnz/+A=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735941940\nUy8J72GH0z9A+iQ7dDveWGw9YLb6AiGC11tsUHkilV4=\n\n— rekor.sigstore.dev wNI9ajBGAiEA7AjyqVxlaEu6LU79nXce7EK4+A8aaxvX6VB1kfiZfCECIQDHzkXOkzXHql1TYHbcSoujnXxETfq//OZMOIrW+kpNWQ==\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJhYjdhMTQ4Zjg4MmM5YmEwMzM1YjNiNjczN2FhZjA3ZjE3ZjI2YTRmNzU5MmY0M2RmODIwOGZiOGNhYWFiMzhhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUNUN1M2MFljVGMrdEZTQmV1TE5vOCs4M245aTNhK3ZpbjJsNmtSenRIcG9RSWhBSUFkdVY4NHNWdnNpeVFibzZQRi9YSEpva1I2M3huWDVGU3JPNGtudVE1byIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpha05EUW5adFowRjNTVUpCWjBsVlJsRjVZMDVMYkU5WmVuVnRhVFEyVTJZME5qSnNURVY2VldjNGQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3hUMVJKTlZkb1kwNU5hbGwzVG1wRk5FMUVZM2RQVkVrMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZ0ZFdoV1FtRmlLMVp4ZW5acldtaGlLMmt2VkRVeVJVWmlUM0pZVG1SUGJWTkpiSGdLTHpFd05uSkdZbXhRZHpGUlUyczJObU5pTHk5TlRHVk5SVXh6TjB0NGNucDFTSE53UWpaR2FWazFXSHByWmxOb1YwdFBRMEpvWjNkbloxbFZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZRUmpSeUNtMTNZazQyWmxOdldEWldaMFEwUjJOeWNFVldPVkpCZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYjBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmtGU05rRklaMEZrWjBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbWg0WkVKQlFVRkZRWGRDU0UxRlZVTkpVVVF6Q2pKTVdVWTVWRUZuVFUxbVVuSmFjV3BRYm1VcmR5dHNXVlZtWjJaRFQyRktieko0V1haWFZ6RmFaMGxuWW5Gc2JXSllXbUZSVW1SbFpuQktSblptWlVFS1dtdHJNMWhZWkZsSFRVTm1ReTloYUdOSFMydEZaalIzUTJkWlNVdHZXa2w2YWpCRlFYZE5SRnAzUVhkYVFVbDNWbE00T0ZwdmNDdDZUV1Y2ZUhJMVdBcHBUa2d6VW5OU1QyOWFMMDlWVjBFemFtcHhNM05sWjBwSUwxbDNVMEZGZW5KeVVtRjNObmxDYTJsamVURldaSFZCYWtFeGNuTlpVWEY0TWpGbGEwUXpDblZ3UmpCbVIxRm1ZVlJqUmpocmIwWnBUVU42WWpkdk0wSlZMME5EU1RKc1YzQmFUMlppVm1VeWVXWmlMMEZTVGpjM1p6MEtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyzADAgEAMIICwgYJKoZIhvcNAQcCoIICszCCAq8CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgHmSydlImbguPDFWZh+oSw7aeAazLhs45mAlyoDN8EMcCFQCM9i35JTj/fMOAnLls79WfpHjoBBgPMjAyNjA2MTgwNjU5MjlaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHcMIIB2AIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYxODA2NTkyOVowLwYJKoZIhvcNAQkEMSIEIISdT+0T1IG+e9u+WuKw1xgoGhiroyxnbIm+AkelPCsMMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRoMGYCMQD6+LtMqEWYDZMCWVCGauRHyUL2dspphi4EUc06yYtqhJyajp1Z7ChARYEZ1oxP7AcCMQD87v3siefd3aFcu/qpMJy6PvkUOG8oKAWlL/v48/pTnH1ndGTX0kz8+J4c2JNGPho="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"q3oUj4gsm6AzWztnN6rwfxfyak91kvQ9+CCPuMqqs4o="},"signature":"MEYCIQCT7S60YcTc+tFSBeuLNo8+83n9i3a+vin2l6kRztHpoQIhAIAduV84sVvsiyQbo6PF/XHJokR63xnX5FSrO4knuQ5o"}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHSjCCBtGgAwIBAgIUUJjfNKu68k4GUtHKhBb6Eh3bA1QwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDI2WhcNMjYwNzAzMTM0NDI2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXmKWVWCUz5urm/H55S1AFLmkZdPPYLrPr6GH808cOyLGJVjzg65zJOYQxj+XGepQYwvtYBpomzhbu58LZeZsSqOCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUV+MqitM6RGg9NSWDJdnO0QV+rq8wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygwEYAAAAQDAEcwRQIhANfidHXjINp4GCImwRF42vyFwIrwkj6aa3HiDlpTuBeFAiBEdoYyUOSQf2GZ3ule9vHVQAw4VZtY9TE7v/fSgnA0JDAKBggqhkjOPQQDAwNnADBkAjAgesD7ZLtCNynKp/uKP5I1k/UIzbEMK3cKL941qjx9ETpQ/IBV7R60yWVLKCkE6LkCMDSA4/7A7SNX40FuY0dSWKT5OYvK5Sh3h8XVpflV2Kr5LPJxXgzEn+Dq7KZuoblYIQ=="},"tlogEntries":[{"logIndex":"2061242649","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085667","inclusionPromise":{"signedEntryTimestamp":"MEYCIQCdKTzyN5ACoz7y797EjStZtK5Gn4+l0QPG4lcgOYSIyQIhAKw3zL5UplfeWOYeDnHxo5jIxmDy1IkCK+V/xychMvL/"},"inclusionProof":{"logIndex":"1939338387","rootHash":"ph6AFlrFvXkccm+oRbi7a7PoFtqxACNoxPgwNG4uJHE=","treeSize":"1939338539","hashes":["AagxrWRp8NyclzJfSldCIfr4BNMmwxoATDFYSeowGvk=","C6OaEQUV5tZ9z+UdkFNXRylPVA47UJgQkzpwRK/qEvQ=","aY5fR8WkB/ciOcMdrpeXILwrDI1K0LT/4RPuZTmU+fM=","ZuJRa844f5KT5h/FHqcsRM4H5+gA5vL/Qr+2blVrhJo=","Ggn13FFycnzZnXQ0xKWS8HvcoY9oBpXIg18lr3TzkKQ=","b06IVRv1fyQLvCq2VPU8NqGuslPQ2RF6507ITmv0ork=","HB02knQZeux/rxP1RErY2mTv+wh9h6iQDSP3mfvqDno=","iYP4nZNGXEcZW79lN4xQhulIbYUObSR9AKcfRPFG7xk=","mywTrqqgp/ADmPtX+d5cvEH9AZDR7vhO1Cg28YImaEQ=","vPL+EUF/DLmK2Fbco/6ejKabFfks0ZfcRSbeaS+NZuw=","DzrLfiUQC199WzQ89kUKfq6O8+cY/p7Y5Y+TrQlGzKo=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939338539\nph6AFlrFvXkccm+oRbi7a7PoFtqxACNoxPgwNG4uJHE=\n\n— rekor.sigstore.dev wNI9ajBFAiAXJqyclxikSUbntAldCX4LZcADIYOeSE65fu9t/udKlQIhAJWqcTzdIb1RUyyVatrfbQdzN7hwgo5OiG/C9hFUns7M\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmNmE0NDc0NzVkODRmZDc5ZDI2NDJjNzcwOWZmZTkyODU1OWE1Y2E4MGIyMzQ2MTEyNGIwNGQ5MzE1MjRlNDRkIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUR1d1dUN1d5cHRVMDJHK2U1Sm9ERlVjK1dQQTJLc3YxODU3ZkxONVhodm1BSWdOUDI5eEtoRHRKTXdDeWRVb2d4eVdDdGw2SWFiV0kyV0pvTmlXWGVMZ0F3PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRha05EUW5SSFowRjNTVUpCWjBsVlZVcHFaazVMZFRZNGF6UkhWWFJJUzJoQ1lqWkZhRE5pUVRGUmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JKTWxkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkVreVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZZYlV0WFZsZERWWG8xZFhKdEwwZzFOVk14UVVaTWJXdGFaRkJRV1V4eVVISTJSMGdLT0RBNFkwOTVURWRLVm1wNlp6WTFla3BQV1ZGNGFpdFlSMlZ3VVZsM2RuUlpRbkJ2Ylhwb1luVTFPRXhhWlZwelUzRlBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZXSzAxeENtbDBUVFpTUjJjNVRsTlhSRXBrYms4d1VWWXJjbkU0ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM2RGV1VGQlFVRlJSQXBCUldOM1VsRkphRUZPWm1sa1NGaHFTVTV3TkVkRFNXMTNVa1kwTW5aNVJuZEpjbmRyYWpaaFlUTklhVVJzY0ZSMVFtVkdRV2xDUldSdldYbFZUMU5SQ21ZeVIxb3pkV3hsT1haSVZsRkJkelJXV25SWk9WUkZOM1l2WmxObmJrRXdTa1JCUzBKblozRm9hMnBQVUZGUlJFRjNUbTVCUkVKclFXcEJaMlZ6UkRjS1dreDBRMDU1Ymt0d0wzVkxVRFZKTVdzdlZVbDZZa1ZOU3pOalMwdzVOREZ4YW5nNVJWUndVUzlKUWxZM1VqWXdlVmRXVEV0RGEwVTJUR3REVFVSVFFRbzBMemRCTjFOT1dEUXdSblZaTUdSVFYwdFVOVTlaZGtzMVUyZ3phRGhZVm5CbWJGWXlTM0kxVEZCS2VGaG5la1Z1SzBSeE4wdGFkVzlpYkZsSlVUMDlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgLT0ikeAqTjLmOljdLUcOA0z1cRWv5CjxL4/AQyCWtBQCFQCsEQuC9iANjG4paEHHwfg+kWGRAhgPMjAyNjA3MDMxMzM0MjZaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDcwMzEzMzQyNlowLwYJKoZIhvcNAQkEMSIEICXK9sBA6rBM5shX7qrx/ULl4llJ8lxSnh0okb1iI6H0MIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMFphFHSwGxVK9yLwRZvSEgBls5Bi8StgGHl2m4hUQBWWbco27SSCF06OAeZtvIZyygIxAPNNnGg2SBwqax49KbL4j1UKuZe2R2RJSjsJ4G7BGGu705Qx/woJPvXJ/p903bbG6g=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"9qRHR12E/XnSZCx3Cf/pKFWaXKgLI0YRJLBNkxUk5E0="},"signature":"MEUCIQDuwWT7WyptU02G+e5JoDFUc+WPA2Ksv1857fLN5XhvmAIgNP29xKhDtJMwCydUogxyWCtl6IabWI2WJoNiWXeLgAw="}}
build/torch212-cxx11-cu130-x86_64-linux/_mamba_ssm_cuda_2e4b976.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5916c70a4df881b5c2db38a6764a65738630f4bb8bd2f77e16f7dcb453a5be75
3
+ size 496412112
build/torch212-cxx11-cu130-x86_64-linux/_mamba_ssm_cuda_785446d.abi3.so DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:887e8804bbb599b45d1038fef7ce4d0246d0f3c4f57b9f9f8fe57458a22e97f2
3
- size 446636520
 
 
 
 
build/torch212-cxx11-cu130-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _mamba_ssm_cuda_785446d
3
- ops = torch.ops._mamba_ssm_cuda_785446d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_mamba_ssm_cuda_785446d::{op_name}"
 
1
  import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch212-cxx11-cu130-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "mamba-ssm",
3
- "id": "_mamba_ssm_cuda_785446d",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
@@ -11,7 +11,8 @@
11
  "archs": [
12
  "10.0",
13
  "11.0",
14
- "12.0+PTX",
 
15
  "7.5",
16
  "8.0",
17
  "8.6",
@@ -24,8 +25,8 @@
24
  "algorithm": "sha256",
25
  "files": {
26
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
27
- "_mamba_ssm_cuda_785446d.abi3.so": "iH6IBLu1mbRdEDj+985NAkbQ88T1e5+fj+V0WKIul/I=",
28
- "_ops.py": "sO7E/nXmre7S3JlSTlFyMKDDSyF50/25kbwfNXzpfzg=",
29
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
30
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
31
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
 
1
  {
2
  "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
 
11
  "archs": [
12
  "10.0",
13
  "11.0",
14
+ "12.0",
15
+ "12.1+PTX",
16
  "7.5",
17
  "8.0",
18
  "8.6",
 
25
  "algorithm": "sha256",
26
  "files": {
27
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
28
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "WRbHCk34gbXC2zimdkplc4Yw9LuL0vd+FvfctFOlvnU=",
29
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
30
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
31
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
32
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
build/torch212-cxx11-cu130-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHczCCBvqgAwIBAgIUYzeP6d6SOUzcpqQexOuPqekUZZEwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY1OTMxWhcNMjYwNjE4MDcwOTMxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+reiHYHFFlD3iJMbTr4Zghc4M8rRY/4DMW5lzemD0hvZhbAabis6vZ5C8LGHAbpARK/T24SFxy3UJtGhhc8yWKOCBhkwggYVMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU1wJqNnhAQcZE5whkSsRATGMZXhEwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYsGCisGAQQB1nkCBAIEfQR7AHkAdwDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZhxzLAAAEAwBIMEYCIQCrHjIt8/Mxqu1rV1v56rIitP1rpnwD2IzDxYewZeonhwIhALyVqUKAuXr2baPxpXwAK+zEfIk14MniJq09IFNkJRX3MAoGCCqGSM49BAMDA2cAMGQCMFocKQyuGjwSJngxoHgS49O47fDe7/1h1Ljo1Ri5B+rH+KtlEL9FBvpLttRXPsj9KgIwFzCRMr6voYljS7QMRn1f5kd0C+Y7iJA0U5T9t0D/sn8DiWdyHPyfsEdluZD0ZMkj"},"tlogEntries":[{"logIndex":"1857846235","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781765971","inclusionPromise":{"signedEntryTimestamp":"MEUCIQCAb9DLOjOu2sWKfQ3fzff6dgPxHvX/OcYXJCc+XnzYnQIgZ8TogKX7xewP346/tOaHtU08ILG9ba4czKTbZWYlzHQ="},"inclusionProof":{"logIndex":"1735941973","rootHash":"fhED2b46W2NTiiuy1kmd4NLgWaATDvTV/40M/hrKFm8=","treeSize":"1735941974","hashes":["OGw9mg/wpdHmK5VauryBl0X+yWO6nPYzDWR9D5rUQu0=","4ItVUrr/DzNptISv0vK5j9TBaCrAVp6yjhHlVEDfaZ8=","mxoYEdujs3QpM9uLs4LL4SXZIRH6plcuSaWgJS2m7wc=","ub8kMqLeAfytAoGqmJGtJAw2nIyrk3CAs16GN2qPXTM=","I0d0D9LPIksW5sRdo73kOhT8Y/fQxDpijIkJ4M+9V1g=","Zj/ZY0eBi0gwVgBaoEOc3DrvBQix71RFSiNXK4sPli4=","Q7TdDu7WbPJBWdHFC09Xg6476ZNxZHnnk9EwtegIzjs=","TIqZLgA6aRph3LTsRCezw52mN9jLpsdRobJF4nyuDsk=","h8qmLE5ZM/33fkJcCpa82SXVNA+SsbijaPv7rG6xbIM=","dBGkiPcr9PeHrVdmtM5A5GHZYWYJVpP1XmzLNrrX7Pk=","95goX8Iw4H4P6V4eHvRqTdVdViLbhEhsF6i7ICnz/+A=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735941974\nfhED2b46W2NTiiuy1kmd4NLgWaATDvTV/40M/hrKFm8=\n\n— rekor.sigstore.dev wNI9ajBFAiEA3BpwyCUTiHk4DnycSM6P+SP3yoSdKcNLWnPfRPwK3YsCIBuZgXnENUoM5achZg8BdDzvQ814GYnKkPiy3QZnfB90\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIxZDhjODJmNGNlNmE4OTVkNjU5OTYyODg2MDNmNzJiZTg3YzM3MjIwMjMwYmVkMDEzN2FmNDg2MjI2ZDUyNTgzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRkgvbFA2K2pERnBJeGFld0tPQ2pZMUZIZWNVclhoUXIrMExPSWVOSk1tbUFpRUFuQ2M2MnowUmtRRG1zcWVQNUN2VERFSkRmQzRycXByUnBCWmJ2R0krTjdRPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpla05EUW5aeFowRjNTVUpCWjBsVldYcGxVRFprTmxOUFZYcGpjSEZSWlhoUGRWQnhaV3RWV2xwRmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3hUMVJOZUZkb1kwNU5hbGwzVG1wRk5FMUVZM2RQVkUxNFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVVyY21WcFNGbElSa1pzUkROcFNrMWlWSEkwV21kb1l6Uk5PSEpTV1M4MFJFMVhOV3dLZW1WdFJEQm9kbHBvWWtGaFltbHpOblphTlVNNFRFZElRV0p3UVZKTEwxUXlORk5HZUhrelZVcDBSMmhvWXpoNVYwdFBRMEpvYTNkbloxbFdUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlV4ZDBweENrNXVhRUZSWTFwRk5YZG9hMU56VWtGVVIwMWFXR2hGZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYzBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmxGU04wRklhMEZrZDBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbWg0ZWt4QlFVRkZRWGRDU1UxRldVTkpVVU55Q2tocVNYUTRMMDE0Y1hVeGNsWXhkalUyY2tscGRGQXhjbkJ1ZDBReVNYcEVlRmxsZDFwbGIyNW9kMGxvUVV4NVZuRlZTMEYxV0hJeVltRlFlSEJZZDBFS1N5dDZSV1pKYXpFMFRXNXBTbkV3T1VsR1RtdEtVbGd6VFVGdlIwTkRjVWRUVFRRNVFrRk5SRUV5WTBGTlIxRkRUVVp2WTB0UmVYVkhhbmRUU201bmVBcHZTR2RUTkRsUE5EZG1SR1UzTHpGb01VeHFiekZTYVRWQ0szSklLMHQwYkVWTU9VWkNkbkJNZEhSU1dGQnphamxMWjBsM1JucERVazF5Tm5adldXeHFDbE0zVVUxU2JqRm1OV3RrTUVNcldUZHBTa0V3VlRWVU9YUXdSQzl6YmpoRWFWZGtlVWhRZVdaelJXUnNkVnBFTUZwTmEyb0tMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgkhZdTeARGwtdlnvSMqTW/92TfA/Igyzr9s6qGhyUv58CFQD+CbpwOd0VNfXEVCW7m/cBBG/kLBgPMjAyNjA2MTgwNjU5MzFaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYxODA2NTkzMVowLwYJKoZIhvcNAQkEMSIEID6QKEbg87/vrGu6071J7r5PRsV0ru/t/ZjbA3WBprcqMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMGKF+2Rj4hQ44gGFKfa6QFKCbABkRPLy8AmQKvgp3ndno+OUjoce7nbwcOlWCF9z6AIxAJ5EK3NBj/6P1oLc9q+vlb4RU3UT23GNAr/qsvPhnWjUt4UFhELyL/02jmJNL8NSJA=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"HYyC9M5qiV1lmWKIYD9yvofDciAjC+0BN69IYibVJYM="},"signature":"MEUCIFH/lP6+jDFpIxaewKOCjY1FHecUrXhQr+0LOIeNJMmmAiEAnCc62z0RkQDmsqeP5CvTDEJDfC4rqprRpBZbvGI+N7Q="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHTDCCBtKgAwIBAgIUbFtbG/r/vU78yfcgHLRu5EYHTbYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDI5WhcNMjYwNzAzMTM0NDI5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKzYVlOmfsTxA8ipKlZ1Hi0rG2g+ta7J2Lkcot37HL8T+riFpG/8w8Y/RTlbi/CgYy7Zy/+bbehT8Q/JWnbAfkKOCBfEwggXtMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU+gjVEZqjnUP38UR3G94Bh99TpPgwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygwHYQAAAQDAEgwRgIhANdzjHyg5rzgP3BGLbLGwaIa4mlKWRUW2qJ1+HNv6nO/AiEA9JTSTnPTqg2ecaaJIPpF2fMBnIS7RNtR15+l/5kYhIUwCgYIKoZIzj0EAwMDaAAwZQIxAIZmijQks0FEPYBtpK+P4v0GO5UpAvWNXqf2+PUFsiJdhtfi6ddoo7mGxlcBkSAvzAIwHuWjE9Dx9amNh/KVKOBLNbWk24+2zJ95RHzXtj4ysJt5qY5KAUqlqThXW0aW4499"},"tlogEntries":[{"logIndex":"2061243384","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085670","inclusionPromise":{"signedEntryTimestamp":"MEUCIFBTboct5ykhZIG1Kio4srRFSk8OBCrRtR5kFuHPccqRAiEAjQVitCdR6F1caFXaTQR//dVrZwcI4xz+U4gYeX/Xs1w="},"inclusionProof":{"logIndex":"1939339122","rootHash":"sMDLXHMgu1OhL/4QYLPo8dSOfw4xsIo0EHiFuJx3pJ0=","treeSize":"1939339160","hashes":["x4+7mI07VfH1RuLlHYSeHz/C24N29vQedUFerMqs/2I=","mcNusd3qnAy3vFNeNZYz/lei37dm6wikY+JcAARuBcs=","6C7MoKK4+acaSNBuFQndyh4qIEThD8G8vOvF6cXxHtk=","Gkwv5MNtofQn+NCTHcNRGkQOm+dHmHxMgw4BYd1w5FQ=","1g38wVf//QWQu0lhs096BdFVH2X7EtNEy0JMvVH+BNg=","73al4ifkm61KrdXQywy+BGsBZrvimg08++UQMasf9H0=","A6TRvjbvZfM8jM/NthBgwp21rnPyCN0X00ZlGdZ0XjA=","lLsbYIvBmb4JJTShItnO/STbcGnw2Rz07D9DkBXojEc=","cbVHeB9qFZWeHWa3yMvAxROgW6Lbi5d7S3El/fl54kc=","pjV59X2NA8eDJxwhedFeTKT1bL7P6tUQAq2CvN5JVyU=","vPL+EUF/DLmK2Fbco/6ejKabFfks0ZfcRSbeaS+NZuw=","DzrLfiUQC199WzQ89kUKfq6O8+cY/p7Y5Y+TrQlGzKo=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939339160\nsMDLXHMgu1OhL/4QYLPo8dSOfw4xsIo0EHiFuJx3pJ0=\n\n— rekor.sigstore.dev wNI9ajBGAiEA+16wuifhnlPqb/MqB1cynkY8thi8CCSNn2h2iSCYLPYCIQD591Gm7RTXx34e7dlrR5Bh2HHosxQOKk8WRDpz8uSg4A==\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJhNjE5ZWRmYjQyZWU0NjQyMTVlMzIyNzg1OWFmNmU0N2Y0MzVjZDgxNGY4YmU1YWQ3ZGYzYjYxMGQ0NzE4NTYyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNMYVdTOTBrOXVEdlZtQ0EyR1V5Wk9sdk1jZlNYbUc5Q3pGd0RDZldoaGh3SWdkTWlXaUp1OWF2S2JZMTcveVlsRHRUYXUyRW1yUzRwOXcySTk4Nkp2c2xzPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVSRU5EUW5STFowRjNTVUpCWjBsVllrWjBZa2N2Y2k5MlZUYzRlV1pqWjBoTVVuVTFSVmxJVkdKWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JKTlZkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkVrMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZMZWxsV2JFOXRabk5VZUVFNGFYQkxiRm94U0drd2NrY3laeXQwWVRkS01reHJZMjhLZERNM1NFdzRWQ3R5YVVad1J5ODRkemhaTDFKVWJHSnBMME5uV1hrM1dua3ZLMkppWldoVU9GRXZTbGR1WWtGbWEwdFBRMEptUlhkbloxaDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlVyWjJwV0NrVmFjV3B1VlZBek9GVlNNMGM1TkVKb09UbFVjRkJuZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRUtaVkZDTTBGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM2RJV1ZGQlFVRlJSQXBCUldkM1VtZEphRUZPWkhwcVNIbG5OWEo2WjFBelFrZE1Za3hIZDJGSllUUnRiRXRYVWxWWE1uRktNU3RJVG5ZMmJrOHZRV2xGUVRsS1ZGTlVibEJVQ25Gbk1tVmpZV0ZLU1ZCd1JqSm1UVUp1U1ZNM1VrNTBVakUxSzJ3dk5XdFphRWxWZDBObldVbExiMXBKZW1vd1JVRjNUVVJoUVVGM1dsRkplRUZKV20wS2FXcFJhM013UmtWUVdVSjBjRXNyVURSMk1FZFBOVlZ3UVhaWFRsaHhaaklyVUZWR2MybEtaR2gwWm1rMlpHUnZiemR0UjNoc1kwSnJVMEYyZWtGSmR3cElkVmRxUlRsRWVEbGhiVTVvTDB0V1MwOUNURTVpVjJzeU5Dc3lla281TlZKSWVsaDBhalI1YzBwME5YRlpOVXRCVlhGc2NWUm9XRmN3WVZjME5EazVDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgyGt/jcVWBaX7vOayZc3WZQiltTk0HL7vnziTqJ3zj6wCFB2+CtyHea/+y8eIyGPt9al1sui0GA8yMDI2MDcwMzEzMzQyOVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNzAzMTMzNDI5WjAvBgkqhkiG9w0BCQQxIgQgn5T6ZBUIOVYAi+JtiT3B9IW++I6nLTc1SjreTNVt1YYwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIxAJ0uY5dXikwgjOiqo6f4tcexBTLT1qkd/3MbNELY+ylU8NbwHOf7FKloXNv+53OweAIwE/gMGiZjwGUqDCh8P2hzgaQEEjH43V/mibDJ1RMGZ/cb8sRH0M/JjVolAS/5cMeN"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"phnt+0LuRkIV4yJ4Wa9uR/Q1zYFPi+WtffO2ENRxhWI="},"signature":"MEUCIQCLaWS90k9uDvVmCA2GUyZOlvMcfSXmG9CzFwDCfWhhhwIgdMiWiJu9avKbY17/yYlDtTau2EmrS4p9w2I986Jvsls="}}
build/torch212-cxx11-cu132-x86_64-linux/_mamba_ssm_cuda_2e4b976.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:60a8a0bc5b4126cad7765f228a333f2cdc13dc0ec87e2ebc160353d8e9f76945
3
+ size 496466776
build/torch212-cxx11-cu132-x86_64-linux/_mamba_ssm_cuda_785446d.abi3.so DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:6e9bed730adb7381ff9261d3d6a8e81d50a0f07dae29b1d249eff5e5c8893292
3
- size 446457592
 
 
 
 
build/torch212-cxx11-cu132-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _mamba_ssm_cuda_785446d
3
- ops = torch.ops._mamba_ssm_cuda_785446d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_mamba_ssm_cuda_785446d::{op_name}"
 
1
  import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch212-cxx11-cu132-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "mamba-ssm",
3
- "id": "_mamba_ssm_cuda_785446d",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
@@ -11,7 +11,8 @@
11
  "archs": [
12
  "10.0",
13
  "11.0",
14
- "12.0+PTX",
 
15
  "7.5",
16
  "8.0",
17
  "8.6",
@@ -24,8 +25,8 @@
24
  "algorithm": "sha256",
25
  "files": {
26
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
27
- "_mamba_ssm_cuda_785446d.abi3.so": "bpvtcwrbc4H/kmHT1qjoHVCg8H2uKbHSSe/15ciJMpI=",
28
- "_ops.py": "sO7E/nXmre7S3JlSTlFyMKDDSyF50/25kbwfNXzpfzg=",
29
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
30
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
31
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
 
1
  {
2
  "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
  "version": 1,
5
  "license": "Apache-2.0",
6
  "python-depends": [
 
11
  "archs": [
12
  "10.0",
13
  "11.0",
14
+ "12.0",
15
+ "12.1+PTX",
16
  "7.5",
17
  "8.0",
18
  "8.6",
 
25
  "algorithm": "sha256",
26
  "files": {
27
  "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
28
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "YKigvFtBJsrXdl8iijM/LNwT3A7Ifi68FgNT2On3aUU=",
29
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
30
  "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
31
  "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
32
  "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
build/torch212-cxx11-cu132-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHczCCBvmgAwIBAgIUMM+5r9cGI0cx/DLURkmEz9B285swCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY1OTMyWhcNMjYwNjE4MDcwOTMyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqeOweCGfxrYfj5BvZHmLOtQkFVbrnX6mgRgtpV8TtcSUbRQ384CxrC+/L9ayrzrea89A+37kCybc5omBc4MNyaOCBhgwggYUMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUrpr5/t4H0BSzShreblytUfgjXKQwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZhyNNAAAEAwBHMEUCIDlgvbjEa6KKFby0xR8VJCZx/4zWrGFc2o1XWGjO4TgYAiEAq5nBpmsF9MosBrpzZ3J91x5AZcxki/tbAtQ8aCAPdQ4wCgYIKoZIzj0EAwMDaAAwZQIwSYGH/WKehfqUiIG0RDIQY6UJlrTPdvpHnlRq5P4Rdy7m8mSHzB7s3p90H0r2c/8wAjEAiVBI6RD7URxyOMJQ0cDZjNLE7sUIELDOrOFYJkxOkwV183CHUZv8eF7bbpxo/S/n"},"tlogEntries":[{"logIndex":"1857846291","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781765973","inclusionPromise":{"signedEntryTimestamp":"MEUCIBl7olsYDmm7xNhXfnAzGYVhcKkBmv9KEC3RyN5xuHpDAiEAsRSikNEwi9rWbaa4AbztPdjL4zEdhFfILAb7hUDmyuM="},"inclusionProof":{"logIndex":"1735942029","rootHash":"xOGWLQGRWDzWyaTEVQ4fkjmJQzGQZXbNpBoc2kNSoTM=","treeSize":"1735942037","hashes":["zszuzoFCFRMQjz0JrpVXj3oDI5f36Yc6xgCi+Vaq9WE=","9lGsC9aoiITGpYKBHNJTgKVW02ORRnXNIifFxUTSjm0=","0DB4Hi9OPmrVDGC9btQSqw+j8IPHfG4SBOz2NL95vyg=","ngGknwAAIRkpdLG12f3hbfO+miEa9WnA3cvfpDx99Ls=","HW3WivQCdMD7QTmXRNUj0zryBb5wXNWRnwL9Oz4rzDQ=","kIuV5L5CyF6tgW894HY0AGgyNQYe2pzavkFUqk+kHEQ=","I0d0D9LPIksW5sRdo73kOhT8Y/fQxDpijIkJ4M+9V1g=","Zj/ZY0eBi0gwVgBaoEOc3DrvBQix71RFSiNXK4sPli4=","Q7TdDu7WbPJBWdHFC09Xg6476ZNxZHnnk9EwtegIzjs=","TIqZLgA6aRph3LTsRCezw52mN9jLpsdRobJF4nyuDsk=","h8qmLE5ZM/33fkJcCpa82SXVNA+SsbijaPv7rG6xbIM=","dBGkiPcr9PeHrVdmtM5A5GHZYWYJVpP1XmzLNrrX7Pk=","95goX8Iw4H4P6V4eHvRqTdVdViLbhEhsF6i7ICnz/+A=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735942037\nxOGWLQGRWDzWyaTEVQ4fkjmJQzGQZXbNpBoc2kNSoTM=\n\n— rekor.sigstore.dev wNI9ajBFAiBA4erRtSMRggWmI/9v51MMzVFLmoKZQ/4VmBisjqkcaQIhAPSkU3pvubKJYsXpq1Xme7V2RxBNxQHvkrlVNZ+boCGW\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJiZjFiNGFjYmFhYjBmMzM1MzI2NzNhYTM0MzlhYTAxYzlkYTY1NGYxNDg3YzYyYmJkYzM3ODQ4ZDM3MzkyMDkwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJR1RsUzB3cmE5RGZIa1N0cGRqYWRmY25vYkJkMkFWekFDMXdkRFZMdDRleEFpQTU2RlRPK2pjeVp2Z25iS2l1dk54ei8rbTlKUzgyUy9Ya1dZM0JwaXZzU3c9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpla05EUW5adFowRjNTVUpCWjBsVlRVMHJOWEk1WTBkSk1HTjRMMFJNVlZKcmJVVjZPVUl5T0RWemQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3hUMVJOZVZkb1kwNU5hbGwzVG1wRk5FMUVZM2RQVkUxNVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZ4WlU5M1pVTkhabmh5V1dacU5VSjJXa2h0VEU5MFVXdEdWbUp5YmxnMmJXZFNaM1FLY0ZZNFZIUmpVMVZpVWxFek9EUkRlSEpES3k5TU9XRjVjbnB5WldFNE9VRXJNemRyUTNsaVl6VnZiVUpqTkUxT2VXRlBRMEpvWjNkbloxbFZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZ5Y0hJMUNpOTBORWd3UWxONlUyaHlaV0pzZVhSVlptZHFXRXRSZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYjBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmtGU05rRklaMEZrWjBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbWg1VGs1QlFVRkZRWGRDU0UxRlZVTkpSR3huQ25aaWFrVmhOa3RMUm1KNU1IaFNPRlpLUTFwNEx6UjZWM0pIUm1NeWJ6RllWMGRxVHpSVVoxbEJhVVZCY1RWdVFuQnRjMFk1VFc5elFuSndlbG96U2prS01YZzFRVnBqZUd0cEwzUmlRWFJST0dGRFFWQmtVVFIzUTJkWlNVdHZXa2w2YWpCRlFYZE5SR0ZCUVhkYVVVbDNVMWxIU0M5WFMyVm9abkZWYVVsSE1BcFNSRWxSV1RaVlNteHlWRkJrZG5CSWJteFNjVFZRTkZKa2VUZHRPRzFUU0hwQ04zTXpjRGt3U0RCeU1tTXZPSGRCYWtWQmFWWkNTVFpTUkRkVlVuaDVDazlOU2xFd1kwUmFhazVNUlRkelZVbEZURVJQY2s5R1dVcHJlRTlyZDFZeE9ETkRTRlZhZGpobFJqZGlZbkI0Ynk5VEwyNEtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgfjrShul28wl/jY2VEkIjCr2XHxdCw4uhpoP3127RmC4CFQCB3iq1L5XMdLFHKtGY8MR1nNTgihgPMjAyNjA2MTgwNjU5MzJaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYxODA2NTkzMlowLwYJKoZIhvcNAQkEMSIEIIBMsRiW+c07GTDLNMoGZQ3T7u0gJWMNUD/hJh6/3ojaMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMQCzsPEyXCkMORfI/t/Yf/5ebL2W08wTiXmRzEggLTwyVoUbypLojcUV2RDakQSxo9MCMBhfVKJT+IluIoIAPndAuZhqLEpHd469gxPY5rdSd/mT17xJEb8OMYlfEyn8ZZ0f3g=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"vxtKy6qw8zUyZzqjQ5qgHJ2mVPFIfGK73DeEjTc5IJA="},"signature":"MEQCIGTlS0wra9DfHkStpdjadfcnobBd2AVzAC1wdDVLt4exAiA56FTO+jcyZvgnbKiuvNxz/+m9JS82S/XkWY3BpivsSw=="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHSzCCBtGgAwIBAgIUMDt28NGxgntkuc1xw6sl8uyAlZQwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDMxWhcNMjYwNzAzMTM0NDMxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETs7gB7G3TjuSxc+HW3DoCf6ojQpGHKzAVVl/Cm7SM4XYPM21KDSElUKp6zU1/ERa8o8Eup5kJbvG0VGWsOcMn6OCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUuMIywtx9btRbZted6d+rhns6xQUwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygwJUoAAAQDAEcwRQIgHEMk65AndRFkm4tqIVDtCHghWq/7hGEGT/1UBzAkPFECIQDskguQT7Am6f0JWT6oiZ6zKA0yRBcccc+SWUzf8AomGDAKBggqhkjOPQQDAwNoADBlAjEA0LqHqyN6mAJxK8I2MeW8qFxFRaqbhmkaNFmLcmF6nNJIFLPAWZUyF4wJO6OdH4C2AjAbHX/QFEK/gQw3EDRV44sj+tMt+EVCHsP65ceBmZRi8yKeOU7fnR/NgipraI7/YKw="},"tlogEntries":[{"logIndex":"2061243917","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085672","inclusionPromise":{"signedEntryTimestamp":"MEUCIQCA0wR5utYVe2gB7mJbkTd4ZLIxdeHRQSGg4957wmG9VgIgdE1X+KnRlgImCkODkKXv/tFlzNVRf70yU/5gqXJajZM="},"inclusionProof":{"logIndex":"1939339655","rootHash":"EBRL1b2WkEi2IDmEBclf/525HrJlD5vgAydHuwSXzS4=","treeSize":"1939339701","hashes":["YhE9yLfWQsSaIbO37uwkehas0nqAXwJWEY4Zd2M5qEM=","VwKENxW0FbEOjyLIQE5I1t97bmlXG556XVK8jxMRbt8=","sMR6LxZssaFGC8uTFsEbb9unFUIrD28BF/dnacI62hk=","DzI8ye6c7V/hkytCOkNXReixi/qsPI2y+sbrBiHUg8c=","l6AJoAmxnzoCL6hUxhp2eKv9HV5KjjMKdeXLeseHqMU=","7RGVEkuphKpUMGpYXCpxVJ54mDAZrt5XtF/VU8ck8FA=","S77ums7qi8bqdvGWevv0mIA/EiRPC5lrY9EkJgeSiIU=","hSatCTPqnwEd6QSrf+u2cTNrUowI8vp1S5UDThLxeTQ=","BAEIfqDmH8MeIggO73jMvhFQigpEnGUOQG+zPEwM4V0=","DzrLfiUQC199WzQ89kUKfq6O8+cY/p7Y5Y+TrQlGzKo=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939339701\nEBRL1b2WkEi2IDmEBclf/525HrJlD5vgAydHuwSXzS4=\n\n— rekor.sigstore.dev wNI9ajBEAiBORcqqG9NO0FRuaJlrDz5rOAcbRO8KVX1dW5pt+AMt8QIgI4Y/VKF7EZWIS9WraSzWggTGml86yKDSn35c5XePme8=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3MmFiN2QwYWFjMDg5NGEyNzU5YjBkNjQ5NThiZjMxMTdjMGRhMGFhZWU2OWVkOTZkNWVlYTRkYTkyNWFlMDVmIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRzB5eEl0UzYrb2dpaUloRnBaMG5vTGZ2TkZkOEZZN1hHY0hNN3ZsQmxrSUFpRUEraC81MUhPM3o3Sk5mRkwvc05aNDJkMllVUm1jeXdJSk5LMmczd0ZTdXBJPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRla05EUW5SSFowRjNTVUpCWjBsVlRVUjBNamhPUjNobmJuUnJkV014ZUhjMmMydzRkWGxCYkZwUmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JOZUZkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkUxNFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZVY3pkblFqZEhNMVJxZFZONFl5dElWek5FYjBObU5tOXFVWEJIU0V0NlFWWldiQzhLUTIwM1UwMDBXRmxRVFRJeFMwUlRSV3hWUzNBMmVsVXhMMFZTWVRodk9FVjFjRFZyU21KMlJ6QldSMWR6VDJOTmJqWlBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlYxVFVsNUNuZDBlRGxpZEZKaVduUmxaRFprSzNKb2JuTTJlRkZWZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM2RLVlc5QlFVRlJSQXBCUldOM1VsRkpaMGhGVFdzMk5VRnVaRkpHYTIwMGRIRkpWa1IwUTBobmFGZHhMemRvUjBWSFZDOHhWVUo2UVd0UVJrVkRTVkZFYzJ0bmRWRlVOMEZ0Q2pabU1FcFhWRFp2YVZvMmVrdEJNSGxTUW1OalkyTXJVMWRWZW1ZNFFXOXRSMFJCUzBKblozRm9hMnBQVUZGUlJFRjNUbTlCUkVKc1FXcEZRVEJNY1VnS2NYbE9ObTFCU25oTE9Fa3lUV1ZYT0hGR2VFWlNZWEZpYUcxcllVNUdiVXhqYlVZMmJrNUtTVVpNVUVGWFdsVjVSalIzU2s4MlQyUklORU15UVdwQllncElXQzlSUmtWTEwyZFJkek5GUkZKV05EUnphaXQwVFhRclJWWkRTSE5RTmpWalpVSnRXbEpwT0hsTFpVOVZOMlp1VWk5T1oybHdjbUZKTnk5WlMzYzlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgs5XDXStTkpUHmqfBxFw8gv/Yhhjn5eTFCnSm7U0JP8gCFBEDORP4FKfs37ybgcx3rtC7yPK+GA8yMDI2MDcwMzEzMzQzMVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNzAzMTMzNDMxWjAvBgkqhkiG9w0BCQQxIgQgEelCGFU2vqPJBRgaQne0K/MeBkBGerWUYE1fSjAsts4wgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwaAmEKUNnyrObAK9dY6vLInEmius/5hhMTLjrfu63ZoZL0QjdS2g8lp+fF6Er7eveAjEAkGETcOW6qxlBnmr5o0Z1c/hgwf99FSAVu4N3t/SVuPN5qNkSb1+nRcf/IUZoKSUs"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"cqt9CqwIlKJ1mw1klYvzEXwNoKruae2W1e6k2pJa4F8="},"signature":"MEUCIG0yxItS6+ogiiIhFpZ0noLfvNFd8FY7XGcHM7vlBlkIAiEA+h/51HO3z7JNfFL/sNZ42d2YURmcywIJNK2g3wFSupI="}}
build/torch213-cxx11-cu126-x86_64-linux/__init__.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ __version__ = "2.2.4"
2
+
3
+ from .ops import selective_state_update, mamba_chunk_scan_combined, mamba_split_conv1d_scan_combined
4
+ from .ops.selective_scan_interface import selective_scan_fn, mamba_inner_fn
5
+ from .modules import Mamba, Mamba2
6
+ from .models import MambaLMHeadModel
7
+
8
+ falcon_mamba_inner_fn = mamba_inner_fn
9
+ __all__ = [
10
+ "selective_scan_fn", "mamba_inner_fn", "falcon_mamba_inner_fn", "selective_state_update", "mamba_chunk_scan_combined", "mamba_split_conv1d_scan_combined",
11
+ "Mamba", "Mamba2", "MambaLMHeadModel",
12
+ ]
build/torch213-cxx11-cu126-x86_64-linux/_mamba_ssm_cuda_2e4b976.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:896318787d4882d2da0bf871e4bf4c25911d1fb0651b37d4da1d7229f7a419f6
3
+ size 442378416
build/torch213-cxx11-cu126-x86_64-linux/_ops.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from . import _mamba_ssm_cuda_2e4b976
3
+ ops = torch.ops._mamba_ssm_cuda_2e4b976
4
+
5
+ def add_op_namespace_prefix(op_name: str):
6
+ """
7
+ Prefix op by namespace.
8
+ """
9
+ return f"_mamba_ssm_cuda_2e4b976::{op_name}"
build/torch213-cxx11-cu126-x86_64-linux/distributed/__init__.py ADDED
File without changes
build/torch213-cxx11-cu126-x86_64-linux/distributed/distributed_utils.py ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Optional
2
+
3
+ import torch
4
+ from torch import Tensor
5
+ from torch.distributed import ProcessGroup
6
+
7
+ # `all_gather_into_tensor` and `reduce_scatter_tensor` are new placeholders for
8
+ # `_all_gather_base` and `_reduce_scatter_base`. They require the most recent
9
+ # version of PyTorch. The following 4 lines are for backward compatibility with
10
+ # older PyTorch.
11
+ if "all_gather_into_tensor" not in dir(torch.distributed):
12
+ torch.distributed.all_gather_into_tensor = torch.distributed._all_gather_base
13
+ if "reduce_scatter_tensor" not in dir(torch.distributed):
14
+ torch.distributed.reduce_scatter_tensor = torch.distributed._reduce_scatter_base
15
+
16
+
17
+ # Raw operation, does not support autograd, but does support async
18
+ def all_gather_raw(input_: Tensor, process_group: ProcessGroup, async_op: bool = False):
19
+ world_size = torch.distributed.get_world_size(process_group)
20
+ output = torch.empty(
21
+ world_size * input_.shape[0], *input_.shape[1:], dtype=input_.dtype, device=input_.device
22
+ )
23
+ handle = torch.distributed.all_gather_into_tensor(
24
+ output, input_.contiguous(), group=process_group, async_op=async_op
25
+ )
26
+ return output, handle
27
+
28
+
29
+ # Raw operation, does not support autograd, but does support async
30
+ def reduce_scatter_raw(input_: Tensor, process_group: ProcessGroup, async_op: bool = False):
31
+ world_size = torch.distributed.get_world_size(process_group)
32
+ assert input_.shape[0] % world_size == 0
33
+ output = torch.empty(
34
+ input_.shape[0] // world_size, *input_.shape[1:], dtype=input_.dtype, device=input_.device
35
+ )
36
+ handle = torch.distributed.reduce_scatter_tensor(
37
+ output, input_.contiguous(), group=process_group, async_op=async_op
38
+ )
39
+ return output, handle
40
+
41
+
42
+ # Raw operation, does not support autograd, but does support async
43
+ def all_reduce_raw(input_: Tensor, process_group: ProcessGroup, async_op: bool = False):
44
+ input_ = input_.contiguous()
45
+ handle = torch.distributed.all_reduce(input_, group=process_group, async_op=async_op)
46
+ return input_, handle
47
+
48
+
49
+ class AllGatherFunc(torch.autograd.Function):
50
+ """Gather the input from sequence parallel region and concatenate."""
51
+
52
+ @staticmethod
53
+ def forward(ctx, input_: Tensor, process_group: ProcessGroup) -> Tensor:
54
+ ctx.process_group = process_group
55
+ output, _ = all_gather_raw(input_, process_group)
56
+ return output
57
+
58
+ @staticmethod
59
+ def backward(ctx, grad_output: Tensor):
60
+ grad_input, _ = reduce_scatter_raw(grad_output, ctx.process_group)
61
+ return grad_input, None
62
+
63
+
64
+ # Supports autograd, but does not support async
65
+ all_gather = AllGatherFunc.apply
66
+
67
+
68
+ class ReduceScatterFunc(torch.autograd.Function):
69
+ """Reduce scatter the input from the sequence parallel region and concatenate."""
70
+
71
+ @staticmethod
72
+ def forward(ctx, input_: Tensor, process_group: ProcessGroup) -> Tensor:
73
+ ctx.process_group = process_group
74
+ output, _ = reduce_scatter_raw(input_, process_group)
75
+ return output
76
+
77
+ @staticmethod
78
+ def backward(ctx, grad_output: Tensor):
79
+ grad_input, _ = all_gather_raw(grad_output, ctx.process_group)
80
+ return grad_input, None
81
+
82
+
83
+ # Supports autograd, but does not support async
84
+ reduce_scatter = ReduceScatterFunc.apply
85
+
86
+
87
+ class AllReduceFunc(torch.autograd.Function):
88
+ """Gather the input from sequence parallel region and concatenate."""
89
+
90
+ @staticmethod
91
+ def forward(ctx, input_: Tensor, process_group: ProcessGroup) -> Tensor:
92
+ ctx.process_group = process_group
93
+ output, _ = all_reduce_raw(input_, process_group)
94
+ return output
95
+
96
+ @staticmethod
97
+ def backward(ctx, grad_output: Tensor):
98
+ return grad_output, None
99
+
100
+
101
+ # Supports autograd, but does not support async
102
+ all_reduce = AllReduceFunc.apply
103
+
104
+
105
+ def sync_shared_params(model: torch.nn.Module, process_group: ProcessGroup):
106
+ # We want to iterate over parameters with _shared_params=True in the same order,
107
+ # as different ranks might have different number of parameters (e.g., only rank 0 has bias).
108
+ pamams_shared = {
109
+ name: p for name, p in model.named_parameters() if getattr(p, "_shared_params", False)
110
+ }
111
+ for _, p in sorted(pamams_shared.items()):
112
+ with torch.no_grad():
113
+ # Broadcast needs src to be global rank, not group rank
114
+ torch.distributed.broadcast(
115
+ p, src=torch.distributed.get_global_rank(process_group, 0), group=process_group
116
+ )
117
+
118
+
119
+ # Ref: https://github.com/NVIDIA/Megatron-LM/blob/52e636888cccc41e931251c417a7181fc36de926/megatron/optimizer/optimizer.py#L256
120
+ def allreduce_sequence_parallel_grad(model: torch.nn.Module, process_group: ProcessGroup):
121
+ # We want to iterate over parameters with _sequence_parallel=True in the same order,
122
+ # as different ranks might have different number of parameters (e.g., only rank 0 has bias).
123
+ params_seqparallel = {
124
+ name: p for name, p in model.named_parameters() if getattr(p, "_sequence_parallel", False)
125
+ }
126
+ grads = [p.grad for _, p in sorted(params_seqparallel.items())]
127
+ if grads:
128
+ with torch.no_grad():
129
+ coalesced = torch._utils._flatten_dense_tensors(grads)
130
+ torch.distributed.all_reduce(coalesced, group=process_group)
131
+ for buf, synced in zip(grads, torch._utils._unflatten_dense_tensors(coalesced, grads)):
132
+ buf.copy_(synced)
133
+
134
+
135
+ def get_dim_for_local_rank(dim: int, world_size: int, local_rank: int, multiple_of: int = 1) -> int:
136
+ """Get the dim for the local rank derived from splitting dim on world_size processes.
137
+
138
+ The split may not be even across the world_size processes.
139
+ """
140
+ multiple = dim // multiple_of
141
+ div = multiple // world_size
142
+ mod = multiple % world_size
143
+ local_multiple = div + int(local_rank < mod)
144
+ return local_multiple * multiple_of
build/torch213-cxx11-cu126-x86_64-linux/distributed/tensor_parallel.py ADDED
@@ -0,0 +1,296 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao.
2
+ # The TensorParallel linear modules are inspired by https://github.com/NVIDIA/apex/blob/master/apex/transformer/tensor_parallel/layers.py
3
+ from typing import Optional
4
+
5
+ import torch
6
+ import torch.nn as nn
7
+ import torch.nn.functional as F
8
+ from torch import Tensor
9
+ from torch.distributed import ProcessGroup
10
+ from ..utils.torch import custom_bwd, custom_fwd
11
+
12
+ from einops import rearrange
13
+
14
+ from ..distributed.distributed_utils import (
15
+ all_gather_raw,
16
+ all_reduce,
17
+ all_reduce_raw,
18
+ reduce_scatter,
19
+ reduce_scatter_raw,
20
+ )
21
+
22
+
23
+ class ParallelLinearFunc(torch.autograd.Function):
24
+ @staticmethod
25
+ @custom_fwd
26
+ def forward(ctx, x, weight, bias, process_group=None, sequence_parallel=True):
27
+ """
28
+ If process_group is not None and sequence_parallel=True, we're doing Tensor Parallel
29
+ with sequence parallelism: we do an all_gather_raw of x before doing the matmul.
30
+ """
31
+ ctx.compute_weight_gradient = weight.requires_grad
32
+ ctx.process_group = process_group
33
+ ctx.sequence_parallel = sequence_parallel
34
+
35
+ if torch.is_autocast_enabled():
36
+ x = x.to(dtype=torch.get_autocast_gpu_dtype())
37
+ x = x.contiguous()
38
+ if process_group is not None and sequence_parallel:
39
+ # We want to kick off the all_gather early, before weight dtype conversion
40
+ total_x, handle_x = all_gather_raw(x, process_group, async_op=True)
41
+ else:
42
+ total_x = x
43
+
44
+ if torch.is_autocast_enabled():
45
+ weight = weight.to(dtype=torch.get_autocast_gpu_dtype())
46
+ bias = bias.to(dtype=torch.get_autocast_gpu_dtype()) if bias is not None else None
47
+ weight = weight.contiguous()
48
+ if process_group is not None and sequence_parallel:
49
+ handle_x.wait()
50
+ batch_shape, n = total_x.shape[:-1], total_x.shape[-1]
51
+ batch_dim = batch_shape.numel()
52
+ # https://github.com/pytorch/pytorch/blob/5b51849b48a7dbccd297286cc0110def4706f9e7/aten/src/ATen/native/cuda/Blas.cpp#L174
53
+ output = F.linear(total_x, weight, bias)
54
+ if ctx.compute_weight_gradient:
55
+ ctx.save_for_backward(x, weight)
56
+ else:
57
+ ctx.save_for_backward(weight)
58
+ return output
59
+
60
+ @staticmethod
61
+ @custom_bwd
62
+ def backward(ctx, grad_output):
63
+ grad_output = grad_output.contiguous()
64
+ process_group = ctx.process_group
65
+ sequence_parallel = ctx.sequence_parallel
66
+ if ctx.compute_weight_gradient:
67
+ x, weight = ctx.saved_tensors
68
+ if process_group is not None and sequence_parallel:
69
+ total_x, handle_x = all_gather_raw(x, process_group, async_op=True)
70
+ else:
71
+ total_x = x
72
+ else:
73
+ (weight,) = ctx.saved_tensors
74
+ total_x = None
75
+ batch_shape = grad_output.shape[:-1]
76
+ batch_dim = batch_shape.numel()
77
+ grad_output = grad_output.reshape(batch_dim, grad_output.shape[-1])
78
+ if ctx.needs_input_grad[0]:
79
+ grad_input = F.linear(grad_output, weight.t())
80
+ grad_input = grad_input.reshape(*batch_shape, grad_input.shape[-1])
81
+ if process_group is not None:
82
+ reduce_fn = reduce_scatter_raw if sequence_parallel else all_reduce_raw
83
+ grad_input, handle_grad_input = reduce_fn(grad_input, process_group, async_op=True)
84
+ else:
85
+ grad_input = None
86
+ if ctx.needs_input_grad[1]:
87
+ assert ctx.compute_weight_gradient
88
+ if process_group is not None and sequence_parallel:
89
+ handle_x.wait()
90
+ grad_weight = torch.einsum(
91
+ "bo,bi->oi", grad_output, total_x.reshape(batch_dim, total_x.shape[-1])
92
+ )
93
+ else:
94
+ grad_weight = None
95
+ grad_bias = grad_output.sum(dim=0) if ctx.needs_input_grad[2] else None
96
+ if process_group is not None and ctx.needs_input_grad[0]:
97
+ handle_grad_input.wait()
98
+ return grad_input, grad_weight, grad_bias, None, None
99
+
100
+
101
+ def parallel_linear_func(
102
+ x: Tensor,
103
+ weight: Tensor,
104
+ bias: Optional[Tensor] = None,
105
+ process_group: Optional[ProcessGroup] = None,
106
+ sequence_parallel: bool = True,
107
+ ):
108
+ return ParallelLinearFunc.apply(x, weight, bias, process_group, sequence_parallel)
109
+
110
+
111
+ class ColumnParallelLinear(nn.Linear):
112
+ def __init__(
113
+ self,
114
+ in_features: int,
115
+ out_features: int,
116
+ process_group: ProcessGroup,
117
+ bias: bool = True,
118
+ sequence_parallel=True,
119
+ multiple_of=1,
120
+ device=None,
121
+ dtype=None,
122
+ ) -> None:
123
+ world_size = torch.distributed.get_world_size(process_group)
124
+ if out_features % multiple_of:
125
+ raise ValueError(f"out_features ({out_features}) must be a multiple of {multiple_of}")
126
+ multiple = out_features // multiple_of
127
+ # We want to split @multiple across world_size, but it could be an uneven split
128
+ div = multiple // world_size
129
+ mod = multiple % world_size
130
+ # The first @mod ranks get @div + 1 copies, the rest get @div copies
131
+ local_multiple = div + int(torch.distributed.get_rank(process_group) < mod)
132
+ super().__init__(
133
+ in_features, local_multiple * multiple_of, bias=bias, device=device, dtype=dtype
134
+ )
135
+ self.process_group = process_group
136
+ self.sequence_parallel = sequence_parallel
137
+
138
+ def forward(self, x):
139
+ # If self.sequence_parallel is True, we're doing Tensor Parallel with sequence parallelism:
140
+ # we do an all_gather of x before doing the matmul.
141
+ # If not, then the input is already gathered.
142
+ return parallel_linear_func(
143
+ x,
144
+ self.weight,
145
+ self.bias,
146
+ process_group=self.process_group,
147
+ sequence_parallel=self.sequence_parallel,
148
+ )
149
+
150
+
151
+ class RowParallelLinear(nn.Linear):
152
+ def __init__(
153
+ self,
154
+ in_features: int,
155
+ out_features: int,
156
+ process_group: ProcessGroup,
157
+ bias: bool = True,
158
+ sequence_parallel=True,
159
+ multiple_of=1,
160
+ device=None,
161
+ dtype=None,
162
+ ) -> None:
163
+ world_size = torch.distributed.get_world_size(process_group)
164
+ rank = torch.distributed.get_rank(process_group)
165
+ if in_features % multiple_of:
166
+ raise ValueError(f"in_features ({in_features}) must be a multiple of {multiple_of}")
167
+ multiple = in_features // multiple_of
168
+ # We want to split @multiple across world_size, but it could be an uneven split
169
+ div = multiple // world_size
170
+ mod = multiple % world_size
171
+ # The first @mod ranks get @div + 1 copies, the rest get @div copies
172
+ local_multiple = div + int(torch.distributed.get_rank(process_group) < mod)
173
+ # Only rank 0 will have bias
174
+ super().__init__(
175
+ local_multiple * multiple_of,
176
+ out_features,
177
+ bias=bias and rank == 0,
178
+ device=device,
179
+ dtype=dtype,
180
+ )
181
+ self.process_group = process_group
182
+ self.sequence_parallel = sequence_parallel
183
+
184
+ def forward(self, x):
185
+ """
186
+ We're doing Tensor Parallel with sequence parallelism: we do the matmul and then
187
+ a reduce_scatter of the result.
188
+ """
189
+ out = parallel_linear_func(x, self.weight, self.bias)
190
+ reduce_fn = reduce_scatter if self.sequence_parallel else all_reduce
191
+ return reduce_fn(out, self.process_group)
192
+
193
+
194
+ class VocabParallelEmbedding(nn.Embedding):
195
+ def __init__(self, num_embeddings, *args, process_group=None, padding_idx=None, **kwargs):
196
+ self.process_group = process_group
197
+ if process_group is not None:
198
+ world_size = torch.distributed.get_world_size(process_group)
199
+ if num_embeddings % world_size != 0:
200
+ raise ValueError(
201
+ f"num_embeddings ({num_embeddings}) must be divisible by "
202
+ f"world_size ({world_size})"
203
+ )
204
+ if world_size > 1 and padding_idx is not None:
205
+ raise RuntimeError("ParallelEmbedding does not support padding_idx")
206
+ else:
207
+ world_size = 1
208
+ super().__init__(num_embeddings // world_size, *args, padding_idx=padding_idx, **kwargs)
209
+
210
+ def forward(self, input: Tensor) -> Tensor:
211
+ if self.process_group is None:
212
+ return super().forward(input)
213
+ else:
214
+ rank = torch.distributed.get_rank(self.process_group)
215
+ vocab_size = self.num_embeddings
216
+ vocab_start_index, vocab_end_index = rank * vocab_size, (rank + 1) * vocab_size
217
+ # Create a mask of valid vocab ids (1 means it needs to be masked).
218
+ input_ids_mask = (input < vocab_start_index) | (input >= vocab_end_index)
219
+ input = input - vocab_start_index
220
+ input[input_ids_mask] = 0
221
+ embeddings = super().forward(input)
222
+ embeddings[input_ids_mask] = 0.0
223
+ return embeddings
224
+
225
+
226
+ class ColumnParallelEmbedding(nn.Embedding):
227
+ def __init__(self, num_embeddings, embedding_dim, *args, process_group=None, **kwargs):
228
+ self.process_group = process_group
229
+ if process_group is not None:
230
+ world_size = torch.distributed.get_world_size(process_group)
231
+ if embedding_dim % world_size != 0:
232
+ raise ValueError(
233
+ f"embedding_dim ({embedding_dim}) must be divisible by "
234
+ f"world_size ({world_size})"
235
+ )
236
+ else:
237
+ world_size = 1
238
+ super().__init__(num_embeddings, embedding_dim // world_size, *args, **kwargs)
239
+
240
+
241
+ class ParallelEmbeddings(nn.Module):
242
+ def __init__(
243
+ self,
244
+ embed_dim,
245
+ vocab_size,
246
+ max_position_embeddings,
247
+ process_group,
248
+ padding_idx=None,
249
+ sequence_parallel=True,
250
+ device=None,
251
+ dtype=None,
252
+ ):
253
+ """
254
+ If max_position_embeddings <= 0, there's no position embeddings
255
+ """
256
+ factory_kwargs = {"device": device, "dtype": dtype}
257
+ super().__init__()
258
+ self.process_group = process_group
259
+ self.sequence_parallel = sequence_parallel
260
+ self.word_embeddings = VocabParallelEmbedding(
261
+ vocab_size,
262
+ embed_dim,
263
+ padding_idx=padding_idx,
264
+ process_group=process_group,
265
+ **factory_kwargs,
266
+ )
267
+ self.max_position_embeddings = max_position_embeddings
268
+ if self.max_position_embeddings > 0:
269
+ self.position_embeddings = ColumnParallelEmbedding(
270
+ max_position_embeddings, embed_dim, process_group=process_group, **factory_kwargs
271
+ )
272
+
273
+ def forward(self, input_ids, position_ids=None, combine_batch_seqlen_dim=False):
274
+ """
275
+ input_ids: (batch, seqlen)
276
+ position_ids: (batch, seqlen)
277
+ """
278
+ batch_size, seqlen = input_ids.shape
279
+ world_size = torch.distributed.get_world_size(self.process_group)
280
+ embeddings = self.word_embeddings(input_ids)
281
+ if self.max_position_embeddings > 0:
282
+ if position_ids is None:
283
+ position_ids = torch.arange(seqlen, dtype=torch.long, device=input_ids.device)
284
+ position_embeddings = self.position_embeddings(position_ids)
285
+ if world_size <= 1:
286
+ embeddings = embeddings + position_embeddings
287
+ else:
288
+ partition_dim = self.position_embeddings.embedding_dim
289
+ rank = torch.distributed.get_rank(self.process_group)
290
+ embeddings[
291
+ ..., rank * partition_dim : (rank + 1) * partition_dim
292
+ ] += position_embeddings
293
+ if combine_batch_seqlen_dim:
294
+ embeddings = rearrange(embeddings, "b s d -> (b s) d")
295
+ reduce_fn = reduce_scatter if self.sequence_parallel else all_reduce
296
+ return embeddings if world_size <= 1 else reduce_fn(embeddings, self.process_group)
build/torch213-cxx11-cu126-x86_64-linux/mamba_ssm/__init__.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ctypes
2
+ import importlib.util
3
+ import sys
4
+ from pathlib import Path
5
+ from types import ModuleType
6
+
7
+
8
+ def _import_from_path(file_path: Path) -> ModuleType:
9
+ # We cannot use the module name as-is, after adding it to `sys.modules`,
10
+ # it would also be used for other imports. So, we make a module name that
11
+ # depends on the path for it to be unique using the hex-encoded hash of
12
+ # the path.
13
+ path_hash = "{:x}".format(ctypes.c_size_t(hash(file_path.absolute())).value)
14
+ module_name = path_hash
15
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
16
+ if spec is None:
17
+ raise ImportError(f"Cannot load spec for {module_name} from {file_path}")
18
+ module = importlib.util.module_from_spec(spec)
19
+ if module is None:
20
+ raise ImportError(f"Cannot load module {module_name} from spec")
21
+ sys.modules[module_name] = module
22
+ spec.loader.exec_module(module) # type: ignore
23
+ return module
24
+
25
+
26
+ globals().update(vars(_import_from_path(Path(__file__).parent.parent / "__init__.py")))
build/torch213-cxx11-cu126-x86_64-linux/metadata.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mamba-ssm",
3
+ "id": "_mamba_ssm_cuda_2e4b976",
4
+ "version": 1,
5
+ "license": "Apache-2.0",
6
+ "python-depends": [
7
+ "einops"
8
+ ],
9
+ "backend": {
10
+ "type": "cuda",
11
+ "archs": [
12
+ "7.0",
13
+ "7.2",
14
+ "7.5",
15
+ "8.0",
16
+ "8.6",
17
+ "8.7",
18
+ "8.9",
19
+ "9.0+PTX"
20
+ ]
21
+ },
22
+ "digest": {
23
+ "algorithm": "sha256",
24
+ "files": {
25
+ "__init__.py": "Z1jVawRP+RMSqPQG5GBCeRDHc99MRelfyPQzzhlvcYw=",
26
+ "_mamba_ssm_cuda_2e4b976.abi3.so": "iWMYeH1IgtLaC/hx5L9MJZEdH7BlGzfU2h1yKfekGfY=",
27
+ "_ops.py": "+JzYZB0OFy2LuJrKfDpyk0JXsS8Iz9Eoy+pClu3+vVI=",
28
+ "distributed/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
29
+ "distributed/distributed_utils.py": "qhcybRXtslssuV9LYaQy37haPaPtklM4YUMDx9UvnnQ=",
30
+ "distributed/tensor_parallel.py": "LD/G2t2u5uDHyG/aTr+K/Fow2BTfc6CqXNUWxyQNIOg=",
31
+ "mamba_ssm/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
32
+ "models/__init__.py": "mGa9i0oDQaBiEv4FbpIfrvEyWhK75wFNP5g0ob0pw1U=",
33
+ "models/config_mamba.py": "KnLBaG93W1ZUfjnKRAa6EBSNEv16eRxXziuoUSYBD80=",
34
+ "models/mixer_seq_simple.py": "SegRdVaBQKml6uoMoKE5UFWRHta0IiJ2fp4Tw1JqHIo=",
35
+ "modules/__init__.py": "Q6q0wng3smVLvW2pxCAQPReaKkydvGCNHFjs4Lu3LB4=",
36
+ "modules/block.py": "fH/KDDXmUo6oKx6K+NVmCcsuW4nEm9ahBLtvDo3S1gY=",
37
+ "modules/mamba2.py": "Lj2qX6BCpj4lrnI6UaWcemet6S0Iesmo/UjZ47NYYXg=",
38
+ "modules/mamba2_simple.py": "2W0krgqwr+Q/rDK/+sb+nC+wT793rZ7ozOMxZiehwBA=",
39
+ "modules/mamba_simple.py": "UcY/lpM+nAit3X2QYwSTp11yWxHaMXUmVQgcDL04qrs=",
40
+ "modules/mha.py": "QkTau2hxdCxTuSX84KWgYa1wcuRkMCZLcLwiWXcBS7g=",
41
+ "modules/mlp.py": "06o2CuZ2CNJYKXXyXsmtxXYT5ELy7e/NiOkTY+beUCE=",
42
+ "modules/ssd_minimal.py": "2qLlzjJemIQmrSn4opZQxEES01l2X5Hm5DAGfwAmyDg=",
43
+ "ops/__init__.py": "t5DB51GI8HuvZP+P8rSHCamL7Yf+AYsGf28FZ8MKKrA=",
44
+ "ops/selective_scan_interface.py": "8lhVZdB0fDirnB5TukYDM7urNIMp+4NlcqlzdexLVKM=",
45
+ "ops/triton/__init__.py": "EqZ8Nb7HWyhDVHYI34P87X1nTe5cmGtFGcpuwRwFEdY=",
46
+ "ops/triton/k_activations.py": "hVcl6DLerDT7XxZG0lL7stA44tj60UEg+JCSkxsmFH4=",
47
+ "ops/triton/layer_norm.py": "McoZpXkK4ta5rM9phlBH7VXrkIcoNjBSgb2PVuHYCvU=",
48
+ "ops/triton/layernorm_gated.py": "62JS4ke5DxyKdZRu+8GiIeDE2nAbZ1fdrknzSVz3pC8=",
49
+ "ops/triton/selective_state_update.py": "7xTBcJigSRZ+zqRRPtPUaZNDNMYEaWwos3LTw51tBog=",
50
+ "ops/triton/softplus.py": "rdz5bzBt0sm/HJ75/tpCOBpuVa2QbdkuIgWY/P7HtQg=",
51
+ "ops/triton/ssd_bmm.py": "LbPFXdUKyL6JRcWuOig+bRI06yOcqk2W0d/z+8qGo2c=",
52
+ "ops/triton/ssd_chunk_scan.py": "mmN52UEBuKlrsuyX4qGQUfVxmW4KsREa1lWL5lbbQIY=",
53
+ "ops/triton/ssd_chunk_state.py": "3by8diflkY4EpDcMuCoShrUlsA6wLrafD8+b/PGC/VA=",
54
+ "ops/triton/ssd_combined.py": "1ashwPfWuA5xcogid0YMTN48nSImgV8YosKlMqQoDEw=",
55
+ "ops/triton/ssd_state_passing.py": "YV3IxaeB2ysPo0qh+4SMx8Q1W77tMvw57DNhSQ4R6XU=",
56
+ "utils/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
57
+ "utils/generation.py": "21adNBvbzCLLvwW6lPmzhRofmxE68NR75fOWDl22ZkQ=",
58
+ "utils/hf.py": "qm86NJgmYSvzsxDSCevlBUa/GyvpvO49WVnKv6fSNfY=",
59
+ "utils/torch.py": "HDEyoadH6RSHToS18wDqgNApf6um65JWy1rEs9ZBPAY="
60
+ }
61
+ }
62
+ }
build/torch213-cxx11-cu126-x86_64-linux/metadata.json.sigstore ADDED
@@ -0,0 +1 @@
 
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHSjCCBtCgAwIBAgIUNjqcVqrCNDYaikeY5GAw4/zV34swCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzAzMTMzNDEyWhcNMjYwNzAzMTM0NDEyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjB0CFF7BjiIdPkb+KpWfqo2lmviEQXVGfe86+tcHv0g/AkS3N0/wVsf8SBOw0hm4c2R4D08mGxNIcX/jnbyNlKOCBe8wggXrMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUWHNx4N83urSytR5swgDe1qRQjPgwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMmU0Yjk3NjIxZTkzNzk3NDEzMmY1NDNkYjI1MTEyNjgwNmY5NGJiZTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDJlNGI5NzYyMWU5Mzc5NzQxMzJmNTQzZGIyNTExMjY4MDZmOTRiYmUwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg2NTg3NTg5NjAvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABnygv2M4AAAQDAEYwRAIgKvGzIUCod/LhkT3fGLrTv1lZmpJezi26xXdpkC+X+OMCIH4103u0bZY2mOOTm2DLanSzhq3F7LYQXzbxOcB0dD12MAoGCCqGSM49BAMDA2gAMGUCMQDWgyoxn5W3WgILH6jfBGZVC5YOkbPCOnNa5r4ek5+4FNukKJsiYrf+drRbbNv9SwgCMAEbKnYox1Jq6mDcB6DjoaItsuQb+n/nusUADCHZdpZ0SwRdsaRVkEE99bthiJRTug=="},"tlogEntries":[{"logIndex":"2061239456","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783085652","inclusionPromise":{"signedEntryTimestamp":"MEUCIAulub+37eRmvtu5p8/9AjscYtOv8z9DDx2S3Ct9dJvIAiEA296q2GaYR2KGT47DYdKeZkuubAAY0UtKrqZobbCGmmE="},"inclusionProof":{"logIndex":"1939335194","rootHash":"nW9WxvYfkJWZzKaPO7Up7lulGyorsszjYX9jGzrnAsg=","treeSize":"1939335463","hashes":["yAtkeFamdi6p0pEuPa9afSDkvg/7fv4RLTxPr7uKFWg=","lvIAsLBbyfbYw+6Pjs3rLl+4nfI7wA2pmG+CESFVgoo=","ijdkektuHB88nP5BhUwB7qHc9av6AU+/yykO+kQea2A=","uGWtzsEkB1C+wjp1tMG4hF2W83RLxrOgKLMJzuPA9S0=","wSeUWAn89U6OWeuZWb1wQJ+PIn71Eo5GUtRyRthhzXU=","o86vvXRH/IZI9QcKC/xGwV8+v+TRDKs7e7HQP6Q00Mg=","59iuhLvQPZPZwUqTGDfnie5hA7/BStdrMWwNuaLpo2Y=","3nXhfi5zT9J2PHiqy/W8Y8rVC1E2cu6PSvTisAFfRdA=","W6NE7ghJAQd6CR8dmdCxW9D288qbUVyzrr3rjQ5ac+o=","dkxSFJ76QYfcYZd0FZ1ztNIYtDj8WF+edLXK0EwhgP0=","ue6cwlKg+AeO5/32qCILy2n85VkpmL7JNSD/vSD1PBQ=","5BcprHTbYFhJs9/zmopgvIomJpaJBQ2p5EneNzCzjhA=","BJg3Sjw0cmSlRwTc6wLrDTLBGKIa47J4xQdeTHs89p0=","nyXRyDPEOSJJ9t2F32eShKYeAGz2Z0OK/J6fnsiywOY=","lvtUm97dglxCtkz/pZESafc25No18+C5udmljqWIKjw=","Z1MWr1e8FrDf8zVzz0XKh0zpL1DZePbT3JTZ0UIXhhg=","I+dZvIwhBcmylTZ5mLoVIKIapQHRH789ramiw5T/osA=","RIZjwQJv61lwM5JOP8iNT/RxKPr522/etVqxVBWn7KA=","b69YlhA5qlDwN70us4bq9ysnikE1ulA7EwKBTb+atY0=","LM7F5iwbk8jG29X4FwpkCN6BqDCfuNQTlz5CyQWt87s=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1939335463\nnW9WxvYfkJWZzKaPO7Up7lulGyorsszjYX9jGzrnAsg=\n\n— rekor.sigstore.dev wNI9ajBFAiEA5RnZpStPz+KSTaSWBxRy5fCeSZa2IQXK88hLVU3Qny8CIAoeE9oprRa6zesV1IlsXx138taaq2POBoNVzrx+z2WU\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJhOThmYWZkZDkxOTZhM2NkY2FlMWY5MDNiMWU5OTk5YTRlYTI2ZTEyYjU3NTI4ODcyYTAyYThhZjk1OGM4MmFjIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUNFanJkTXBsNmtkTkpDaS80dy9FUUpmb1FibXh1S21nU0ZTVGR0ZTRGN0lnSWhBS3IwRFRMbDhGVDhtQWlTb013NGl1S2VqYmFpWWc3K1N6amo3SlVDM0NuRiIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRha05EUW5SRFowRjNTVUpCWjBsVlRtcHhZMVp4Y2tOT1JGbGhhV3RsV1RWSFFYYzBMM3BXTXpSemQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVhwTlZFMTZUa1JGZVZkb1kwNU5hbGwzVG5wQmVrMVVUVEJPUkVWNVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZxUWpCRFJrWTNRbXBwU1dSUWEySXJTM0JYWm5Gdk1teHRkbWxGVVZoV1IyWmxPRFlLSzNSalNIWXdaeTlCYTFNelRqQXZkMVp6WmpoVFFrOTNNR2h0TkdNeVVqUkVNRGh0UjNoT1NXTllMMnB1WW5sT2JFdFBRMEpsT0hkbloxaHlUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZYU0U1NENqUk9PRE4xY2xONWRGSTFjM2RuUkdVeGNWSlJhbEJuZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVlV3V1dwck0wNXFTWGhhVkd0NlRucHJNMDVFUlhwTmJWa3hDazVFVG10WmFra3hUVlJGZVU1cVozZE9iVmsxVGtkS2FWcFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEZPUkU1cldXcEpNVTFVUlhrS1RtcG5kMDV0V1RWT1IwcHBXbFJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDF0VlRCWmFtc3pUbXBKZUZwVWEzcE9lbXN6VGtSRmVrMXRXVEVLVGtST2ExbHFTVEZOVkVWNVRtcG5kMDV0V1RWT1IwcHBXbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUktiRTVIU1RVS1RucFplVTFYVlRWTmVtTTFUbnBSZUUxNlNtMU9WRkY2V2tkSmVVNVVSWGhOYWxrMFRVUmFiVTlVVW1sWmJWVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jeVRsUm5NMDVVWnpWT2FrRjJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwVVZsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTTjBKSWEwRUtaSGRDTVVGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTVaM1l5VFRSQlFVRlJSQXBCUlZsM1VrRkpaMHQyUjNwSlZVTnZaQzlNYUd0VU0yWkhUSEpVZGpGc1dtMXdTbVY2YVRJMmVGaGtjR3RESzFnclQwMURTVWcwTVRBemRUQmlXbGt5Q20xUFQxUnRNa1JNWVc1VGVtaHhNMFkzVEZsUldIcGllRTlqUWpCa1JERXlUVUZ2UjBORGNVZFRUVFE1UWtGTlJFRXlaMEZOUjFWRFRWRkVWMmQ1YjNnS2JqVlhNMWRuU1V4SU5tcG1Ra2RhVmtNMVdVOXJZbEJEVDI1T1lUVnlOR1ZyTlNzMFJrNTFhMHRLYzJsWmNtWXJaSEpTWW1KT2RqbFRkMmREVFVGRllncExibGx2ZURGS2NUWnRSR05DTmtScWIyRkpkSE4xVVdJcmJpOXVkWE5WUVVSRFNGcGtjRm93VTNkU1pITmhVbFpyUlVVNU9XSjBhR2xLVWxSMVp6MDlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgQVmtTxbIT/yjkpdBUdjfgHn4abIJyMxxLjxOTOcDiRoCFQD/ql0ysX7q6cRBFsOhwZt6v739kBgPMjAyNjA3MDMxMzM0MTJaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHaMIIB1gIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDcwMzEzMzQxMlowLwYJKoZIhvcNAQkEMSIEIA9/aMZZoXGfrMJ42/ThC/x/PrQszmqmmeWtv83rV0AGMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRmMGQCMF0TU7NrAB+1RxhPnp5SE5SRXbRVF8UfAyxNw+nihNL0739rZKvcIxLUkhbWommrNQIwLTNFJVNbBb4wzx7VBbEk41gd+mVkXCFgVGhE5F7+/ydQCbsyj48NJb7hQtb+rWoW"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"qY+v3ZGWo83K4fkDsemZmk6ibhK1dSiHKgKor5WMgqw="},"signature":"MEYCIQCEjrdMpl6kdNJCi/4w/EQJfoQbmxuKmgSFSTdte4F7IgIhAKr0DTLl8FT8mAiSoMw4iuKejbaiYg7+Szjj7JUC3CnF"}}
build/torch213-cxx11-cu126-x86_64-linux/models/__init__.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ from .mixer_seq_simple import MambaLMHeadModel
2
+
3
+ __all__ = [
4
+ "MambaLMHeadModel",
5
+ ]
build/torch213-cxx11-cu126-x86_64-linux/models/config_mamba.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass, field
2
+
3
+
4
+ @dataclass
5
+ class MambaConfig:
6
+
7
+ d_model: int = 2560
8
+ d_intermediate: int = 0
9
+ n_layer: int = 64
10
+ vocab_size: int = 50277
11
+ ssm_cfg: dict = field(default_factory=dict)
12
+ attn_layer_idx: list = field(default_factory=list)
13
+ attn_cfg: dict = field(default_factory=dict)
14
+ rms_norm: bool = True
15
+ residual_in_fp32: bool = True
16
+ fused_add_norm: bool = True
17
+ pad_vocab_size_multiple: int = 8
18
+ tie_embeddings: bool = True
build/torch213-cxx11-cu126-x86_64-linux/models/mixer_seq_simple.py ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2023, Albert Gu, Tri Dao.
2
+
3
+ import math
4
+ from functools import partial
5
+ import json
6
+ import os
7
+ import copy
8
+
9
+ from collections import namedtuple
10
+
11
+ import torch
12
+ import torch.nn as nn
13
+
14
+ from .config_mamba import MambaConfig
15
+ from ..modules.mamba_simple import Mamba
16
+ from ..modules.mamba2 import Mamba2
17
+ from ..modules.mha import MHA
18
+ from ..modules.mlp import GatedMLP
19
+ from ..modules.block import Block
20
+ from ..utils.generation import GenerationMixin
21
+ from ..utils.hf import load_config_hf, load_state_dict_hf
22
+
23
+ try:
24
+ from ..ops.triton.layer_norm import RMSNorm, layer_norm_fn, rms_norm_fn
25
+ except ImportError:
26
+ RMSNorm, layer_norm_fn, rms_norm_fn = None, None, None
27
+
28
+
29
+ def create_block(
30
+ d_model,
31
+ d_intermediate,
32
+ ssm_cfg=None,
33
+ attn_layer_idx=None,
34
+ attn_cfg=None,
35
+ norm_epsilon=1e-5,
36
+ rms_norm=False,
37
+ residual_in_fp32=False,
38
+ fused_add_norm=False,
39
+ layer_idx=None,
40
+ device=None,
41
+ dtype=None,
42
+ ):
43
+ if ssm_cfg is None:
44
+ ssm_cfg = {}
45
+ if attn_layer_idx is None:
46
+ attn_layer_idx = []
47
+ if attn_cfg is None:
48
+ attn_cfg = {}
49
+ factory_kwargs = {"device": device, "dtype": dtype}
50
+ if layer_idx not in attn_layer_idx:
51
+ # Create a copy of the config to modify
52
+ ssm_cfg = copy.deepcopy(ssm_cfg) if ssm_cfg is not None else {}
53
+ ssm_layer = ssm_cfg.pop("layer", "Mamba1")
54
+ if ssm_layer not in ["Mamba1", "Mamba2"]:
55
+ raise ValueError(f"Invalid ssm_layer: {ssm_layer}, only support Mamba1 and Mamba2")
56
+ mixer_cls = partial(
57
+ Mamba2 if ssm_layer == "Mamba2" else Mamba,
58
+ layer_idx=layer_idx,
59
+ **ssm_cfg,
60
+ **factory_kwargs
61
+ )
62
+ else:
63
+ mixer_cls = partial(MHA, layer_idx=layer_idx, **attn_cfg, **factory_kwargs)
64
+ norm_cls = partial(
65
+ nn.LayerNorm if not rms_norm else RMSNorm, eps=norm_epsilon, **factory_kwargs
66
+ )
67
+ if d_intermediate == 0:
68
+ mlp_cls = nn.Identity
69
+ else:
70
+ mlp_cls = partial(
71
+ GatedMLP, hidden_features=d_intermediate, out_features=d_model, **factory_kwargs
72
+ )
73
+ block = Block(
74
+ d_model,
75
+ mixer_cls,
76
+ mlp_cls,
77
+ norm_cls=norm_cls,
78
+ fused_add_norm=fused_add_norm,
79
+ residual_in_fp32=residual_in_fp32,
80
+ )
81
+ block.layer_idx = layer_idx
82
+ return block
83
+
84
+
85
+ # https://github.com/huggingface/transformers/blob/c28d04e9e252a1a099944e325685f14d242ecdcd/src/transformers/models/gpt2/modeling_gpt2.py#L454
86
+ def _init_weights(
87
+ module,
88
+ n_layer,
89
+ initializer_range=0.02, # Now only used for embedding layer.
90
+ rescale_prenorm_residual=True,
91
+ n_residuals_per_layer=1, # Change to 2 if we have MLP
92
+ ):
93
+ if isinstance(module, nn.Linear):
94
+ if module.bias is not None:
95
+ if not getattr(module.bias, "_no_reinit", False):
96
+ nn.init.zeros_(module.bias)
97
+ elif isinstance(module, nn.Embedding):
98
+ nn.init.normal_(module.weight, std=initializer_range)
99
+
100
+ if rescale_prenorm_residual:
101
+ # Reinitialize selected weights subject to the OpenAI GPT-2 Paper Scheme:
102
+ # > A modified initialization which accounts for the accumulation on the residual path with model depth. Scale
103
+ # > the weights of residual layers at initialization by a factor of 1/√N where N is the # of residual layers.
104
+ # > -- GPT-2 :: https://openai.com/blog/better-language-models/
105
+ #
106
+ # Reference (Megatron-LM): https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/model/gpt_model.py
107
+ for name, p in module.named_parameters():
108
+ if name in ["out_proj.weight", "fc2.weight"]:
109
+ # Special Scaled Initialization --> There are 2 Layer Norms per Transformer Block
110
+ # Following Pytorch init, except scale by 1/sqrt(2 * n_layer)
111
+ # We need to reinit p since this code could be called multiple times
112
+ # Having just p *= scale would repeatedly scale it down
113
+ nn.init.kaiming_uniform_(p, a=math.sqrt(5))
114
+ with torch.no_grad():
115
+ p /= math.sqrt(n_residuals_per_layer * n_layer)
116
+
117
+
118
+ class MixerModel(nn.Module):
119
+ def __init__(
120
+ self,
121
+ d_model: int,
122
+ n_layer: int,
123
+ d_intermediate: int,
124
+ vocab_size: int,
125
+ ssm_cfg=None,
126
+ attn_layer_idx=None,
127
+ attn_cfg=None,
128
+ norm_epsilon: float = 1e-5,
129
+ rms_norm: bool = False,
130
+ initializer_cfg=None,
131
+ fused_add_norm=False,
132
+ residual_in_fp32=False,
133
+ device=None,
134
+ dtype=None,
135
+ ) -> None:
136
+ factory_kwargs = {"device": device, "dtype": dtype}
137
+ super().__init__()
138
+ self.residual_in_fp32 = residual_in_fp32
139
+
140
+ self.embedding = nn.Embedding(vocab_size, d_model, **factory_kwargs)
141
+
142
+ # We change the order of residual and layer norm:
143
+ # Instead of LN -> Attn / MLP -> Add, we do:
144
+ # Add -> LN -> Attn / MLP / Mixer, returning both the residual branch (output of Add) and
145
+ # the main branch (output of MLP / Mixer). The model definition is unchanged.
146
+ # This is for performance reason: we can fuse add + layer_norm.
147
+ self.fused_add_norm = fused_add_norm
148
+ if self.fused_add_norm:
149
+ if layer_norm_fn is None or rms_norm_fn is None:
150
+ raise ImportError("Failed to import Triton LayerNorm / RMSNorm kernels")
151
+
152
+ self.layers = nn.ModuleList(
153
+ [
154
+ create_block(
155
+ d_model,
156
+ d_intermediate=d_intermediate,
157
+ ssm_cfg=ssm_cfg,
158
+ attn_layer_idx=attn_layer_idx,
159
+ attn_cfg=attn_cfg,
160
+ norm_epsilon=norm_epsilon,
161
+ rms_norm=rms_norm,
162
+ residual_in_fp32=residual_in_fp32,
163
+ fused_add_norm=fused_add_norm,
164
+ layer_idx=i,
165
+ **factory_kwargs,
166
+ )
167
+ for i in range(n_layer)
168
+ ]
169
+ )
170
+
171
+ self.norm_f = (nn.LayerNorm if not rms_norm else RMSNorm)(
172
+ d_model, eps=norm_epsilon, **factory_kwargs
173
+ )
174
+
175
+ self.apply(
176
+ partial(
177
+ _init_weights,
178
+ n_layer=n_layer,
179
+ **(initializer_cfg if initializer_cfg is not None else {}),
180
+ n_residuals_per_layer=1 if d_intermediate == 0 else 2, # 2 if we have MLP
181
+ )
182
+ )
183
+
184
+ def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None, **kwargs):
185
+ return {
186
+ i: layer.allocate_inference_cache(batch_size, max_seqlen, dtype=dtype, **kwargs)
187
+ for i, layer in enumerate(self.layers)
188
+ }
189
+
190
+ def forward(self, input_ids, inference_params=None, **mixer_kwargs):
191
+ hidden_states = self.embedding(input_ids)
192
+ residual = None
193
+ for layer in self.layers:
194
+ hidden_states, residual = layer(
195
+ hidden_states, residual, inference_params=inference_params, **mixer_kwargs
196
+ )
197
+ if not self.fused_add_norm:
198
+ residual = (hidden_states + residual) if residual is not None else hidden_states
199
+ hidden_states = self.norm_f(residual.to(dtype=self.norm_f.weight.dtype))
200
+ else:
201
+ # Set prenorm=False here since we don't need the residual
202
+ hidden_states = layer_norm_fn(
203
+ hidden_states,
204
+ self.norm_f.weight,
205
+ self.norm_f.bias,
206
+ eps=self.norm_f.eps,
207
+ residual=residual,
208
+ prenorm=False,
209
+ residual_in_fp32=self.residual_in_fp32,
210
+ is_rms_norm=isinstance(self.norm_f, RMSNorm)
211
+ )
212
+ return hidden_states
213
+
214
+
215
+ class MambaLMHeadModel(nn.Module, GenerationMixin):
216
+
217
+ def __init__(
218
+ self,
219
+ config: MambaConfig,
220
+ initializer_cfg=None,
221
+ device=None,
222
+ dtype=None,
223
+ ) -> None:
224
+ self.config = config
225
+ d_model = config.d_model
226
+ n_layer = config.n_layer
227
+ d_intermediate = config.d_intermediate
228
+ vocab_size = config.vocab_size
229
+ ssm_cfg = config.ssm_cfg
230
+ attn_layer_idx = config.attn_layer_idx
231
+ attn_cfg = config.attn_cfg
232
+ rms_norm = config.rms_norm
233
+ residual_in_fp32 = config.residual_in_fp32
234
+ fused_add_norm = config.fused_add_norm
235
+ pad_vocab_size_multiple = config.pad_vocab_size_multiple
236
+ factory_kwargs = {"device": device, "dtype": dtype}
237
+
238
+ super().__init__()
239
+ if vocab_size % pad_vocab_size_multiple != 0:
240
+ vocab_size += pad_vocab_size_multiple - (vocab_size % pad_vocab_size_multiple)
241
+ self.backbone = MixerModel(
242
+ d_model=d_model,
243
+ n_layer=n_layer,
244
+ d_intermediate=d_intermediate,
245
+ vocab_size=vocab_size,
246
+ ssm_cfg=ssm_cfg,
247
+ attn_layer_idx=attn_layer_idx,
248
+ attn_cfg=attn_cfg,
249
+ rms_norm=rms_norm,
250
+ initializer_cfg=initializer_cfg,
251
+ fused_add_norm=fused_add_norm,
252
+ residual_in_fp32=residual_in_fp32,
253
+ **factory_kwargs,
254
+ )
255
+ self.lm_head = nn.Linear(d_model, vocab_size, bias=False, **factory_kwargs)
256
+
257
+ # Initialize weights and apply final processing
258
+ self.apply(
259
+ partial(
260
+ _init_weights,
261
+ n_layer=n_layer,
262
+ **(initializer_cfg if initializer_cfg is not None else {}),
263
+ )
264
+ )
265
+ self.tie_weights()
266
+
267
+ def tie_weights(self):
268
+ if self.config.tie_embeddings:
269
+ self.lm_head.weight = self.backbone.embedding.weight
270
+
271
+ def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None, **kwargs):
272
+ return self.backbone.allocate_inference_cache(batch_size, max_seqlen, dtype=dtype, **kwargs)
273
+
274
+ def forward(self, input_ids, position_ids=None, inference_params=None, num_last_tokens=0, **mixer_kwargs):
275
+ """
276
+ "position_ids" is just to be compatible with Transformer generation. We don't use it.
277
+ num_last_tokens: if > 0, only return the logits for the last n tokens
278
+ """
279
+ hidden_states = self.backbone(input_ids, inference_params=inference_params, **mixer_kwargs)
280
+ if num_last_tokens > 0:
281
+ hidden_states = hidden_states[:, -num_last_tokens:]
282
+ lm_logits = self.lm_head(hidden_states)
283
+ CausalLMOutput = namedtuple("CausalLMOutput", ["logits"])
284
+ return CausalLMOutput(logits=lm_logits)
285
+
286
+ @classmethod
287
+ def from_pretrained(cls, pretrained_model_name, device=None, dtype=None, **kwargs):
288
+ config_data = load_config_hf(pretrained_model_name)
289
+ config = MambaConfig(**config_data)
290
+ model = cls(config, device=device, dtype=dtype, **kwargs)
291
+ model.load_state_dict(load_state_dict_hf(pretrained_model_name, device=device, dtype=dtype))
292
+ return model
293
+
294
+ def save_pretrained(self, save_directory):
295
+ """
296
+ Minimal implementation of save_pretrained for MambaLMHeadModel.
297
+ Save the model and its configuration file to a directory.
298
+ """
299
+ # Ensure save_directory exists
300
+ os.makedirs(save_directory, exist_ok=True)
301
+
302
+ # Save the model's state_dict
303
+ model_path = os.path.join(save_directory, 'pytorch_model.bin')
304
+ torch.save(self.state_dict(), model_path)
305
+
306
+ # Save the configuration of the model
307
+ config_path = os.path.join(save_directory, 'config.json')
308
+ with open(config_path, 'w') as f:
309
+ json.dump(self.config.__dict__, f, indent=4)
build/torch213-cxx11-cu126-x86_64-linux/modules/__init__.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ from .mamba_simple import Mamba
2
+ from .mamba2 import Mamba2
3
+
4
+ __all__ = [
5
+ "Mamba",
6
+ "Mamba2",
7
+ ]
build/torch213-cxx11-cu126-x86_64-linux/modules/block.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao, Albert Gu.
2
+ from typing import Optional
3
+
4
+ import torch
5
+ from torch import nn, Tensor
6
+
7
+ from ..ops.triton.layer_norm import RMSNorm, layer_norm_fn
8
+
9
+
10
+ class Block(nn.Module):
11
+ def __init__(
12
+ self,
13
+ dim,
14
+ mixer_cls,
15
+ mlp_cls,
16
+ norm_cls=nn.LayerNorm,
17
+ fused_add_norm=False,
18
+ residual_in_fp32=False,
19
+ ):
20
+ """
21
+ Simple block wrapping a mixer class with LayerNorm/RMSNorm and residual connection"
22
+
23
+ This Block has a slightly different structure compared to a regular
24
+ prenorm Transformer block.
25
+ The standard block is: LN -> MHA/MLP -> Add.
26
+ [Ref: https://arxiv.org/abs/2002.04745]
27
+ Here we have: Add -> LN -> Mixer, returning both
28
+ the hidden_states (output of the mixer) and the residual.
29
+ This is purely for performance reasons, as we can fuse add and LayerNorm.
30
+ The residual needs to be provided (except for the very first block).
31
+ """
32
+ super().__init__()
33
+ self.residual_in_fp32 = residual_in_fp32
34
+ self.fused_add_norm = fused_add_norm
35
+ self.norm = norm_cls(dim)
36
+ self.mixer = mixer_cls(dim)
37
+ if mlp_cls is not nn.Identity:
38
+ self.norm2 = norm_cls(dim)
39
+ self.mlp = mlp_cls(dim)
40
+ else:
41
+ self.mlp = None
42
+ if self.fused_add_norm:
43
+ assert RMSNorm is not None, "RMSNorm import fails"
44
+ assert isinstance(
45
+ self.norm, (nn.LayerNorm, RMSNorm)
46
+ ), "Only LayerNorm and RMSNorm are supported for fused_add_norm"
47
+
48
+ def forward(
49
+ self,
50
+ hidden_states: Tensor,
51
+ residual: Optional[Tensor] = None,
52
+ inference_params=None,
53
+ **mixer_kwargs
54
+ ):
55
+ r"""Pass the input through the encoder layer.
56
+
57
+ Args:
58
+ hidden_states: the sequence to the encoder layer (required).
59
+ residual: hidden_states = Mixer(LN(residual))
60
+ """
61
+ if not self.fused_add_norm:
62
+ residual = (
63
+ (hidden_states + residual) if residual is not None else hidden_states
64
+ )
65
+ hidden_states = self.norm(residual.to(dtype=self.norm.weight.dtype))
66
+ if self.residual_in_fp32:
67
+ residual = residual.to(torch.float32)
68
+ else:
69
+ hidden_states, residual = layer_norm_fn(
70
+ hidden_states,
71
+ self.norm.weight,
72
+ self.norm.bias,
73
+ residual=residual,
74
+ prenorm=True,
75
+ residual_in_fp32=self.residual_in_fp32,
76
+ eps=self.norm.eps,
77
+ is_rms_norm=isinstance(self.norm, RMSNorm),
78
+ )
79
+ hidden_states = self.mixer(
80
+ hidden_states, inference_params=inference_params, **mixer_kwargs
81
+ )
82
+
83
+ if self.mlp is not None:
84
+ if not self.fused_add_norm:
85
+ residual = hidden_states + residual
86
+ hidden_states = self.norm2(residual.to(dtype=self.norm2.weight.dtype))
87
+ if self.residual_in_fp32:
88
+ residual = residual.to(torch.float32)
89
+ else:
90
+ hidden_states, residual = layer_norm_fn(
91
+ hidden_states,
92
+ self.norm2.weight,
93
+ self.norm2.bias,
94
+ residual=residual,
95
+ prenorm=True,
96
+ residual_in_fp32=self.residual_in_fp32,
97
+ eps=self.norm2.eps,
98
+ is_rms_norm=isinstance(self.norm2, RMSNorm),
99
+ )
100
+ hidden_states = self.mlp(hidden_states)
101
+
102
+ return hidden_states, residual
103
+
104
+ def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None, **kwargs):
105
+ return self.mixer.allocate_inference_cache(
106
+ batch_size, max_seqlen, dtype=dtype, **kwargs
107
+ )
build/torch213-cxx11-cu126-x86_64-linux/modules/mamba2.py ADDED
@@ -0,0 +1,502 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao, Albert Gu.
2
+
3
+ import math
4
+
5
+ import torch
6
+ import torch.nn as nn
7
+ import torch.nn.functional as F
8
+
9
+ from einops import rearrange, repeat
10
+
11
+ try:
12
+ from causal_conv1d import causal_conv1d_fn, causal_conv1d_update
13
+ except ImportError:
14
+ causal_conv1d_fn, causal_conv1d_update = None, None
15
+
16
+ try:
17
+ from causal_conv1d.causal_conv1d_varlen import causal_conv1d_varlen_states
18
+ except ImportError:
19
+ causal_conv1d_varlen_states = None
20
+
21
+ try:
22
+ from ..ops.triton.selective_state_update import selective_state_update
23
+ except ImportError:
24
+ selective_state_update = None
25
+
26
+ from ..ops.triton.layernorm_gated import RMSNorm as RMSNormGated
27
+
28
+ from ..distributed.tensor_parallel import ColumnParallelLinear, RowParallelLinear
29
+ from ..distributed.distributed_utils import all_reduce, reduce_scatter
30
+
31
+ from ..ops.triton.ssd_combined import mamba_chunk_scan_combined
32
+ from ..ops.triton.ssd_combined import mamba_split_conv1d_scan_combined
33
+
34
+ from huggingface_hub import PyTorchModelHubMixin
35
+
36
+
37
+ class Mamba2(nn.Module, PyTorchModelHubMixin):
38
+ def __init__(
39
+ self,
40
+ d_model,
41
+ d_state=128,
42
+ d_conv=4,
43
+ conv_init=None,
44
+ expand=2,
45
+ headdim=64,
46
+ d_ssm=None, # If not None, we only apply SSM on this many dimensions, the rest uses gated MLP
47
+ ngroups=1,
48
+ A_init_range=(1, 16),
49
+ D_has_hdim=False,
50
+ rmsnorm=True,
51
+ norm_before_gate=False,
52
+ dt_min=0.001,
53
+ dt_max=0.1,
54
+ dt_init_floor=1e-4,
55
+ dt_limit=(0.0, float("inf")),
56
+ bias=False,
57
+ conv_bias=True,
58
+ # Fused kernel and sharding options
59
+ chunk_size=256,
60
+ use_mem_eff_path=True,
61
+ layer_idx=None, # Absorb kwarg for general module
62
+ process_group=None,
63
+ sequence_parallel=True,
64
+ device=None,
65
+ dtype=None,
66
+ ):
67
+ factory_kwargs = {"device": device, "dtype": dtype}
68
+ super().__init__()
69
+ self.d_model = d_model
70
+ self.d_state = d_state
71
+ self.d_conv = d_conv
72
+ self.conv_init = conv_init
73
+ self.expand = expand
74
+ self.process_group = process_group
75
+ self.sequence_parallel = sequence_parallel
76
+ self.world_size = 1 if process_group is None else process_group.size()
77
+ self.local_rank = 0 if process_group is None else process_group.rank()
78
+ self.d_inner = (self.expand * self.d_model) // self.world_size
79
+ assert self.d_inner * self.world_size == self.expand * self.d_model
80
+ self.headdim = headdim
81
+ self.d_ssm = self.d_inner if d_ssm is None else d_ssm // self.world_size
82
+ assert ngroups % self.world_size == 0
83
+ self.ngroups = ngroups // self.world_size
84
+ assert self.d_ssm % self.headdim == 0
85
+ self.nheads = self.d_ssm // self.headdim
86
+ self.D_has_hdim = D_has_hdim
87
+ self.rmsnorm = rmsnorm
88
+ self.norm_before_gate = norm_before_gate
89
+ self.dt_limit = dt_limit
90
+ self.activation = "silu"
91
+ self.chunk_size = chunk_size
92
+ self.use_mem_eff_path = use_mem_eff_path
93
+ self.layer_idx = layer_idx
94
+
95
+ # Order: [z, x, B, C, dt]
96
+ d_in_proj = 2 * self.d_inner + 2 * self.ngroups * self.d_state + self.nheads
97
+ if self.process_group is None:
98
+ self.in_proj = nn.Linear(
99
+ self.d_model, d_in_proj, bias=bias, **factory_kwargs
100
+ )
101
+ else:
102
+ self.in_proj = ColumnParallelLinear(
103
+ self.d_model,
104
+ d_in_proj * self.world_size,
105
+ bias=bias,
106
+ process_group=self.process_group,
107
+ sequence_parallel=self.sequence_parallel,
108
+ **factory_kwargs,
109
+ )
110
+
111
+ conv_dim = self.d_ssm + 2 * self.ngroups * self.d_state
112
+ self.conv1d = nn.Conv1d(
113
+ in_channels=conv_dim,
114
+ out_channels=conv_dim,
115
+ bias=conv_bias,
116
+ kernel_size=d_conv,
117
+ groups=conv_dim,
118
+ padding=d_conv - 1,
119
+ **factory_kwargs,
120
+ )
121
+ if self.conv_init is not None:
122
+ nn.init.uniform_(self.conv1d.weight, -self.conv_init, self.conv_init)
123
+
124
+ self.act = nn.SiLU()
125
+
126
+ # Initialize log dt bias
127
+ dt = torch.exp(
128
+ torch.rand(self.nheads, **factory_kwargs)
129
+ * (math.log(dt_max) - math.log(dt_min))
130
+ + math.log(dt_min)
131
+ )
132
+ dt = torch.clamp(dt, min=dt_init_floor)
133
+ # Inverse of softplus: https://github.com/pytorch/pytorch/issues/72759
134
+ inv_dt = dt + torch.log(-torch.expm1(-dt))
135
+ self.dt_bias = nn.Parameter(inv_dt)
136
+ # Just to be explicit. Without this we already don't put wd on dt_bias because of the check
137
+ # name.endswith("bias") in param_grouping.py
138
+ self.dt_bias._no_weight_decay = True
139
+
140
+ assert A_init_range[0] > 0 and A_init_range[1] >= A_init_range[0]
141
+ A = torch.empty(self.nheads, dtype=torch.float32, device=device).uniform_(
142
+ *A_init_range
143
+ )
144
+ A_log = torch.log(A).to(dtype=dtype)
145
+ self.A_log = nn.Parameter(A_log)
146
+ self.A_log._no_weight_decay = True
147
+
148
+ # D "skip" parameter
149
+ self.D = nn.Parameter(
150
+ torch.ones(self.d_ssm if self.D_has_hdim else self.nheads, device=device)
151
+ )
152
+ self.D._no_weight_decay = True
153
+
154
+ if self.rmsnorm:
155
+ assert RMSNormGated is not None
156
+ self.norm = RMSNormGated(
157
+ self.d_ssm,
158
+ eps=1e-5,
159
+ norm_before_gate=self.norm_before_gate,
160
+ group_size=self.d_ssm // ngroups,
161
+ **factory_kwargs,
162
+ )
163
+
164
+ if self.process_group is None:
165
+ self.out_proj = nn.Linear(
166
+ self.d_inner, self.d_model, bias=bias, **factory_kwargs
167
+ )
168
+ else:
169
+ self.out_proj = RowParallelLinear(
170
+ self.d_inner * self.world_size,
171
+ self.d_model,
172
+ bias=bias,
173
+ process_group=self.process_group,
174
+ sequence_parallel=self.sequence_parallel,
175
+ **factory_kwargs,
176
+ )
177
+
178
+ def forward(
179
+ self, u, seqlen=None, seq_idx=None, cu_seqlens=None, inference_params=None
180
+ ):
181
+ """
182
+ u: (batch, seqlen, hidden_dim) if seqlen=None.
183
+ If seqlen is not None, u is (batch * seqlen, hidden_dim). This is so that when we
184
+ split u during sequence parallel, we split the batch * seqlen dimension
185
+ (in case batch is small).
186
+ Returns: same shape as u
187
+ """
188
+ seqlen_og = seqlen
189
+ if seqlen is None:
190
+ batch, seqlen, dim = u.shape
191
+ else:
192
+ batch_seqlen, dim = u.shape
193
+ batch = batch_seqlen // seqlen
194
+
195
+ conv_state, ssm_state = None, None
196
+ if inference_params is not None:
197
+ inference_batch = (
198
+ cu_seqlens.shape[0] - 1 if cu_seqlens is not None else batch
199
+ )
200
+ conv_state, ssm_state = self._get_states_from_cache(
201
+ inference_params, inference_batch
202
+ )
203
+ if inference_params.seqlen_offset > 0:
204
+ # The states are updated inplace
205
+ out, _, _ = self.step(u, conv_state, ssm_state)
206
+ return out
207
+
208
+ zxbcdt = self.in_proj(u) # (B, L, d_in_proj) or (B * L, d_in_proj)
209
+ if seqlen_og is not None:
210
+ zxbcdt = rearrange(zxbcdt, "(b l) d -> b l d", l=seqlen)
211
+ # If the model is loaded in fp16, without the .float() here, A might be -inf
212
+ A = -torch.exp(self.A_log.float()) # (nheads) or (d_inner, d_state)
213
+ dt_limit_kwargs = (
214
+ {} if self.dt_limit == (0.0, float("inf")) else dict(dt_limit=self.dt_limit)
215
+ )
216
+ if self.use_mem_eff_path and inference_params is None:
217
+ out = mamba_split_conv1d_scan_combined(
218
+ zxbcdt,
219
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
220
+ self.conv1d.bias,
221
+ self.dt_bias,
222
+ A,
223
+ D=(
224
+ rearrange(self.D, "(h p) -> h p", p=self.headdim)
225
+ if self.D_has_hdim
226
+ else self.D
227
+ ),
228
+ chunk_size=self.chunk_size,
229
+ seq_idx=seq_idx,
230
+ activation=self.activation,
231
+ rmsnorm_weight=self.norm.weight if self.rmsnorm else None,
232
+ rmsnorm_eps=self.norm.eps if self.rmsnorm else 1e-6,
233
+ outproj_weight=self.out_proj.weight,
234
+ outproj_bias=self.out_proj.bias,
235
+ headdim=None if self.D_has_hdim else self.headdim,
236
+ ngroups=self.ngroups,
237
+ norm_before_gate=self.norm_before_gate,
238
+ **dt_limit_kwargs,
239
+ )
240
+ if seqlen_og is not None:
241
+ out = rearrange(out, "b l d -> (b l) d")
242
+ if self.process_group is not None:
243
+ reduce_fn = reduce_scatter if self.sequence_parallel else all_reduce
244
+ out = reduce_fn(out, self.process_group)
245
+ else:
246
+ d_mlp = (
247
+ zxbcdt.shape[-1]
248
+ - 2 * self.d_ssm
249
+ - 2 * self.ngroups * self.d_state
250
+ - self.nheads
251
+ ) // 2
252
+ z0, x0, z, xBC, dt = torch.split(
253
+ zxbcdt,
254
+ [
255
+ d_mlp,
256
+ d_mlp,
257
+ self.d_ssm,
258
+ self.d_ssm + 2 * self.ngroups * self.d_state,
259
+ self.nheads,
260
+ ],
261
+ dim=-1,
262
+ )
263
+ if conv_state is not None:
264
+ if cu_seqlens is None:
265
+ # If we just take xBC[:, :, -self.d_conv :], it will error if seqlen < self.d_conv
266
+ # Instead F.pad will pad with zeros if seqlen < self.d_conv, and truncate otherwise.
267
+ xBC_t = rearrange(xBC, "b l d -> b d l")
268
+ conv_state.copy_(
269
+ F.pad(xBC_t, (self.d_conv - xBC_t.shape[-1], 0))
270
+ ) # Update state (B D W)
271
+ else:
272
+ assert (
273
+ causal_conv1d_varlen_states is not None
274
+ ), "varlen inference requires causal_conv1d package"
275
+ assert (
276
+ batch == 1
277
+ ), "varlen inference only supports batch dimension 1"
278
+ conv_varlen_states = causal_conv1d_varlen_states(
279
+ xBC.squeeze(0), cu_seqlens, state_len=conv_state.shape[-1]
280
+ )
281
+ conv_state.copy_(conv_varlen_states)
282
+ assert self.activation in ["silu", "swish"]
283
+ if causal_conv1d_fn is None or self.activation not in ["silu", "swish"]:
284
+ assert (
285
+ seq_idx is None
286
+ ), "varlen conv1d requires the causal_conv1d package"
287
+ xBC = self.act(
288
+ self.conv1d(xBC.transpose(1, 2)).transpose(1, 2)[
289
+ :, : -(self.d_conv - 1)
290
+ ]
291
+ ) # (B, L, self.d_ssm + 2 * ngroups * d_state)
292
+ else:
293
+ xBC = causal_conv1d_fn(
294
+ xBC.transpose(1, 2),
295
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
296
+ bias=self.conv1d.bias,
297
+ activation=self.activation,
298
+ seq_idx=seq_idx,
299
+ ).transpose(1, 2)
300
+ x, B, C = torch.split(
301
+ xBC,
302
+ [self.d_ssm, self.ngroups * self.d_state, self.ngroups * self.d_state],
303
+ dim=-1,
304
+ )
305
+ y = mamba_chunk_scan_combined(
306
+ rearrange(x, "b l (h p) -> b l h p", p=self.headdim),
307
+ dt,
308
+ A,
309
+ rearrange(B, "b l (g n) -> b l g n", g=self.ngroups),
310
+ rearrange(C, "b l (g n) -> b l g n", g=self.ngroups),
311
+ chunk_size=self.chunk_size,
312
+ D=(
313
+ rearrange(self.D, "(h p) -> h p", p=self.headdim)
314
+ if self.D_has_hdim
315
+ else self.D
316
+ ),
317
+ z=(
318
+ rearrange(z, "b l (h p) -> b l h p", p=self.headdim)
319
+ if not self.rmsnorm
320
+ else None
321
+ ),
322
+ dt_bias=self.dt_bias,
323
+ dt_softplus=True,
324
+ seq_idx=seq_idx,
325
+ cu_seqlens=cu_seqlens,
326
+ **dt_limit_kwargs,
327
+ return_final_states=ssm_state is not None,
328
+ return_varlen_states=cu_seqlens is not None
329
+ and inference_params is not None,
330
+ )
331
+ if ssm_state is not None:
332
+ y, last_state, *rest = y
333
+ if cu_seqlens is None:
334
+ ssm_state.copy_(last_state)
335
+ else:
336
+ varlen_states = rest[0]
337
+ ssm_state.copy_(varlen_states)
338
+ y = rearrange(y, "b l h p -> b l (h p)")
339
+ if self.rmsnorm:
340
+ y = self.norm(y, z)
341
+ if d_mlp > 0:
342
+ y = torch.cat([F.silu(z0) * x0, y], dim=-1)
343
+ if seqlen_og is not None:
344
+ y = rearrange(y, "b l d -> (b l) d")
345
+ out = self.out_proj(y)
346
+ return out
347
+
348
+ def step(self, hidden_states, conv_state, ssm_state):
349
+ dtype = hidden_states.dtype
350
+ assert (
351
+ hidden_states.shape[1] == 1
352
+ ), "Only support decoding with 1 token at a time for now"
353
+ zxbcdt = self.in_proj(hidden_states.squeeze(1)) # (B 2D)
354
+ d_mlp = (
355
+ zxbcdt.shape[-1]
356
+ - 2 * self.d_ssm
357
+ - 2 * self.ngroups * self.d_state
358
+ - self.nheads
359
+ ) // 2
360
+ z0, x0, z, xBC, dt = torch.split(
361
+ zxbcdt,
362
+ [
363
+ d_mlp,
364
+ d_mlp,
365
+ self.d_ssm,
366
+ self.d_ssm + 2 * self.ngroups * self.d_state,
367
+ self.nheads,
368
+ ],
369
+ dim=-1,
370
+ )
371
+
372
+ # Conv step
373
+ if causal_conv1d_update is None:
374
+ conv_state.copy_(
375
+ torch.roll(conv_state, shifts=-1, dims=-1)
376
+ ) # Update state (B D W)
377
+ conv_state[:, :, -1] = xBC
378
+ xBC = torch.sum(
379
+ conv_state * rearrange(self.conv1d.weight, "d 1 w -> d w"), dim=-1
380
+ ) # (B D)
381
+ if self.conv1d.bias is not None:
382
+ xBC = xBC + self.conv1d.bias
383
+ xBC = self.act(xBC).to(dtype=dtype)
384
+ else:
385
+ xBC = causal_conv1d_update(
386
+ xBC,
387
+ conv_state,
388
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
389
+ self.conv1d.bias,
390
+ self.activation,
391
+ )
392
+
393
+ x, B, C = torch.split(
394
+ xBC,
395
+ [self.d_ssm, self.ngroups * self.d_state, self.ngroups * self.d_state],
396
+ dim=-1,
397
+ )
398
+ A = -torch.exp(self.A_log.float()) # (nheads,)
399
+
400
+ # SSM step
401
+ if selective_state_update is None:
402
+ assert (
403
+ self.ngroups == 1
404
+ ), "Only support ngroups=1 for this inference code path"
405
+ # Discretize A and B
406
+ dt = F.softplus(dt + self.dt_bias.to(dtype=dt.dtype)) # (batch, nheads)
407
+ dA = torch.exp(dt * A) # (batch, nheads)
408
+ x = rearrange(x, "b (h p) -> b h p", p=self.headdim)
409
+ dBx = torch.einsum("bh,bn,bhp->bhpn", dt, B, x)
410
+ ssm_state.copy_(ssm_state * rearrange(dA, "b h -> b h 1 1") + dBx)
411
+ y = torch.einsum("bhpn,bn->bhp", ssm_state.to(dtype), C)
412
+ y = y + rearrange(self.D.to(dtype), "h -> h 1") * x
413
+ y = rearrange(y, "b h p -> b (h p)")
414
+ if not self.rmsnorm:
415
+ y = y * self.act(z) # (B D)
416
+ else:
417
+ A = repeat(A, "h -> h p n", p=self.headdim, n=self.d_state).to(
418
+ dtype=torch.float32
419
+ )
420
+ dt = repeat(dt, "b h -> b h p", p=self.headdim)
421
+ dt_bias = repeat(self.dt_bias, "h -> h p", p=self.headdim)
422
+ D = repeat(self.D, "h -> h p", p=self.headdim)
423
+ B = rearrange(B, "b (g n) -> b g n", g=self.ngroups)
424
+ C = rearrange(C, "b (g n) -> b g n", g=self.ngroups)
425
+ x_reshaped = rearrange(x, "b (h p) -> b h p", p=self.headdim)
426
+ if not self.rmsnorm:
427
+ z = rearrange(z, "b (h p) -> b h p", p=self.headdim)
428
+ y = selective_state_update(
429
+ ssm_state,
430
+ x_reshaped,
431
+ dt,
432
+ A,
433
+ B,
434
+ C,
435
+ D,
436
+ z=z if not self.rmsnorm else None,
437
+ dt_bias=dt_bias,
438
+ dt_softplus=True,
439
+ )
440
+ y = rearrange(y, "b h p -> b (h p)")
441
+ if self.rmsnorm:
442
+ y = self.norm(y, z)
443
+ if d_mlp > 0:
444
+ y = torch.cat([F.silu(z0) * x0, y], dim=-1)
445
+ out = self.out_proj(y)
446
+ return out.unsqueeze(1), conv_state, ssm_state
447
+
448
+ def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None, **kwargs):
449
+ device = self.out_proj.weight.device
450
+ conv_dtype = self.conv1d.weight.dtype if dtype is None else dtype
451
+ conv_state = torch.zeros(
452
+ batch_size,
453
+ self.d_conv,
454
+ self.conv1d.weight.shape[0],
455
+ device=device,
456
+ dtype=conv_dtype,
457
+ ).transpose(1, 2)
458
+ ssm_dtype = self.in_proj.weight.dtype if dtype is None else dtype
459
+ ssm_state = torch.zeros(
460
+ batch_size,
461
+ self.nheads,
462
+ self.headdim,
463
+ self.d_state,
464
+ device=device,
465
+ dtype=ssm_dtype,
466
+ )
467
+ return conv_state, ssm_state
468
+
469
+ def _get_states_from_cache(
470
+ self, inference_params, batch_size, initialize_states=False
471
+ ):
472
+ assert self.layer_idx is not None
473
+ if self.layer_idx not in inference_params.key_value_memory_dict:
474
+ batch_shape = (batch_size,)
475
+ conv_state = torch.zeros(
476
+ batch_size,
477
+ self.d_conv,
478
+ self.conv1d.weight.shape[0],
479
+ device=self.conv1d.weight.device,
480
+ dtype=self.conv1d.weight.dtype,
481
+ ).transpose(1, 2)
482
+ ssm_state = torch.zeros(
483
+ batch_size,
484
+ self.nheads,
485
+ self.headdim,
486
+ self.d_state,
487
+ device=self.in_proj.weight.device,
488
+ dtype=self.in_proj.weight.dtype,
489
+ )
490
+ inference_params.key_value_memory_dict[self.layer_idx] = (
491
+ conv_state,
492
+ ssm_state,
493
+ )
494
+ else:
495
+ conv_state, ssm_state = inference_params.key_value_memory_dict[
496
+ self.layer_idx
497
+ ]
498
+ # TODO: What if batch size changes between generation, and we reuse the same states?
499
+ if initialize_states:
500
+ conv_state.zero_()
501
+ ssm_state.zero_()
502
+ return conv_state, ssm_state
build/torch213-cxx11-cu126-x86_64-linux/modules/mamba2_simple.py ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao, Albert Gu.
2
+
3
+ import math
4
+ import torch
5
+ import torch.nn as nn
6
+ import torch.nn.functional as F
7
+
8
+ from einops import rearrange, repeat
9
+
10
+ try:
11
+ from causal_conv1d import causal_conv1d_fn
12
+ except ImportError:
13
+ causal_conv1d_fn = None
14
+
15
+ try:
16
+ from ..ops.triton.layernorm_gated import RMSNorm as RMSNormGated, LayerNorm
17
+ except ImportError:
18
+ RMSNormGated, LayerNorm = None, None
19
+
20
+ from ..ops.triton.ssd_combined import mamba_chunk_scan_combined
21
+ from ..ops.triton.ssd_combined import mamba_split_conv1d_scan_combined
22
+
23
+
24
+ class Mamba2Simple(nn.Module):
25
+ def __init__(
26
+ self,
27
+ d_model,
28
+ d_state=64,
29
+ d_conv=4,
30
+ conv_init=None,
31
+ expand=2,
32
+ headdim=128,
33
+ ngroups=1,
34
+ A_init_range=(1, 16),
35
+ dt_min=0.001,
36
+ dt_max=0.1,
37
+ dt_init_floor=1e-4,
38
+ dt_limit=(0.0, float("inf")),
39
+ learnable_init_states=False,
40
+ activation="swish",
41
+ bias=False,
42
+ conv_bias=True,
43
+ # Fused kernel and sharding options
44
+ chunk_size=256,
45
+ use_mem_eff_path=True,
46
+ layer_idx=None, # Absorb kwarg for general module
47
+ device=None,
48
+ dtype=None,
49
+ ):
50
+ factory_kwargs = {"device": device, "dtype": dtype}
51
+ super().__init__()
52
+ self.d_model = d_model
53
+ self.d_state = d_state
54
+ self.d_conv = d_conv
55
+ self.conv_init = conv_init
56
+ self.expand = expand
57
+ self.d_inner = self.expand * self.d_model
58
+ self.headdim = headdim
59
+ self.ngroups = ngroups
60
+ assert self.d_inner % self.headdim == 0
61
+ self.nheads = self.d_inner // self.headdim
62
+ self.dt_limit = dt_limit
63
+ self.learnable_init_states = learnable_init_states
64
+ self.activation = activation
65
+ self.chunk_size = chunk_size
66
+ self.use_mem_eff_path = use_mem_eff_path
67
+ self.layer_idx = layer_idx
68
+
69
+ # Order: [z, x, B, C, dt]
70
+ d_in_proj = 2 * self.d_inner + 2 * self.ngroups * self.d_state + self.nheads
71
+ self.in_proj = nn.Linear(self.d_model, d_in_proj, bias=bias, **factory_kwargs)
72
+
73
+ conv_dim = self.d_inner + 2 * self.ngroups * self.d_state
74
+ self.conv1d = nn.Conv1d(
75
+ in_channels=conv_dim,
76
+ out_channels=conv_dim,
77
+ bias=conv_bias,
78
+ kernel_size=d_conv,
79
+ groups=conv_dim,
80
+ padding=d_conv - 1,
81
+ **factory_kwargs,
82
+ )
83
+ if self.conv_init is not None:
84
+ nn.init.uniform_(self.conv1d.weight, -self.conv_init, self.conv_init)
85
+ # self.conv1d.weight._no_weight_decay = True
86
+
87
+ if self.learnable_init_states:
88
+ self.init_states = nn.Parameter(
89
+ torch.zeros(self.nheads, self.headdim, self.d_state, **factory_kwargs)
90
+ )
91
+ self.init_states._no_weight_decay = True
92
+
93
+ self.act = nn.SiLU()
94
+
95
+ # Initialize log dt bias
96
+ dt = torch.exp(
97
+ torch.rand(self.nheads, **factory_kwargs)
98
+ * (math.log(dt_max) - math.log(dt_min))
99
+ + math.log(dt_min)
100
+ )
101
+ dt = torch.clamp(dt, min=dt_init_floor)
102
+ # Inverse of softplus: https://github.com/pytorch/pytorch/issues/72759
103
+ inv_dt = dt + torch.log(-torch.expm1(-dt))
104
+ self.dt_bias = nn.Parameter(inv_dt)
105
+ # Just to be explicit. Without this we already don't put wd on dt_bias because of the check
106
+ # name.endswith("bias") in param_grouping.py
107
+ self.dt_bias._no_weight_decay = True
108
+
109
+ # A parameter
110
+ assert A_init_range[0] > 0 and A_init_range[1] >= A_init_range[0]
111
+ A = torch.empty(self.nheads, dtype=torch.float32, device=device).uniform_(
112
+ *A_init_range
113
+ )
114
+ A_log = torch.log(A).to(dtype=dtype)
115
+ self.A_log = nn.Parameter(A_log)
116
+ # self.register_buffer("A_log", torch.zeros(self.nheads, dtype=torch.float32, device=device), persistent=True)
117
+ self.A_log._no_weight_decay = True
118
+
119
+ # D "skip" parameter
120
+ self.D = nn.Parameter(torch.ones(self.nheads, device=device))
121
+ self.D._no_weight_decay = True
122
+
123
+ # Extra normalization layer right before output projection
124
+ assert RMSNormGated is not None
125
+ self.norm = RMSNormGated(
126
+ self.d_inner, eps=1e-5, norm_before_gate=False, **factory_kwargs
127
+ )
128
+
129
+ self.out_proj = nn.Linear(
130
+ self.d_inner, self.d_model, bias=bias, **factory_kwargs
131
+ )
132
+
133
+ def forward(self, u, seq_idx=None):
134
+ """
135
+ u: (B, L, D)
136
+ Returns: same shape as u
137
+ """
138
+ batch, seqlen, dim = u.shape
139
+
140
+ zxbcdt = self.in_proj(u) # (B, L, d_in_proj)
141
+ A = -torch.exp(self.A_log) # (nheads) or (d_inner, d_state)
142
+ initial_states = (
143
+ repeat(self.init_states, "... -> b ...", b=batch)
144
+ if self.learnable_init_states
145
+ else None
146
+ )
147
+ dt_limit_kwargs = (
148
+ {} if self.dt_limit == (0.0, float("inf")) else dict(dt_limit=self.dt_limit)
149
+ )
150
+
151
+ if self.use_mem_eff_path:
152
+ # Fully fused path
153
+ out = mamba_split_conv1d_scan_combined(
154
+ zxbcdt,
155
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
156
+ self.conv1d.bias,
157
+ self.dt_bias,
158
+ A,
159
+ D=self.D,
160
+ chunk_size=self.chunk_size,
161
+ seq_idx=seq_idx,
162
+ activation=self.activation,
163
+ rmsnorm_weight=self.norm.weight,
164
+ rmsnorm_eps=self.norm.eps,
165
+ outproj_weight=self.out_proj.weight,
166
+ outproj_bias=self.out_proj.bias,
167
+ headdim=self.headdim,
168
+ ngroups=self.ngroups,
169
+ norm_before_gate=False,
170
+ initial_states=initial_states,
171
+ **dt_limit_kwargs,
172
+ )
173
+ else:
174
+ z, xBC, dt = torch.split(
175
+ zxbcdt,
176
+ [
177
+ self.d_inner,
178
+ self.d_inner + 2 * self.ngroups * self.d_state,
179
+ self.nheads,
180
+ ],
181
+ dim=-1,
182
+ )
183
+ dt = F.softplus(dt + self.dt_bias) # (B, L, nheads)
184
+ assert self.activation in ["silu", "swish"]
185
+
186
+ # 1D Convolution
187
+ if causal_conv1d_fn is None or self.activation not in ["silu", "swish"]:
188
+ xBC = self.act(
189
+ self.conv1d(xBC.transpose(1, 2)).transpose(1, 2)
190
+ ) # (B, L, self.d_inner + 2 * ngroups * d_state)
191
+ xBC = xBC[:, :seqlen, :]
192
+ else:
193
+ xBC = causal_conv1d_fn(
194
+ x=xBC.transpose(1, 2),
195
+ weight=rearrange(self.conv1d.weight, "d 1 w -> d w"),
196
+ bias=self.conv1d.bias,
197
+ activation=self.activation,
198
+ ).transpose(1, 2)
199
+
200
+ # Split into 3 main branches: X, B, C
201
+ # These correspond to V, K, Q respectively in the SSM/attention duality
202
+ x, B, C = torch.split(
203
+ xBC,
204
+ [
205
+ self.d_inner,
206
+ self.ngroups * self.d_state,
207
+ self.ngroups * self.d_state,
208
+ ],
209
+ dim=-1,
210
+ )
211
+ y = mamba_chunk_scan_combined(
212
+ rearrange(x, "b l (h p) -> b l h p", p=self.headdim),
213
+ dt,
214
+ A,
215
+ rearrange(B, "b l (g n) -> b l g n", g=self.ngroups),
216
+ rearrange(C, "b l (g n) -> b l g n", g=self.ngroups),
217
+ chunk_size=self.chunk_size,
218
+ D=self.D,
219
+ z=None,
220
+ seq_idx=seq_idx,
221
+ initial_states=initial_states,
222
+ **dt_limit_kwargs,
223
+ )
224
+ y = rearrange(y, "b l h p -> b l (h p)")
225
+
226
+ # Multiply "gate" branch and apply extra normalization layer
227
+ y = self.norm(y, z)
228
+ out = self.out_proj(y)
229
+ return out
build/torch213-cxx11-cu126-x86_64-linux/modules/mamba_simple.py ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2023, Tri Dao, Albert Gu.
2
+
3
+ import math
4
+ from typing import Optional
5
+
6
+ import torch
7
+ import torch.nn as nn
8
+ import torch.nn.functional as F
9
+ from torch import Tensor
10
+
11
+ from einops import rearrange, repeat
12
+
13
+ from ..ops.selective_scan_interface import selective_scan_fn, mamba_inner_fn
14
+
15
+ try:
16
+ from causal_conv1d import causal_conv1d_fn, causal_conv1d_update
17
+ except ImportError:
18
+ causal_conv1d_fn, causal_conv1d_update = None, None
19
+
20
+ try:
21
+ from ..ops.triton.selective_state_update import selective_state_update
22
+ except ImportError:
23
+ selective_state_update = None
24
+
25
+ try:
26
+ from ..ops.triton.layer_norm import RMSNorm, layer_norm_fn, rms_norm_fn
27
+ except ImportError:
28
+ RMSNorm, layer_norm_fn, rms_norm_fn = None, None, None
29
+
30
+
31
+ class Mamba(nn.Module):
32
+ def __init__(
33
+ self,
34
+ d_model,
35
+ d_state=16,
36
+ d_conv=4,
37
+ expand=2,
38
+ dt_rank="auto",
39
+ dt_min=0.001,
40
+ dt_max=0.1,
41
+ dt_init="random",
42
+ dt_scale=1.0,
43
+ dt_init_floor=1e-4,
44
+ conv_bias=True,
45
+ bias=False,
46
+ use_fast_path=True, # Fused kernel options
47
+ layer_idx=None,
48
+ device=None,
49
+ dtype=None,
50
+ ):
51
+ factory_kwargs = {"device": device, "dtype": dtype}
52
+ super().__init__()
53
+ self.d_model = d_model
54
+ self.d_state = d_state
55
+ self.d_conv = d_conv
56
+ self.expand = expand
57
+ self.d_inner = int(self.expand * self.d_model)
58
+ self.dt_rank = math.ceil(self.d_model / 16) if dt_rank == "auto" else dt_rank
59
+ self.use_fast_path = use_fast_path
60
+ self.layer_idx = layer_idx
61
+
62
+ self.in_proj = nn.Linear(
63
+ self.d_model, self.d_inner * 2, bias=bias, **factory_kwargs
64
+ )
65
+
66
+ self.conv1d = nn.Conv1d(
67
+ in_channels=self.d_inner,
68
+ out_channels=self.d_inner,
69
+ bias=conv_bias,
70
+ kernel_size=d_conv,
71
+ groups=self.d_inner,
72
+ padding=d_conv - 1,
73
+ **factory_kwargs,
74
+ )
75
+
76
+ self.activation = "silu"
77
+ self.act = nn.SiLU()
78
+
79
+ self.x_proj = nn.Linear(
80
+ self.d_inner, self.dt_rank + self.d_state * 2, bias=False, **factory_kwargs
81
+ )
82
+ self.dt_proj = nn.Linear(
83
+ self.dt_rank, self.d_inner, bias=True, **factory_kwargs
84
+ )
85
+
86
+ # Initialize special dt projection to preserve variance at initialization
87
+ dt_init_std = self.dt_rank**-0.5 * dt_scale
88
+ if dt_init == "constant":
89
+ nn.init.constant_(self.dt_proj.weight, dt_init_std)
90
+ elif dt_init == "random":
91
+ nn.init.uniform_(self.dt_proj.weight, -dt_init_std, dt_init_std)
92
+ else:
93
+ raise NotImplementedError
94
+
95
+ # Initialize dt bias so that F.softplus(dt_bias) is between dt_min and dt_max
96
+ dt = torch.exp(
97
+ torch.rand(self.d_inner, **factory_kwargs)
98
+ * (math.log(dt_max) - math.log(dt_min))
99
+ + math.log(dt_min)
100
+ ).clamp(min=dt_init_floor)
101
+ # Inverse of softplus: https://github.com/pytorch/pytorch/issues/72759
102
+ inv_dt = dt + torch.log(-torch.expm1(-dt))
103
+ with torch.no_grad():
104
+ self.dt_proj.bias.copy_(inv_dt)
105
+ # Our initialization would set all Linear.bias to zero, need to mark this one as _no_reinit
106
+ self.dt_proj.bias._no_reinit = True
107
+
108
+ # S4D real initialization
109
+ A = repeat(
110
+ torch.arange(1, self.d_state + 1, dtype=torch.float32, device=device),
111
+ "n -> d n",
112
+ d=self.d_inner,
113
+ ).contiguous()
114
+ A_log = torch.log(A) # Keep A_log in fp32
115
+ self.A_log = nn.Parameter(A_log)
116
+ self.A_log._no_weight_decay = True
117
+
118
+ # D "skip" parameter
119
+ self.D = nn.Parameter(torch.ones(self.d_inner, device=device)) # Keep in fp32
120
+ self.D._no_weight_decay = True
121
+
122
+ self.out_proj = nn.Linear(
123
+ self.d_inner, self.d_model, bias=bias, **factory_kwargs
124
+ )
125
+
126
+ def forward(self, hidden_states, inference_params=None):
127
+ """
128
+ hidden_states: (B, L, D)
129
+ Returns: same shape as hidden_states
130
+ """
131
+ batch, seqlen, dim = hidden_states.shape
132
+
133
+ conv_state, ssm_state = None, None
134
+ if inference_params is not None:
135
+ conv_state, ssm_state = self._get_states_from_cache(inference_params, batch)
136
+ if inference_params.seqlen_offset > 0:
137
+ # The states are updated inplace
138
+ out, _, _ = self.step(hidden_states, conv_state, ssm_state)
139
+ return out
140
+
141
+ # We do matmul and transpose BLH -> HBL at the same time
142
+ xz = rearrange(
143
+ self.in_proj.weight @ rearrange(hidden_states, "b l d -> d (b l)"),
144
+ "d (b l) -> b d l",
145
+ l=seqlen,
146
+ )
147
+ if self.in_proj.bias is not None:
148
+ xz = xz + rearrange(self.in_proj.bias.to(dtype=xz.dtype), "d -> d 1")
149
+
150
+ A = -torch.exp(self.A_log.float()) # (d_inner, d_state)
151
+ # In the backward pass we write dx and dz next to each other to avoid torch.cat
152
+ if (
153
+ self.use_fast_path
154
+ and causal_conv1d_fn is not None
155
+ and inference_params is None
156
+ ): # Doesn't support outputting the states
157
+ out = mamba_inner_fn(
158
+ xz,
159
+ self.conv1d.weight,
160
+ self.conv1d.bias,
161
+ self.x_proj.weight,
162
+ self.dt_proj.weight,
163
+ self.out_proj.weight,
164
+ self.out_proj.bias,
165
+ A,
166
+ None, # input-dependent B
167
+ None, # input-dependent C
168
+ self.D.float(),
169
+ delta_bias=self.dt_proj.bias.float(),
170
+ delta_softplus=True,
171
+ )
172
+ else:
173
+ x, z = xz.chunk(2, dim=1)
174
+ # Compute short convolution
175
+ if conv_state is not None:
176
+ # If we just take x[:, :, -self.d_conv :], it will error if seqlen < self.d_conv
177
+ # Instead F.pad will pad with zeros if seqlen < self.d_conv, and truncate otherwise.
178
+ conv_state.copy_(
179
+ F.pad(x, (self.d_conv - x.shape[-1], 0))
180
+ ) # Update state (B D W)
181
+ if causal_conv1d_fn is None:
182
+ x = self.act(self.conv1d(x)[..., :seqlen])
183
+ else:
184
+ assert self.activation in ["silu", "swish"]
185
+ x = causal_conv1d_fn(
186
+ x=x,
187
+ weight=rearrange(self.conv1d.weight, "d 1 w -> d w"),
188
+ bias=self.conv1d.bias,
189
+ activation=self.activation,
190
+ )
191
+
192
+ # We're careful here about the layout, to avoid extra transposes.
193
+ # We want dt to have d as the slowest moving dimension
194
+ # and L as the fastest moving dimension, since those are what the ssm_scan kernel expects.
195
+ x_dbl = self.x_proj(rearrange(x, "b d l -> (b l) d")) # (bl d)
196
+ dt, B, C = torch.split(
197
+ x_dbl, [self.dt_rank, self.d_state, self.d_state], dim=-1
198
+ )
199
+ dt = self.dt_proj.weight @ dt.t()
200
+ dt = rearrange(dt, "d (b l) -> b d l", l=seqlen)
201
+ B = rearrange(B, "(b l) dstate -> b dstate l", l=seqlen).contiguous()
202
+ C = rearrange(C, "(b l) dstate -> b dstate l", l=seqlen).contiguous()
203
+ assert self.activation in ["silu", "swish"]
204
+ y = selective_scan_fn(
205
+ x,
206
+ dt,
207
+ A,
208
+ B,
209
+ C,
210
+ self.D.float(),
211
+ z=z,
212
+ delta_bias=self.dt_proj.bias.float(),
213
+ delta_softplus=True,
214
+ return_last_state=ssm_state is not None,
215
+ )
216
+ if ssm_state is not None:
217
+ y, last_state = y
218
+ ssm_state.copy_(last_state)
219
+ y = rearrange(y, "b d l -> b l d")
220
+ out = self.out_proj(y)
221
+ return out
222
+
223
+ def step(self, hidden_states, conv_state, ssm_state):
224
+ dtype = hidden_states.dtype
225
+ assert (
226
+ hidden_states.shape[1] == 1
227
+ ), "Only support decoding with 1 token at a time for now"
228
+ xz = self.in_proj(hidden_states.squeeze(1)) # (B 2D)
229
+ x, z = xz.chunk(2, dim=-1) # (B D)
230
+
231
+ # Conv step
232
+ if causal_conv1d_update is None:
233
+ conv_state.copy_(
234
+ torch.roll(conv_state, shifts=-1, dims=-1)
235
+ ) # Update state (B D W)
236
+ conv_state[:, :, -1] = x
237
+ x = torch.sum(
238
+ conv_state * rearrange(self.conv1d.weight, "d 1 w -> d w"), dim=-1
239
+ ) # (B D)
240
+ if self.conv1d.bias is not None:
241
+ x = x + self.conv1d.bias
242
+ x = self.act(x).to(dtype=dtype)
243
+ else:
244
+ x = causal_conv1d_update(
245
+ x,
246
+ conv_state,
247
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
248
+ self.conv1d.bias,
249
+ self.activation,
250
+ )
251
+
252
+ x_db = self.x_proj(x) # (B dt_rank+2*d_state)
253
+ dt, B, C = torch.split(x_db, [self.dt_rank, self.d_state, self.d_state], dim=-1)
254
+ # Don't add dt_bias here
255
+ dt = F.linear(dt, self.dt_proj.weight) # (B d_inner)
256
+ A = -torch.exp(self.A_log.float()) # (d_inner, d_state)
257
+
258
+ # SSM step
259
+ if selective_state_update is None:
260
+ # Discretize A and B
261
+ dt = F.softplus(dt + self.dt_proj.bias.to(dtype=dt.dtype))
262
+ dA = torch.exp(torch.einsum("bd,dn->bdn", dt, A))
263
+ dB = torch.einsum("bd,bn->bdn", dt, B)
264
+ ssm_state.copy_(ssm_state * dA + rearrange(x, "b d -> b d 1") * dB)
265
+ y = torch.einsum("bdn,bn->bd", ssm_state.to(dtype), C)
266
+ y = y + self.D.to(dtype) * x
267
+ y = y * self.act(z) # (B D)
268
+ else:
269
+ y = selective_state_update(
270
+ ssm_state,
271
+ x,
272
+ dt,
273
+ A,
274
+ B,
275
+ C,
276
+ self.D,
277
+ z=z,
278
+ dt_bias=self.dt_proj.bias,
279
+ dt_softplus=True,
280
+ )
281
+
282
+ out = self.out_proj(y)
283
+ return out.unsqueeze(1), conv_state, ssm_state
284
+
285
+ def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None, **kwargs):
286
+ device = self.out_proj.weight.device
287
+ conv_dtype = self.conv1d.weight.dtype if dtype is None else dtype
288
+ conv_state = torch.zeros(
289
+ batch_size,
290
+ self.d_model * self.expand,
291
+ self.d_conv,
292
+ device=device,
293
+ dtype=conv_dtype,
294
+ )
295
+ ssm_dtype = self.dt_proj.weight.dtype if dtype is None else dtype
296
+ # ssm_dtype = torch.float32
297
+ ssm_state = torch.zeros(
298
+ batch_size,
299
+ self.d_model * self.expand,
300
+ self.d_state,
301
+ device=device,
302
+ dtype=ssm_dtype,
303
+ )
304
+ return conv_state, ssm_state
305
+
306
+ def _get_states_from_cache(
307
+ self, inference_params, batch_size, initialize_states=False
308
+ ):
309
+ assert self.layer_idx is not None
310
+ if self.layer_idx not in inference_params.key_value_memory_dict:
311
+ batch_shape = (batch_size,)
312
+ conv_state = torch.zeros(
313
+ batch_size,
314
+ self.d_model * self.expand,
315
+ self.d_conv,
316
+ device=self.conv1d.weight.device,
317
+ dtype=self.conv1d.weight.dtype,
318
+ )
319
+ ssm_state = torch.zeros(
320
+ batch_size,
321
+ self.d_model * self.expand,
322
+ self.d_state,
323
+ device=self.dt_proj.weight.device,
324
+ dtype=self.dt_proj.weight.dtype,
325
+ # dtype=torch.float32,
326
+ )
327
+ inference_params.key_value_memory_dict[self.layer_idx] = (
328
+ conv_state,
329
+ ssm_state,
330
+ )
331
+ else:
332
+ conv_state, ssm_state = inference_params.key_value_memory_dict[
333
+ self.layer_idx
334
+ ]
335
+ # TODO: What if batch size changes between generation, and we reuse the same states?
336
+ if initialize_states:
337
+ conv_state.zero_()
338
+ ssm_state.zero_()
339
+ return conv_state, ssm_state
build/torch213-cxx11-cu126-x86_64-linux/modules/mha.py ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao, Albert Gu.
2
+
3
+ import math
4
+
5
+ import torch
6
+ import torch.nn as nn
7
+ import torch.nn.functional as F
8
+ from einops import rearrange
9
+
10
+ try:
11
+ from flash_attn import flash_attn_with_kvcache
12
+ except ImportError:
13
+ flash_attn_with_kvcache = None
14
+
15
+ try:
16
+ from flash_attn.layers.rotary import RotaryEmbedding
17
+ except ImportError:
18
+ RotaryEmbedding = None
19
+
20
+ try:
21
+ from causal_conv1d import causal_conv1d_fn, causal_conv1d_update
22
+ except ImportError:
23
+ causal_conv1d_fn, causal_conv1d_update = None, None
24
+
25
+
26
+ def _update_kv_cache(kv, inference_params, layer_idx):
27
+ """kv: (batch_size, seqlen, 2, nheads, head_dim) or (batch_size, 1, 2, nheads, head_dim)"""
28
+ # Pre-allocate memory for key-values for inference.
29
+ num_heads, head_dim = kv.shape[-2:]
30
+ assert layer_idx in inference_params.key_value_memory_dict
31
+ kv_cache, _ = inference_params.key_value_memory_dict[layer_idx]
32
+ # Adjust key and value for inference
33
+ batch_start = inference_params.batch_size_offset
34
+ batch_end = batch_start + kv.shape[0]
35
+ sequence_start = inference_params.seqlen_offset
36
+ sequence_end = sequence_start + kv.shape[1]
37
+ assert batch_end <= kv_cache.shape[0]
38
+ assert sequence_end <= kv_cache.shape[1]
39
+ assert kv_cache is not None
40
+ kv_cache[batch_start:batch_end, sequence_start:sequence_end, ...] = kv
41
+ return kv_cache[batch_start:batch_end, :sequence_end, ...]
42
+
43
+
44
+ class MHA(nn.Module):
45
+ """Multi-head self-attention and cross-attention"""
46
+
47
+ def __init__(
48
+ self,
49
+ embed_dim,
50
+ num_heads,
51
+ num_heads_kv=None,
52
+ head_dim=None, # If None, use embed_dim // num_heads
53
+ mlp_dim=0,
54
+ qkv_proj_bias=True,
55
+ out_proj_bias=True,
56
+ softmax_scale=None,
57
+ causal=False,
58
+ layer_idx=None,
59
+ d_conv=0,
60
+ rotary_emb_dim=0,
61
+ rotary_emb_base=10000.0,
62
+ rotary_emb_interleaved=False,
63
+ device=None,
64
+ dtype=None,
65
+ ) -> None:
66
+ """
67
+ num_heads_kv: can be used to toggle MQA / GQA. If None, use num_heads.
68
+ return_residual: whether to return the input x along with the output. This is for
69
+ performance reason: for post-norm architecture, returning the input allows us
70
+ to fuse the backward of nn.Linear with the residual connection.
71
+ """
72
+ factory_kwargs = {"device": device, "dtype": dtype}
73
+ super().__init__()
74
+ self.embed_dim = embed_dim
75
+ self.layer_idx = layer_idx
76
+ self.d_conv = d_conv
77
+ self.rotary_emb_dim = rotary_emb_dim
78
+ self.softmax_scale = softmax_scale
79
+ self.causal = causal
80
+
81
+ self.num_heads = num_heads
82
+ self.num_heads_kv = num_heads_kv if num_heads_kv is not None else num_heads
83
+ assert (
84
+ self.num_heads % self.num_heads_kv == 0
85
+ ), "num_heads must be divisible by num_heads_kv"
86
+ if head_dim is None:
87
+ assert self.embed_dim % num_heads == 0, "embed_dim must be divisible by num_heads"
88
+ self.head_dim = head_dim if head_dim is not None else self.embed_dim // num_heads
89
+ self.mlp_dim = math.ceil(mlp_dim / 256) * 256
90
+ qkv_dim = self.head_dim * (self.num_heads + 2 * self.num_heads_kv)
91
+ out_dim = self.head_dim * self.num_heads
92
+
93
+ if self.rotary_emb_dim > 0:
94
+ assert RotaryEmbedding is not None, "rotary requires flash_attn to be installed"
95
+ self.rotary_emb = RotaryEmbedding(
96
+ self.rotary_emb_dim,
97
+ base=rotary_emb_base,
98
+ interleaved=rotary_emb_interleaved,
99
+ device=device,
100
+ )
101
+
102
+ self.in_proj = nn.Linear(embed_dim, qkv_dim + self.mlp_dim, bias=qkv_proj_bias, **factory_kwargs)
103
+ if self.d_conv > 0:
104
+ self.conv1d = nn.Conv1d(
105
+ qkv_dim, qkv_dim, kernel_size=self.d_conv, padding=self.d_conv - 1, groups=qkv_dim,
106
+ **factory_kwargs
107
+ )
108
+ self.out_proj = nn.Linear(out_dim + self.mlp_dim // 2, embed_dim, bias=out_proj_bias, **factory_kwargs)
109
+
110
+ def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None):
111
+ dtype = self.out_proj.weight.dtype if dtype is None else dtype
112
+ device = self.out_proj.weight.device
113
+ if self.d_conv > 0:
114
+ conv_state = torch.zeros(
115
+ batch_size, self.conv1d.weight.shape[0], self.d_conv, device=device, dtype=dtype
116
+ )
117
+ else:
118
+ conv_state = None
119
+ kv_cache = torch.empty(
120
+ batch_size, max_seqlen, 2, self.num_heads_kv, self.head_dim, dtype=dtype, device=device,
121
+ )
122
+ return kv_cache, conv_state
123
+
124
+ def _update_kv_cache(self, kv, inference_params):
125
+ """kv: (batch_size, seqlen, 2, nheads, head_dim) or (batch_size, 1, 2, nheads, head_dim)"""
126
+ assert self.layer_idx is not None, "Generation requires layer_idx in the constructor"
127
+ return _update_kv_cache(kv, inference_params, self.layer_idx)
128
+
129
+ def _apply_rotary_update_kvcache_attention(self, q, kv, inference_params):
130
+ """
131
+ Fast path that combine 3 steps: apply rotary to Q and K, update kv cache, and apply attention.
132
+ q: (batch_size, seqlen_q, nheads, head_dim)
133
+ kv: (batch_size, seqlen_k, 2, nheads_kv, head_dim)
134
+ """
135
+ assert inference_params is not None and inference_params.seqlen_offset > 0
136
+ if self.rotary_emb_dim > 0:
137
+ self.rotary_emb._update_cos_sin_cache(
138
+ inference_params.max_seqlen, device=q.device, dtype=q.dtype
139
+ )
140
+ rotary_cos, rotary_sin = self.rotary_emb._cos_cached, self.rotary_emb._sin_cached
141
+ else:
142
+ rotary_cos, rotary_sin = None, None
143
+ batch = q.shape[0]
144
+ kv_cache, _ = inference_params.key_value_memory_dict[self.layer_idx]
145
+ kv_cache = kv_cache[:batch]
146
+ cache_seqlens = (
147
+ inference_params.lengths_per_sample[:batch]
148
+ if inference_params.lengths_per_sample is not None
149
+ else inference_params.seqlen_offset
150
+ )
151
+ assert flash_attn_with_kvcache is not None, "flash_attn must be installed"
152
+ context = flash_attn_with_kvcache(
153
+ q,
154
+ kv_cache[:, :, 0],
155
+ kv_cache[:, :, 1],
156
+ kv[:, :, 0],
157
+ kv[:, :, 1],
158
+ rotary_cos=rotary_cos,
159
+ rotary_sin=rotary_sin,
160
+ cache_seqlens=cache_seqlens,
161
+ softmax_scale=self.softmax_scale,
162
+ causal=self.causal,
163
+ rotary_interleaved=self.rotary_emb.interleaved if self.rotary_emb_dim > 0 else False,
164
+ )
165
+ return context
166
+
167
+ def _update_kvcache_attention(self, q, kv, inference_params):
168
+ """Write kv to inference_params, then do attention"""
169
+ if (
170
+ inference_params.seqlen_offset == 0
171
+ or flash_attn_with_kvcache is None
172
+ ):
173
+ # TODO: this only uses seqlen_offset and not lengths_per_sample.
174
+ kv = self._update_kv_cache(kv, inference_params)
175
+ k, v = kv.unbind(dim=-3)
176
+ k = torch.repeat_interleave(k, dim=2, repeats=self.num_heads // self.num_heads_kv)
177
+ v = torch.repeat_interleave(v, dim=2, repeats=self.num_heads // self.num_heads_kv)
178
+ return F.scaled_dot_product_attention(
179
+ q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2), is_causal=self.causal, scale=self.softmax_scale
180
+ ).transpose(1, 2)
181
+ else:
182
+ batch = q.shape[0]
183
+ kv_cache, _ = inference_params.key_value_memory_dict[self.layer_idx]
184
+ kv_cache = kv_cache[:batch]
185
+ cache_seqlens = (
186
+ inference_params.lengths_per_sample[:batch]
187
+ if inference_params.lengths_per_sample is not None
188
+ else inference_params.seqlen_offset
189
+ )
190
+ return flash_attn_with_kvcache(
191
+ q,
192
+ kv_cache[:, :, 0],
193
+ kv_cache[:, :, 1],
194
+ kv[:, :, 0],
195
+ kv[:, :, 1],
196
+ cache_seqlens=cache_seqlens,
197
+ softmax_scale=self.softmax_scale,
198
+ causal=self.causal,
199
+ )
200
+
201
+ def forward(self, x, inference_params=None):
202
+ """
203
+ Arguments:
204
+ x: (batch, seqlen, hidden_dim) (where hidden_dim = num heads * head dim) if
205
+ cu_seqlens is None and max_seqlen is None, else (total, hidden_dim) where total
206
+ is the is the sum of the sequence lengths in the batch.
207
+ inference_params: for generation. Adapted from Megatron-LM (and Apex)
208
+ https://github.com/NVIDIA/apex/blob/3ff1a10f72ec07067c4e44759442329804ac5162/apex/transformer/testing/standalone_transformer_lm.py#L470
209
+ """
210
+ if inference_params is not None and self.layer_idx not in inference_params.key_value_memory_dict:
211
+ inference_params.key_value_memory_dict[self.layer_idx] = self.allocate_inference_cache(
212
+ x.shape[0], inference_params.max_seqlen, dtype=x.dtype
213
+ )
214
+ seqlen_offset = (
215
+ 0
216
+ if inference_params is None
217
+ else (
218
+ inference_params.lengths_per_sample
219
+ if inference_params.lengths_per_sample is not None
220
+ else inference_params.seqlen_offset
221
+ )
222
+ )
223
+ rotary_max_seqlen = inference_params.max_seqlen if inference_params is not None else None
224
+ qkv = self.in_proj(x)
225
+ if self.mlp_dim > 0:
226
+ qkv, x_mlp = qkv.split([qkv.shape[-1] - self.mlp_dim, self.mlp_dim], dim=-1)
227
+ x_mlp_up, x_mlp_gate = x_mlp.chunk(2, dim=-1)
228
+ x_mlp = x_mlp_up * F.silu(x_mlp_gate)
229
+ if self.d_conv > 0:
230
+ # The inference code for conv1d is pretty messy, should clean it up
231
+ if (inference_params is None or inference_params.seqlen_offset == 0):
232
+ if causal_conv1d_fn is None:
233
+ qkv = rearrange(
234
+ self.conv1d(rearrange(qkv, "b s d -> b d s"))[..., :-(self.d_conv - 1)], "b d s -> b s d"
235
+ ).contiguous()
236
+ else:
237
+ qkv = causal_conv1d_fn(
238
+ qkv.transpose(1, 2),
239
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
240
+ self.conv1d.bias
241
+ ).transpose(1, 2)
242
+ if inference_params is not None:
243
+ _, conv_state = inference_params.key_value_memory_dict[self.layer_idx]
244
+ # If we just take qkv[:, :, -self.d_conv :], it will error if seqlen < self.d_conv
245
+ # Instead F.pad will pad with zeros if seqlen < self.d_conv, and truncate otherwise.
246
+ qkv_t = rearrange(qkv, "b l d -> b d l")
247
+ conv_state.copy_(F.pad(qkv_t, (self.d_conv - qkv_t.shape[-1], 0))) # Update state (B D W)
248
+ else:
249
+ _, conv_state = inference_params.key_value_memory_dict[self.layer_idx]
250
+ assert qkv.shape[1] == 1, "Only support decoding with 1 token at a time for now"
251
+ qkv = qkv.squeeze(1)
252
+ # Conv step
253
+ if causal_conv1d_update is None:
254
+ conv_state.copy_(torch.roll(conv_state, shifts=-1, dims=-1)) # Update state (B D W)
255
+ conv_state[:, :, -1] = qkv
256
+ qkv = torch.sum(conv_state * rearrange(self.conv1d.weight, "d 1 w -> d w"), dim=-1) # (B D)
257
+ if self.conv1d.bias is not None:
258
+ qkv = qkv + self.conv1d.bias
259
+ else:
260
+ qkv = causal_conv1d_update(
261
+ qkv,
262
+ conv_state,
263
+ rearrange(self.conv1d.weight, "d 1 w -> d w"),
264
+ self.conv1d.bias
265
+ )
266
+ qkv = qkv.unsqueeze(1)
267
+ q, kv = qkv.split([self.num_heads * self.head_dim, self.num_heads_kv * 2 * self.head_dim], dim=-1)
268
+ q = rearrange(q, "... (h d) -> ... h d", d=self.head_dim)
269
+ kv = rearrange(kv, "... (two hkv d) -> ... two hkv d", two=2, d=self.head_dim)
270
+ if (
271
+ inference_params is None
272
+ or inference_params.seqlen_offset == 0
273
+ or (self.rotary_emb_dim == 0 or self.rotary_emb_dim % 16 != 0)
274
+ ):
275
+ if self.rotary_emb_dim > 0:
276
+ q, kv = self.rotary_emb(
277
+ q, kv, seqlen_offset=seqlen_offset, max_seqlen=rotary_max_seqlen
278
+ )
279
+ if inference_params is None:
280
+ k, v = kv.unbind(dim=-3)
281
+ k = torch.repeat_interleave(k, dim=2, repeats=self.num_heads // self.num_heads_kv)
282
+ v = torch.repeat_interleave(v, dim=2, repeats=self.num_heads // self.num_heads_kv)
283
+ context = F.scaled_dot_product_attention(
284
+ q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2), is_causal=self.causal, scale=self.softmax_scale
285
+ ).transpose(1, 2)
286
+ else:
287
+ context = self._update_kvcache_attention(q, kv, inference_params)
288
+ else:
289
+ context = self._apply_rotary_update_kvcache_attention(q, kv, inference_params)
290
+ context = rearrange(context, "... h d -> ... (h d)")
291
+ if self.mlp_dim > 0:
292
+ context = torch.cat([context, x_mlp], dim=-1)
293
+ out = self.out_proj(context)
294
+ return out
build/torch213-cxx11-cu126-x86_64-linux/modules/mlp.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao, Albert Gu.
2
+ from torch import nn
3
+ from torch.nn import functional as F
4
+
5
+
6
+ class GatedMLP(nn.Module):
7
+ def __init__(
8
+ self,
9
+ in_features,
10
+ hidden_features=None,
11
+ out_features=None,
12
+ activation=F.silu,
13
+ bias=False,
14
+ multiple_of=128,
15
+ device=None,
16
+ dtype=None,
17
+ ):
18
+ factory_kwargs = {"device": device, "dtype": dtype}
19
+ super().__init__()
20
+ out_features = out_features if out_features is not None else in_features
21
+ hidden_features = (
22
+ hidden_features if hidden_features is not None else int(8 * in_features / 3)
23
+ )
24
+ hidden_features = (hidden_features + multiple_of - 1) // multiple_of * multiple_of
25
+ self.fc1 = nn.Linear(in_features, 2 * hidden_features, bias=bias, **factory_kwargs)
26
+ self.activation = activation
27
+ self.fc2 = nn.Linear(hidden_features, out_features, bias=bias, **factory_kwargs)
28
+
29
+ def forward(self, x):
30
+ y = self.fc1(x)
31
+ y, gate = y.chunk(2, dim=-1)
32
+ y = y * self.activation(gate)
33
+ y = self.fc2(y)
34
+ return y
build/torch213-cxx11-cu126-x86_64-linux/modules/ssd_minimal.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Albert Gu and Tri Dao.
2
+ """Minimal implementation of SSD.
3
+
4
+ This is the same as Listing 1 from the paper.
5
+ """
6
+
7
+ import torch
8
+ import torch.nn.functional as F
9
+ from einops import rearrange, repeat
10
+
11
+ from ..ops.triton.ssd_combined import mamba_chunk_scan_combined
12
+
13
+
14
+ def segsum_unstable(x):
15
+ """Naive segment sum calculation."""
16
+ T = x.size(-1)
17
+ x_cumsum = torch.cumsum(x, dim=-1)
18
+ x_segsum = x_cumsum[..., :, None] - x_cumsum[..., None, :]
19
+ mask = torch.tril(torch.ones(T, T, device=x.device, dtype=bool), diagonal=0)
20
+ x_segsum = x_segsum.masked_fill(~mask, -torch.inf)
21
+ return x_segsum
22
+
23
+
24
+ def segsum(x):
25
+ """More stable segment sum calculation."""
26
+ T = x.size(-1)
27
+ x = repeat(x, "... d -> ... d e", e=T)
28
+ mask = torch.tril(torch.ones(T, T, device=x.device, dtype=bool), diagonal=-1)
29
+ x = x.masked_fill(~mask, 0)
30
+ x_segsum = torch.cumsum(x, dim=-2)
31
+ mask = torch.tril(torch.ones(T, T, device=x.device, dtype=bool), diagonal=0)
32
+ x_segsum = x_segsum.masked_fill(~mask, -torch.inf)
33
+ return x_segsum
34
+
35
+
36
+ def ssd_minimal_discrete(X, A, B, C, block_len, initial_states=None):
37
+ """
38
+ Arguments:
39
+ X: (batch, length, n_heads, d_head)
40
+ A: (batch, length, n_heads)
41
+ B: (batch, length, n_heads, d_state)
42
+ C: (batch, length, n_heads, d_state)
43
+ Return:
44
+ Y: (batch, length, n_heads, d_head)
45
+ """
46
+ assert X.dtype == A.dtype == B.dtype == C.dtype
47
+ assert X.shape[1] % block_len == 0
48
+
49
+ # Rearrange into blocks/chunks
50
+ X, A, B, C = [
51
+ rearrange(x, "b (c l) ... -> b c l ...", l=block_len) for x in (X, A, B, C)
52
+ ]
53
+
54
+ A = rearrange(A, "b c l h -> b h c l")
55
+ A_cumsum = torch.cumsum(A, dim=-1)
56
+
57
+ # 1. Compute the output for each intra-chunk (diagonal blocks)
58
+ L = torch.exp(segsum(A))
59
+ Y_diag = torch.einsum("bclhn,bcshn,bhcls,bcshp->bclhp", C, B, L, X)
60
+
61
+ # 2. Compute the state for each intra-chunk
62
+ # (right term of low-rank factorization of off-diagonal blocks; B terms)
63
+ decay_states = torch.exp((A_cumsum[:, :, :, -1:] - A_cumsum))
64
+ states = torch.einsum("bclhn,bhcl,bclhp->bchpn", B, decay_states, X)
65
+
66
+ # 3. Compute the inter-chunk SSM recurrence; produces correct SSM states at chunk boundaries
67
+ # (middle term of factorization of off-diag blocks; A terms)
68
+ if initial_states is None:
69
+ initial_states = torch.zeros_like(states[:, :1])
70
+ states = torch.cat([initial_states, states], dim=1)
71
+ decay_chunk = torch.exp(segsum(F.pad(A_cumsum[:, :, :, -1], (1, 0))))
72
+ new_states = torch.einsum("bhzc,bchpn->bzhpn", decay_chunk, states)
73
+ states, final_state = new_states[:, :-1], new_states[:, -1]
74
+
75
+ # 4. Compute state -> output conversion per chunk
76
+ # (left term of low-rank factorization of off-diagonal blocks; C terms)
77
+ state_decay_out = torch.exp(A_cumsum)
78
+ Y_off = torch.einsum("bclhn,bchpn,bhcl->bclhp", C, states, state_decay_out)
79
+
80
+ # Add output of intra-chunk and inter-chunk terms (diagonal and off-diagonal blocks)
81
+ Y = rearrange(Y_diag + Y_off, "b c l h p -> b (c l) h p")
82
+ return Y, final_state
83
+
84
+
85
+ # Simple test
86
+ def test_correctness():
87
+ torch.manual_seed(42)
88
+
89
+ ## Dimensions
90
+ # Denoted (B, T, Q, D, P) in the paper
91
+ batch, seqlen, chunk_size, dim, headdim = 1, 2048, 64, 2048, 64
92
+ nheads = dim // headdim # (H) in the paper
93
+ ngroups = 1 # (G) in the paper
94
+ dstate = 64 # (N) in the paper
95
+ dtype = torch.float32
96
+ device = "cuda"
97
+
98
+ x = torch.randn(batch, seqlen, nheads, headdim, dtype=dtype, device=device)
99
+ dt = F.softplus(
100
+ torch.randn(batch, seqlen, nheads, dtype=torch.float32, device=device) - 4
101
+ ).requires_grad_()
102
+ A = (
103
+ -torch.exp(torch.rand(nheads, dtype=torch.float32, device=device))
104
+ ).requires_grad_()
105
+ B = torch.randn(batch, seqlen, ngroups, dstate, dtype=dtype, device=device)
106
+ C = torch.randn(batch, seqlen, ngroups, dstate, dtype=dtype, device=device)
107
+ D = torch.randn(nheads, dtype=dtype, device=device)
108
+
109
+ # Comparing fused version and minimal version
110
+ y = mamba_chunk_scan_combined(x, dt, A, B, C, chunk_size, D=None)
111
+ y_min, _ = ssd_minimal_discrete(x * dt.unsqueeze(-1), A * dt, B, C, chunk_size)
build/torch213-cxx11-cu126-x86_64-linux/ops/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from .triton import selective_state_update, mamba_chunk_scan_combined, mamba_split_conv1d_scan_combined
build/torch213-cxx11-cu126-x86_64-linux/ops/selective_scan_interface.py ADDED
@@ -0,0 +1,446 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2023, Tri Dao, Albert Gu.
2
+
3
+ import torch
4
+ import torch.nn.functional as F
5
+ from ..utils.torch import custom_fwd, custom_bwd
6
+
7
+ from einops import rearrange, repeat
8
+
9
+ try:
10
+ from causal_conv1d import causal_conv1d_fn
11
+ from causal_conv1d.causal_conv1d_interface import causal_conv1d_cuda
12
+ except ImportError:
13
+ causal_conv1d_fn = None
14
+ causal_conv1d_cuda = None
15
+
16
+ from .triton.layer_norm import _layer_norm_fwd
17
+
18
+ from .._ops import ops
19
+
20
+
21
+ class SelectiveScanFn(torch.autograd.Function):
22
+
23
+ @staticmethod
24
+ def forward(ctx, u, delta, A, B, C, D=None, z=None, delta_bias=None, delta_softplus=False,
25
+ return_last_state=False):
26
+ if u.stride(-1) != 1:
27
+ u = u.contiguous()
28
+ if delta.stride(-1) != 1:
29
+ delta = delta.contiguous()
30
+ if D is not None:
31
+ D = D.contiguous()
32
+ if B.stride(-1) != 1:
33
+ B = B.contiguous()
34
+ if C.stride(-1) != 1:
35
+ C = C.contiguous()
36
+ if z is not None and z.stride(-1) != 1:
37
+ z = z.contiguous()
38
+ if B.dim() == 3:
39
+ B = rearrange(B, "b dstate l -> b 1 dstate l")
40
+ ctx.squeeze_B = True
41
+ if C.dim() == 3:
42
+ C = rearrange(C, "b dstate l -> b 1 dstate l")
43
+ ctx.squeeze_C = True
44
+ out, x, *rest = ops.selective_scan_fwd(
45
+ u, delta, A, B, C, D, z, delta_bias, delta_softplus
46
+ )
47
+ ctx.delta_softplus = delta_softplus
48
+ ctx.has_z = z is not None
49
+ last_state = x[:, :, -1, 1::2] # (batch, dim, dstate)
50
+ if not ctx.has_z:
51
+ ctx.save_for_backward(u, delta, A, B, C, D, delta_bias, x)
52
+ return out if not return_last_state else (out, last_state)
53
+ else:
54
+ ctx.save_for_backward(u, delta, A, B, C, D, z, delta_bias, x, out)
55
+ out_z = rest[0]
56
+ return out_z if not return_last_state else (out_z, last_state)
57
+
58
+ @staticmethod
59
+ def backward(ctx, dout, *args):
60
+ if not ctx.has_z:
61
+ u, delta, A, B, C, D, delta_bias, x = ctx.saved_tensors
62
+ z = None
63
+ out = None
64
+ else:
65
+ u, delta, A, B, C, D, z, delta_bias, x, out = ctx.saved_tensors
66
+ if dout.stride(-1) != 1:
67
+ dout = dout.contiguous()
68
+ # The kernel supports passing in a pre-allocated dz (e.g., in case we want to fuse the
69
+ # backward of selective_scan_cuda with the backward of chunk).
70
+ # Here we just pass in None and dz will be allocated in the C++ code.
71
+ du, ddelta, dA, dB, dC, dD, ddelta_bias, *rest = ops.selective_scan_bwd(
72
+ u,
73
+ delta,
74
+ A,
75
+ B,
76
+ C,
77
+ D,
78
+ z,
79
+ delta_bias,
80
+ dout,
81
+ x,
82
+ out,
83
+ None,
84
+ ctx.delta_softplus,
85
+ False, # option to recompute out_z, not used here
86
+ )
87
+ dz = rest[0] if ctx.has_z else None
88
+ dB = dB.squeeze(1) if getattr(ctx, "squeeze_B", False) else dB
89
+ dC = dC.squeeze(1) if getattr(ctx, "squeeze_C", False) else dC
90
+ return (du, ddelta, dA, dB, dC,
91
+ dD if D is not None else None,
92
+ dz,
93
+ ddelta_bias if delta_bias is not None else None,
94
+ None,
95
+ None)
96
+
97
+
98
+ def rms_norm_forward(
99
+ x,
100
+ weight,
101
+ bias,
102
+ eps=1e-6,
103
+ is_rms_norm=True,
104
+ ):
105
+ # x (b l) d
106
+ if x.stride(-1) != 1:
107
+ x = x.contiguous()
108
+ weight = weight.contiguous()
109
+ if bias is not None:
110
+ bias = bias.contiguous()
111
+ y = _layer_norm_fwd(
112
+ x, weight, bias, eps, None, residual_dtype=None, is_rms_norm=is_rms_norm
113
+ )[0]
114
+ # y (b l) d
115
+ return y
116
+
117
+
118
+ def selective_scan_fn(u, delta, A, B, C, D=None, z=None, delta_bias=None, delta_softplus=False,
119
+ return_last_state=False):
120
+ """if return_last_state is True, returns (out, last_state)
121
+ last_state has shape (batch, dim, dstate). Note that the gradient of the last state is
122
+ not considered in the backward pass.
123
+ """
124
+ return SelectiveScanFn.apply(u, delta, A, B, C, D, z, delta_bias, delta_softplus, return_last_state)
125
+
126
+
127
+ def selective_scan_ref(u, delta, A, B, C, D=None, z=None, delta_bias=None, delta_softplus=False,
128
+ return_last_state=False):
129
+ """
130
+ u: r(B D L)
131
+ delta: r(B D L)
132
+ A: c(D N) or r(D N)
133
+ B: c(D N) or r(B N L) or r(B N 2L) or r(B G N L) or (B G N L)
134
+ C: c(D N) or r(B N L) or r(B N 2L) or r(B G N L) or (B G N L)
135
+ D: r(D)
136
+ z: r(B D L)
137
+ delta_bias: r(D), fp32
138
+
139
+ out: r(B D L)
140
+ last_state (optional): r(B D dstate) or c(B D dstate)
141
+ """
142
+ dtype_in = u.dtype
143
+ u = u.float()
144
+ delta = delta.float()
145
+ if delta_bias is not None:
146
+ delta = delta + delta_bias[..., None].float()
147
+ if delta_softplus:
148
+ delta = F.softplus(delta)
149
+ batch, dim, dstate = u.shape[0], A.shape[0], A.shape[1]
150
+ is_variable_B = B.dim() >= 3
151
+ is_variable_C = C.dim() >= 3
152
+ if A.is_complex():
153
+ if is_variable_B:
154
+ B = torch.view_as_complex(rearrange(B.float(), "... (L two) -> ... L two", two=2))
155
+ if is_variable_C:
156
+ C = torch.view_as_complex(rearrange(C.float(), "... (L two) -> ... L two", two=2))
157
+ else:
158
+ B = B.float()
159
+ C = C.float()
160
+ x = A.new_zeros((batch, dim, dstate))
161
+ ys = []
162
+ deltaA = torch.exp(torch.einsum('bdl,dn->bdln', delta, A))
163
+ if not is_variable_B:
164
+ deltaB_u = torch.einsum('bdl,dn,bdl->bdln', delta, B, u)
165
+ else:
166
+ if B.dim() == 3:
167
+ deltaB_u = torch.einsum('bdl,bnl,bdl->bdln', delta, B, u)
168
+ else:
169
+ B = repeat(B, "B G N L -> B (G H) N L", H=dim // B.shape[1])
170
+ deltaB_u = torch.einsum('bdl,bdnl,bdl->bdln', delta, B, u)
171
+ if is_variable_C and C.dim() == 4:
172
+ C = repeat(C, "B G N L -> B (G H) N L", H=dim // C.shape[1])
173
+ last_state = None
174
+ for i in range(u.shape[2]):
175
+ x = deltaA[:, :, i] * x + deltaB_u[:, :, i]
176
+ if not is_variable_C:
177
+ y = torch.einsum('bdn,dn->bd', x, C)
178
+ else:
179
+ if C.dim() == 3:
180
+ y = torch.einsum('bdn,bn->bd', x, C[:, :, i])
181
+ else:
182
+ y = torch.einsum('bdn,bdn->bd', x, C[:, :, :, i])
183
+ if i == u.shape[2] - 1:
184
+ last_state = x
185
+ if y.is_complex():
186
+ y = y.real * 2
187
+ ys.append(y)
188
+ y = torch.stack(ys, dim=2) # (batch dim L)
189
+ out = y if D is None else y + u * rearrange(D, "d -> d 1")
190
+ if z is not None:
191
+ out = out * F.silu(z)
192
+ out = out.to(dtype=dtype_in)
193
+ return out if not return_last_state else (out, last_state)
194
+
195
+
196
+ class MambaInnerFn(torch.autograd.Function):
197
+
198
+ @staticmethod
199
+ @custom_fwd
200
+ def forward(ctx, xz, conv1d_weight, conv1d_bias, x_proj_weight, delta_proj_weight,
201
+ out_proj_weight, out_proj_bias,
202
+ A, B=None, C=None, D=None, delta_bias=None, B_proj_bias=None,
203
+ C_proj_bias=None, delta_softplus=True, checkpoint_lvl=1, b_rms_weight=None, c_rms_weight= None, dt_rms_weight= None, b_c_dt_rms_eps=1e-6):
204
+ """
205
+ xz: (batch, dim, seqlen)
206
+ """
207
+ assert causal_conv1d_cuda is not None, "causal_conv1d_cuda is not available. Please install causal-conv1d."
208
+ assert checkpoint_lvl in [0, 1]
209
+ L = xz.shape[-1]
210
+ delta_rank = delta_proj_weight.shape[1]
211
+ d_state = A.shape[-1] * (1 if not A.is_complex() else 2)
212
+ if torch.is_autocast_enabled():
213
+ x_proj_weight = x_proj_weight.to(dtype=torch.get_autocast_gpu_dtype())
214
+ delta_proj_weight = delta_proj_weight.to(dtype=torch.get_autocast_gpu_dtype())
215
+ out_proj_weight = out_proj_weight.to(dtype=torch.get_autocast_gpu_dtype())
216
+ out_proj_bias = (out_proj_bias.to(dtype=torch.get_autocast_gpu_dtype())
217
+ if out_proj_bias is not None else None)
218
+ if xz.stride(-1) != 1:
219
+ xz = xz.contiguous()
220
+ conv1d_weight = rearrange(conv1d_weight, "d 1 w -> d w")
221
+ x, z = xz.chunk(2, dim=1)
222
+ conv1d_bias = conv1d_bias.contiguous() if conv1d_bias is not None else None
223
+ conv1d_out = causal_conv1d_cuda.causal_conv1d_fwd(
224
+ x, conv1d_weight, conv1d_bias, None, None, None, True
225
+ )
226
+ # We're being very careful here about the layout, to avoid extra transposes.
227
+ # We want delta to have d as the slowest moving dimension
228
+ # and L as the fastest moving dimension, since those are what the ssm_scan kernel expects.
229
+ x_dbl = F.linear(rearrange(conv1d_out, 'b d l -> (b l) d'), x_proj_weight) # (bl d)
230
+ delta = rearrange(delta_proj_weight @ x_dbl[:, :delta_rank].t(), "d (b l) -> b d l", l = L)
231
+ ctx.is_variable_B = B is None
232
+ ctx.is_variable_C = C is None
233
+ ctx.B_proj_bias_is_None = B_proj_bias is None
234
+ ctx.C_proj_bias_is_None = C_proj_bias is None
235
+ if B is None: # variable B
236
+ B = x_dbl[:, delta_rank:delta_rank + d_state] # (bl dstate)
237
+ if B_proj_bias is not None:
238
+ B = B + B_proj_bias.to(dtype=B.dtype)
239
+ if not A.is_complex():
240
+ # B = rearrange(B, "(b l) dstate -> b dstate l", l=L).contiguous()
241
+ B = rearrange(B, "(b l) dstate -> b 1 dstate l", l=L).contiguous()
242
+ else:
243
+ B = rearrange(B, "(b l) (dstate two) -> b 1 dstate (l two)", l=L, two=2).contiguous()
244
+ else:
245
+ if B.stride(-1) != 1:
246
+ B = B.contiguous()
247
+ if C is None: # variable C
248
+ C = x_dbl[:, -d_state:] # (bl dstate)
249
+ if C_proj_bias is not None:
250
+ C = C + C_proj_bias.to(dtype=C.dtype)
251
+ if not A.is_complex():
252
+ # C = rearrange(C, "(b l) dstate -> b dstate l", l=L).contiguous()
253
+ C = rearrange(C, "(b l) dstate -> b 1 dstate l", l=L).contiguous()
254
+ else:
255
+ C = rearrange(C, "(b l) (dstate two) -> b 1 dstate (l two)", l=L, two=2).contiguous()
256
+ else:
257
+ if C.stride(-1) != 1:
258
+ C = C.contiguous()
259
+ if D is not None:
260
+ D = D.contiguous()
261
+
262
+ if b_rms_weight is not None:
263
+ B = rearrange(B, "b 1 dstate l -> (b l) dstate", l=L).contiguous()
264
+ B = rms_norm_forward(B, b_rms_weight, bias=None, eps=b_c_dt_rms_eps)
265
+ B = rearrange(B, "(b l) dstate -> b 1 dstate l", l=L).contiguous()
266
+ if c_rms_weight is not None:
267
+ C = rearrange(C, "b 1 dstate l -> (b l) dstate", l=L).contiguous()
268
+ C = rms_norm_forward(C, c_rms_weight, bias=None, eps=b_c_dt_rms_eps)
269
+ C = rearrange(C, "(b l) dstate -> b 1 dstate l", l=L).contiguous()
270
+ if dt_rms_weight is not None:
271
+ delta = rearrange(delta, "b d l -> (b l) d", l=L).contiguous()
272
+ delta = rms_norm_forward(delta, dt_rms_weight, bias=None, eps=b_c_dt_rms_eps)
273
+ delta = rearrange(delta, "(b l) d -> b d l", l=L).contiguous()
274
+
275
+ out, scan_intermediates, out_z = ops.selective_scan_fwd(
276
+ conv1d_out, delta, A, B, C, D, z, delta_bias, delta_softplus
277
+ )
278
+ ctx.delta_softplus = delta_softplus
279
+ ctx.out_proj_bias_is_None = out_proj_bias is None
280
+ ctx.checkpoint_lvl = checkpoint_lvl
281
+ ctx.b_rms_weight = b_rms_weight
282
+ ctx.c_rms_weight = c_rms_weight
283
+ ctx.dt_rms_weight = dt_rms_weight
284
+ ctx.b_c_dt_rms_eps = b_c_dt_rms_eps
285
+ if checkpoint_lvl >= 1: # Will recompute conv1d_out and delta in the backward pass
286
+ conv1d_out, delta = None, None
287
+ ctx.save_for_backward(xz, conv1d_weight, conv1d_bias, x_dbl, x_proj_weight,
288
+ delta_proj_weight, out_proj_weight, conv1d_out, delta,
289
+ A, B, C, D, delta_bias, scan_intermediates, b_rms_weight, c_rms_weight, dt_rms_weight, out)
290
+ return F.linear(rearrange(out_z, "b d l -> b l d"), out_proj_weight, out_proj_bias)
291
+
292
+ @staticmethod
293
+ @custom_bwd
294
+ def backward(ctx, dout):
295
+ # dout: (batch, seqlen, dim)
296
+ assert causal_conv1d_cuda is not None, "causal_conv1d_cuda is not available. Please install causal-conv1d."
297
+ (xz, conv1d_weight, conv1d_bias, x_dbl, x_proj_weight, delta_proj_weight, out_proj_weight,
298
+ conv1d_out, delta, A, B, C, D, delta_bias, scan_intermediates, b_rms_weight, c_rms_weight, dt_rms_weight, out) = ctx.saved_tensors
299
+ L = xz.shape[-1]
300
+ delta_rank = delta_proj_weight.shape[1]
301
+ d_state = A.shape[-1] * (1 if not A.is_complex() else 2)
302
+ x, z = xz.chunk(2, dim=1)
303
+ if dout.stride(-1) != 1:
304
+ dout = dout.contiguous()
305
+ if ctx.checkpoint_lvl == 1:
306
+ conv1d_out = causal_conv1d_cuda.causal_conv1d_fwd(
307
+ x, conv1d_weight, conv1d_bias, None, None, None, True
308
+ )
309
+ delta = rearrange(delta_proj_weight @ x_dbl[:, :delta_rank].t(),
310
+ "d (b l) -> b d l", l = L)
311
+ if dt_rms_weight is not None:
312
+ delta = rearrange(delta, "b d l -> (b l) d", l=L).contiguous()
313
+ delta = rms_norm_forward(delta, ctx.dt_rms_weight, None, ctx.b_c_dt_rms_eps)
314
+ delta = rearrange(delta, "(b l) d -> b d l", l=L).contiguous()
315
+ if b_rms_weight is not None:
316
+ # Recompute & RMSNorm B
317
+ B = rearrange(B, "b 1 dstate l -> (b l) dstate", l=L).contiguous()
318
+ B = rms_norm_forward(
319
+ B, ctx.b_rms_weight, None, ctx.b_c_dt_rms_eps
320
+ )
321
+ B = rearrange(B, "(b l) dstate -> b 1 dstate l", l=L).contiguous()
322
+ if c_rms_weight is not None:
323
+ # Recompute & RMSNorm C
324
+ C = rearrange(C, "b 1 dstate l -> (b l) dstate", l=L).contiguous()
325
+ C = rms_norm_forward(
326
+ C, ctx.c_rms_weight, None, ctx.b_c_dt_rms_eps
327
+ )
328
+ C = rearrange(C, "(b l) dstate -> b 1 dstate l", l=L).contiguous()
329
+
330
+ # The kernel supports passing in a pre-allocated dz (e.g., in case we want to fuse the
331
+ # backward of selective_scan_cuda with the backward of chunk).
332
+ dxz = torch.empty_like(xz) # (batch, dim, seqlen)
333
+ dx, dz = dxz.chunk(2, dim=1)
334
+ dout = rearrange(dout, "b l e -> e (b l)")
335
+ dout_y = rearrange(out_proj_weight.t() @ dout, "d (b l) -> b d l", l=L)
336
+ dconv1d_out, ddelta, dA, dB, dC, dD, ddelta_bias, dz, out_z = (
337
+ ops.selective_scan_bwd(
338
+ conv1d_out,
339
+ delta,
340
+ A,
341
+ B,
342
+ C,
343
+ D,
344
+ z,
345
+ delta_bias,
346
+ dout_y,
347
+ scan_intermediates,
348
+ out,
349
+ dz,
350
+ ctx.delta_softplus,
351
+ True, # option to recompute out_z
352
+ )
353
+ )
354
+ dout_proj_weight = torch.einsum(
355
+ "eB,dB->ed", dout, rearrange(out_z, "b d l -> d (b l)")
356
+ )
357
+ dout_proj_bias = dout.sum(dim=(0, 1)) if not ctx.out_proj_bias_is_None else None
358
+ dD = dD if D is not None else None
359
+ dx_dbl = torch.empty_like(x_dbl)
360
+ dB_proj_bias = None
361
+ if ctx.is_variable_B:
362
+ if not A.is_complex():
363
+ dB = rearrange(dB, "b 1 dstate l -> (b l) dstate").contiguous()
364
+ else:
365
+ dB = rearrange(dB, "b 1 dstate (l two) -> (b l) (dstate two)", two=2).contiguous()
366
+ dB_proj_bias = dB.sum(0) if not ctx.B_proj_bias_is_None else None
367
+ dx_dbl[:, delta_rank:delta_rank + d_state] = dB # (bl d)
368
+ dB = None
369
+ dC_proj_bias = None
370
+ if ctx.is_variable_C:
371
+ if not A.is_complex():
372
+ dC = rearrange(dC, "b 1 dstate l -> (b l) dstate").contiguous()
373
+ else:
374
+ dC = rearrange(dC, "b 1 dstate (l two) -> (b l) (dstate two)", two=2).contiguous()
375
+ dC_proj_bias = dC.sum(0) if not ctx.C_proj_bias_is_None else None
376
+ dx_dbl[:, -d_state:] = dC # (bl d)
377
+ dC = None
378
+ ddelta = rearrange(ddelta, "b d l -> d (b l)")
379
+ ddelta_proj_weight = torch.einsum("dB,Br->dr", ddelta, x_dbl[:, :delta_rank])
380
+ dx_dbl[:, :delta_rank] = torch.einsum("dB,dr->Br", ddelta, delta_proj_weight)
381
+ dconv1d_out = rearrange(dconv1d_out, "b d l -> d (b l)")
382
+ dx_proj_weight = torch.einsum("Br,Bd->rd", dx_dbl, rearrange(conv1d_out, "b d l -> (b l) d"))
383
+ dconv1d_out = torch.addmm(dconv1d_out, x_proj_weight.t(), dx_dbl.t(), out=dconv1d_out)
384
+ dconv1d_out = rearrange(dconv1d_out, "d (b l) -> b d l", b=x.shape[0], l=x.shape[-1])
385
+ # The kernel supports passing in a pre-allocated dx (e.g., in case we want to fuse the
386
+ # backward of conv1d with the backward of chunk).
387
+ dx, dconv1d_weight, dconv1d_bias, *_ = causal_conv1d_cuda.causal_conv1d_bwd(
388
+ x, conv1d_weight, conv1d_bias, dconv1d_out, None, None, None, dx, False, True
389
+ )
390
+ dconv1d_bias = dconv1d_bias if conv1d_bias is not None else None
391
+ dconv1d_weight = rearrange(dconv1d_weight, "d w -> d 1 w")
392
+ return (dxz, dconv1d_weight, dconv1d_bias, dx_proj_weight, ddelta_proj_weight,
393
+ dout_proj_weight, dout_proj_bias,
394
+ dA, dB, dC, dD,
395
+ ddelta_bias if delta_bias is not None else None,
396
+ # 6-None are delta_softplus, checkpoint_lvl, b_rms_weight, c_rms_weight, dt_rms_weight, b_c_dt_rms_eps
397
+ dB_proj_bias, dC_proj_bias, None, None, None, None, None, None)
398
+
399
+
400
+ def mamba_inner_fn(
401
+ xz, conv1d_weight, conv1d_bias, x_proj_weight, delta_proj_weight,
402
+ out_proj_weight, out_proj_bias,
403
+ A, B=None, C=None, D=None, delta_bias=None, B_proj_bias=None,
404
+ C_proj_bias=None, delta_softplus=True, checkpoint_lvl=1, b_rms_weight= None, c_rms_weight= None, dt_rms_weight= None, b_c_dt_rms_eps=1e-6
405
+ ):
406
+ return MambaInnerFn.apply(xz, conv1d_weight, conv1d_bias, x_proj_weight, delta_proj_weight,
407
+ out_proj_weight, out_proj_bias,
408
+ A, B, C, D, delta_bias, B_proj_bias, C_proj_bias, delta_softplus, checkpoint_lvl, b_rms_weight, c_rms_weight, dt_rms_weight, b_c_dt_rms_eps)
409
+
410
+
411
+ def mamba_inner_ref(
412
+ xz, conv1d_weight, conv1d_bias, x_proj_weight, delta_proj_weight,
413
+ out_proj_weight, out_proj_bias,
414
+ A, B=None, C=None, D=None, delta_bias=None, B_proj_bias=None,
415
+ C_proj_bias=None, delta_softplus=True
416
+ ):
417
+ assert causal_conv1d_fn is not None, "causal_conv1d_fn is not available. Please install causal-conv1d."
418
+ L = xz.shape[-1]
419
+ delta_rank = delta_proj_weight.shape[1]
420
+ d_state = A.shape[-1] * (1 if not A.is_complex() else 2)
421
+ x, z = xz.chunk(2, dim=1)
422
+ x = causal_conv1d_fn(x, rearrange(conv1d_weight, "d 1 w -> d w"), conv1d_bias, activation="silu")
423
+ # We're being very careful here about the layout, to avoid extra transposes.
424
+ # We want delta to have d as the slowest moving dimension
425
+ # and L as the fastest moving dimension, since those are what the ssm_scan kernel expects.
426
+ x_dbl = F.linear(rearrange(x, 'b d l -> (b l) d'), x_proj_weight) # (bl d)
427
+ delta = delta_proj_weight @ x_dbl[:, :delta_rank].t()
428
+ delta = rearrange(delta, "d (b l) -> b d l", l=L)
429
+ if B is None: # variable B
430
+ B = x_dbl[:, delta_rank:delta_rank + d_state] # (bl d)
431
+ if B_proj_bias is not None:
432
+ B = B + B_proj_bias.to(dtype=B.dtype)
433
+ if not A.is_complex():
434
+ B = rearrange(B, "(b l) dstate -> b dstate l", l=L).contiguous()
435
+ else:
436
+ B = rearrange(B, "(b l) (dstate two) -> b dstate (l two)", l=L, two=2).contiguous()
437
+ if C is None: # variable B
438
+ C = x_dbl[:, -d_state:] # (bl d)
439
+ if C_proj_bias is not None:
440
+ C = C + C_proj_bias.to(dtype=C.dtype)
441
+ if not A.is_complex():
442
+ C = rearrange(C, "(b l) dstate -> b dstate l", l=L).contiguous()
443
+ else:
444
+ C = rearrange(C, "(b l) (dstate two) -> b dstate (l two)", l=L, two=2).contiguous()
445
+ y = selective_scan_fn(x, delta, A, B, C, D, z=z, delta_bias=delta_bias, delta_softplus=True)
446
+ return F.linear(rearrange(y, "b d l -> b l d"), out_proj_weight, out_proj_bias)
build/torch213-cxx11-cu126-x86_64-linux/ops/triton/__init__.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ from .selective_state_update import selective_state_update
2
+ from .ssd_combined import mamba_chunk_scan_combined, mamba_split_conv1d_scan_combined
build/torch213-cxx11-cu126-x86_64-linux/ops/triton/k_activations.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2024, Tri Dao, Albert Gu.
2
+
3
+ import torch
4
+
5
+ import triton
6
+ import triton.language as tl
7
+
8
+
9
+ @triton.autotune(
10
+ configs=[
11
+ triton.Config({'BLOCK_N': 32}),
12
+ triton.Config({'BLOCK_N': 64}),
13
+ triton.Config({'BLOCK_N': 128}),
14
+ triton.Config({'BLOCK_N': 256}),
15
+ triton.Config({'BLOCK_N': 512}),
16
+ triton.Config({'BLOCK_N': 1024}),
17
+ ],
18
+ key=['ncols'],
19
+ )
20
+ @triton.jit
21
+ def _swiglu_fwd_kernel(
22
+ X,
23
+ Y,
24
+ OUT,
25
+ stride_x_row, # how much to increase the pointer when moving by 1 row
26
+ stride_y_row,
27
+ stride_out_row,
28
+ ncols,
29
+ BLOCK_N: tl.constexpr,
30
+ ):
31
+ # Map the program id to the row of X and Y it should compute.
32
+ row = tl.program_id(0)
33
+ start_col = tl.program_id(1) * BLOCK_N
34
+ X += row * stride_x_row
35
+ Y += row * stride_y_row
36
+ OUT += row * stride_out_row
37
+ cols = start_col + tl.arange(0, BLOCK_N)
38
+ x = tl.load(X + cols, mask=cols < ncols, other=0.).to(tl.float32)
39
+ y = tl.load(Y + cols, mask=cols < ncols, other=0.).to(tl.float32)
40
+ out = x * tl.sigmoid(x) * y
41
+ tl.store(OUT + cols, out, mask=cols < ncols)
42
+
43
+
44
+ def _swiglu_fwd(xy, out=None):
45
+ if xy.stride(-1) != 1:
46
+ xy = xy.contiguous()
47
+ batch_shape = xy.shape[:-1]
48
+ xy = xy.reshape(-1, xy.shape[-1])
49
+ x, y = xy.chunk(2, dim=-1)
50
+ if out is None:
51
+ out = torch.empty_like(x)
52
+ else:
53
+ out = out.reshape(-1, out.shape[-1])
54
+ assert out.shape == x.shape
55
+ assert out.stride(-1) == 1
56
+ M, N = x.shape
57
+ grid = lambda META: (M, triton.cdiv(N, META['BLOCK_N']))
58
+ with torch.cuda.device(x.device.index):
59
+ _swiglu_fwd_kernel[grid](x, y, out, x.stride(0), y.stride(0), out.stride(0), N)
60
+ return out.reshape(*batch_shape, out.shape[-1])
61
+
62
+
63
+ @triton.autotune(
64
+ configs=[
65
+ triton.Config({'BLOCK_N': 32}),
66
+ triton.Config({'BLOCK_N': 64}),
67
+ triton.Config({'BLOCK_N': 128}),
68
+ triton.Config({'BLOCK_N': 256}),
69
+ triton.Config({'BLOCK_N': 512}),
70
+ triton.Config({'BLOCK_N': 1024}),
71
+ ],
72
+ key=['ncols'],
73
+ )
74
+ @triton.heuristics({"RECOMPUTE_OUTPUT": lambda args: args["OUT"] is not None})
75
+ @triton.jit
76
+ def _swiglu_bwd_kernel(
77
+ X,
78
+ Y,
79
+ DOUT,
80
+ OUT,
81
+ DX,
82
+ DY,
83
+ stride_x_row, # how much to increase the pointer when moving by 1 row
84
+ stride_y_row,
85
+ stride_dout_row,
86
+ stride_out_row,
87
+ stride_dx_row,
88
+ stride_dy_row,
89
+ ncols,
90
+ BLOCK_N: tl.constexpr,
91
+ RECOMPUTE_OUTPUT: tl.constexpr,
92
+ ):
93
+ # Map the program id to the row of X and Y it should compute.
94
+ row = tl.program_id(0)
95
+ start_col = tl.program_id(1) * BLOCK_N
96
+ X += row * stride_x_row
97
+ Y += row * stride_y_row
98
+ DOUT += row * stride_dout_row
99
+ if RECOMPUTE_OUTPUT:
100
+ OUT += row * stride_out_row
101
+ DX += row * stride_dx_row
102
+ DY += row * stride_dy_row
103
+ cols = start_col + tl.arange(0, BLOCK_N)
104
+ x = tl.load(X + cols, mask=cols < ncols, other=0.).to(tl.float32)
105
+ y = tl.load(Y + cols, mask=cols < ncols, other=0.).to(tl.float32)
106
+ dout = tl.load(DOUT + cols, mask=cols < ncols, other=0.).to(tl.float32)
107
+ x_sigmoid = tl.sigmoid(x)
108
+ dx = x_sigmoid * (1 + x * (1 - x_sigmoid)) * y * dout
109
+ dy = x * x_sigmoid * dout
110
+ tl.store(DX + cols, dx, mask=cols < ncols)
111
+ tl.store(DY + cols, dy, mask=cols < ncols)
112
+ if RECOMPUTE_OUTPUT:
113
+ out = x * x_sigmoid * y
114
+ tl.store(OUT + cols, out, mask=cols < ncols)
115
+
116
+
117
+ def _swiglu_bwd(xy, dout, dxy=None, recompute_output=False, out=None):
118
+ if xy.stride(-1) != 1:
119
+ xy = xy.contiguous()
120
+ if dout.stride(-1) != 1:
121
+ dout = dout.contiguous()
122
+ batch_shape = xy.shape[:-1]
123
+ xy = xy.reshape(-1, xy.shape[-1])
124
+ x, y = xy.chunk(2, dim=-1)
125
+ dout = dout.reshape(-1, dout.shape[-1])
126
+ assert dout.shape == x.shape
127
+ if dxy is None:
128
+ dxy = torch.empty_like(xy)
129
+ else:
130
+ dxy = dxy.reshape(-1, dxy.shape[-1])
131
+ assert dxy.shape == xy.shape
132
+ dx, dy = dxy.chunk(2, dim=-1)
133
+ assert dx.stride(-1) == 1
134
+ assert dy.stride(-1) == 1
135
+ if recompute_output:
136
+ if out is None:
137
+ out = torch.empty_like(x)
138
+ else:
139
+ out = out.reshape(-1, out.shape[-1])
140
+ assert out.shape == x.shape
141
+ assert out.stride(-1) == 1
142
+ M, N = x.shape
143
+ grid = lambda META: (M, triton.cdiv(N, META['BLOCK_N']))
144
+ with torch.cuda.device(x.device.index):
145
+ _swiglu_bwd_kernel[grid](x, y, dout, out if recompute_output else None, dx, dy,
146
+ x.stride(0), y.stride(0), dout.stride(0),
147
+ out.stride(0) if recompute_output else 0,
148
+ dx.stride(0), dy.stride(0),
149
+ N)
150
+ if not recompute_output:
151
+ return dxy.reshape(*batch_shape, dxy.shape[-1])
152
+ else:
153
+ return dxy.reshape(*batch_shape, dxy.shape[-1]), out.reshape(*batch_shape, out.shape[-1])
154
+
155
+
156
+ class SwiGLU(torch.autograd.Function):
157
+
158
+ @staticmethod
159
+ def forward(ctx, xy):
160
+ ctx.save_for_backward(xy)
161
+ return _swiglu_fwd(xy)
162
+
163
+ @staticmethod
164
+ def backward(ctx, dout):
165
+ xy, = ctx.saved_tensors
166
+ return _swiglu_bwd(xy, dout)
167
+
168
+
169
+ swiglu = SwiGLU.apply