opentrons 8.5.0a6__py2.py3-none-any.whl → 8.5.0a7__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

@@ -47,10 +47,10 @@ def verify_and_normalize_transfer_args(
47
47
  flat_dests_list = []
48
48
  if group_wells_for_multi_channel and nozzle_map.tip_count > 1:
49
49
  flat_sources_list = tx_liquid_utils.group_wells_for_multi_channel_transfer(
50
- flat_sources_list, nozzle_map
50
+ flat_sources_list, nozzle_map, "source"
51
51
  )
52
52
  flat_dests_list = tx_liquid_utils.group_wells_for_multi_channel_transfer(
53
- flat_dests_list, nozzle_map
53
+ flat_dests_list, nozzle_map, "destination"
54
54
  )
55
55
  for well in flat_sources_list + flat_dests_list:
56
56
  instrument.validate_takes_liquid(
@@ -1,7 +1,6 @@
1
1
  """ProtocolEngine-based InstrumentContext core implementation."""
2
2
 
3
3
  from __future__ import annotations
4
- from contextlib import contextmanager
5
4
  from itertools import dropwhile
6
5
  from copy import deepcopy
7
6
  from typing import (
@@ -13,7 +12,6 @@ from typing import (
13
12
  Sequence,
14
13
  Tuple,
15
14
  NamedTuple,
16
- Generator,
17
15
  Literal,
18
16
  )
19
17
  from opentrons.types import (
@@ -1384,43 +1382,25 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1384
1382
  air_gap=0,
1385
1383
  )
1386
1384
  ]
1387
- # Enable LPD only if all of these apply:
1388
- # - LPD is globally enabled for this pipette
1389
- # - it is the first time visiting this well
1390
- # - pipette tip is unused
1391
- enable_lpd = (
1392
- self.get_liquid_presence_detection() and step_source != prev_src
1393
- )
1394
- elif new_tip == TransferTipPolicyV2.ONCE:
1395
- # Enable LPD only if:
1396
- # - LPD is globally enabled for this pipette
1397
- # - this is the first source well of the entire transfer, which means
1398
- # that the current tip is unused
1399
- enable_lpd = self.get_liquid_presence_detection() and prev_src is None
1400
- else:
1401
- enable_lpd = False
1402
1385
 
1403
- with self.lpd_for_transfer(enable_lpd):
1404
- post_asp_tip_contents = self.aspirate_liquid_class(
1405
- volume=step_volume,
1406
- source=step_source,
1407
- transfer_properties=transfer_props,
1408
- transfer_type=tx_comps_executor.TransferType.ONE_TO_ONE,
1409
- tip_contents=post_disp_tip_contents,
1410
- volume_for_pipette_mode_configuration=step_volume,
1411
- )
1412
- post_disp_tip_contents = self.dispense_liquid_class(
1413
- volume=step_volume,
1414
- dest=step_destination,
1415
- source=step_source,
1416
- transfer_properties=transfer_props,
1417
- transfer_type=tx_comps_executor.TransferType.ONE_TO_ONE,
1418
- tip_contents=post_asp_tip_contents,
1419
- add_final_air_gap=(
1420
- False if is_last_step and keep_last_tip else True
1421
- ),
1422
- trash_location=trash_location,
1423
- )
1386
+ post_asp_tip_contents = self.aspirate_liquid_class(
1387
+ volume=step_volume,
1388
+ source=step_source,
1389
+ transfer_properties=transfer_props,
1390
+ transfer_type=tx_comps_executor.TransferType.ONE_TO_ONE,
1391
+ tip_contents=post_disp_tip_contents,
1392
+ volume_for_pipette_mode_configuration=step_volume,
1393
+ )
1394
+ post_disp_tip_contents = self.dispense_liquid_class(
1395
+ volume=step_volume,
1396
+ dest=step_destination,
1397
+ source=step_source,
1398
+ transfer_properties=transfer_props,
1399
+ transfer_type=tx_comps_executor.TransferType.ONE_TO_ONE,
1400
+ tip_contents=post_asp_tip_contents,
1401
+ add_final_air_gap=(False if is_last_step and keep_last_tip else True),
1402
+ trash_location=trash_location,
1403
+ )
1424
1404
  prev_src = step_source
1425
1405
  prev_dest = step_destination
1426
1406
 
@@ -1695,17 +1675,6 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1695
1675
  " Specify a blowout location and enable blowout when using a disposal volume."
1696
1676
  )
1697
1677
 
1698
- if (
1699
- self.get_liquid_presence_detection()
1700
- and new_tip != TransferTipPolicyV2.NEVER
1701
- and is_first_step
1702
- ):
1703
- # Do probing only once, regardless of whether you are coming back to refill
1704
- # with a fresh tip since there's only one source well
1705
- enable_lpd = True
1706
- else:
1707
- enable_lpd = False
1708
-
1709
1678
  if not is_first_step and new_tip == TransferTipPolicyV2.ALWAYS:
1710
1679
  _drop_tip()
1711
1680
  last_tip = _pick_up_tip()
@@ -1715,20 +1684,19 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1715
1684
  air_gap=0,
1716
1685
  )
1717
1686
  ]
1718
- with self.lpd_for_transfer(enable=enable_lpd):
1719
- # Aspirate the total volume determined by the loop above
1720
- tip_contents = self.aspirate_liquid_class(
1721
- volume=total_aspirate_volume + conditioning_vol + disposal_vol,
1722
- source=source,
1723
- transfer_properties=transfer_props,
1724
- transfer_type=tx_comps_executor.TransferType.ONE_TO_MANY,
1725
- tip_contents=tip_contents,
1726
- # We configure the mode based on the last dispense volume and disposal volume
1727
- # since the mode is only used to determine the dispense push out volume
1728
- # and we can do a push out only at the last dispense, that too if there is no disposal volume.
1729
- volume_for_pipette_mode_configuration=vol_dest_combo[-1][0],
1730
- conditioning_volume=conditioning_vol,
1731
- )
1687
+ # Aspirate the total volume determined by the loop above
1688
+ tip_contents = self.aspirate_liquid_class(
1689
+ volume=total_aspirate_volume + conditioning_vol + disposal_vol,
1690
+ source=source,
1691
+ transfer_properties=transfer_props,
1692
+ transfer_type=tx_comps_executor.TransferType.ONE_TO_MANY,
1693
+ tip_contents=tip_contents,
1694
+ # We configure the mode based on the last dispense volume and disposal volume
1695
+ # since the mode is only used to determine the dispense push out volume
1696
+ # and we can do a push out only at the last dispense, that too if there is no disposal volume.
1697
+ volume_for_pipette_mode_configuration=vol_dest_combo[-1][0],
1698
+ conditioning_volume=conditioning_vol,
1699
+ )
1732
1700
 
1733
1701
  # If the tip has volumes correspoinding to multiple destinations, then
1734
1702
  # multi-dispense in those destinations.
@@ -1963,7 +1931,6 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1963
1931
  next_step_volume, next_source = next(source_per_volume_step)
1964
1932
  is_first_step = True
1965
1933
  is_last_step = False
1966
- prev_src: Optional[tuple[Location, WellCore]] = None
1967
1934
  while not is_last_step:
1968
1935
  total_dispense_volume = 0.0
1969
1936
  vol_aspirate_combo = []
@@ -1981,13 +1948,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1981
1948
  is_last_step = True
1982
1949
  break
1983
1950
 
1984
- if (
1985
- self.get_liquid_presence_detection()
1986
- and new_tip != TransferTipPolicyV2.NEVER
1987
- and is_first_step
1988
- ):
1989
- enable_lpd = True
1990
- elif not is_first_step and new_tip == TransferTipPolicyV2.ALWAYS:
1951
+ if not is_first_step and new_tip == TransferTipPolicyV2.ALWAYS:
1991
1952
  _drop_tip()
1992
1953
  last_tip = _pick_up_tip()
1993
1954
  tip_contents = [
@@ -1996,33 +1957,22 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1996
1957
  air_gap=0,
1997
1958
  )
1998
1959
  ]
1999
- # Enable LPD if it's globally enabled, as long as
2000
- # the next source is different from previous source
2001
- enable_lpd = (
2002
- self.get_liquid_presence_detection()
2003
- and prev_src != vol_aspirate_combo[0][1]
2004
- )
2005
- else:
2006
- enable_lpd = False
2007
1960
 
2008
1961
  total_aspirated_volume = 0.0
2009
1962
  for step_num, (step_volume, step_source) in enumerate(vol_aspirate_combo):
2010
- with self.lpd_for_transfer(enable=enable_lpd):
2011
- tip_contents = self.aspirate_liquid_class(
2012
- volume=step_volume,
2013
- source=step_source,
2014
- transfer_properties=transfer_props,
2015
- transfer_type=tx_comps_executor.TransferType.MANY_TO_ONE,
2016
- tip_contents=tip_contents,
2017
- volume_for_pipette_mode_configuration=(
2018
- total_dispense_volume if step_num == 0 else None
2019
- ),
2020
- current_volume=total_aspirated_volume,
2021
- )
2022
- prev_src = step_source
1963
+ tip_contents = self.aspirate_liquid_class(
1964
+ volume=step_volume,
1965
+ source=step_source,
1966
+ transfer_properties=transfer_props,
1967
+ transfer_type=tx_comps_executor.TransferType.MANY_TO_ONE,
1968
+ tip_contents=tip_contents,
1969
+ volume_for_pipette_mode_configuration=(
1970
+ total_dispense_volume if step_num == 0 else None
1971
+ ),
1972
+ current_volume=total_aspirated_volume,
1973
+ )
2023
1974
  total_aspirated_volume += step_volume
2024
1975
  is_first_step = False
2025
- enable_lpd = False
2026
1976
  tip_contents = self.dispense_liquid_class(
2027
1977
  volume=total_dispense_volume,
2028
1978
  dest=dest,
@@ -2119,10 +2069,6 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
2119
2069
  location=prep_location,
2120
2070
  )
2121
2071
  last_liquid_and_airgap_in_tip.air_gap = 0
2122
- if self.get_liquid_presence_detection():
2123
- self.liquid_probe_with_recovery(
2124
- well_core=source_well, loc=prep_location
2125
- )
2126
2072
  # TODO: do volume configuration + prepare for aspirate only if the mode needs to be changed
2127
2073
  self.configure_for_volume(volume_for_pipette_mode_configuration)
2128
2074
  self.prepare_to_aspirate()
@@ -2541,14 +2487,6 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
2541
2487
  """Call a protocol delay."""
2542
2488
  self._protocol_core.delay(seconds=seconds, msg=None)
2543
2489
 
2544
- @contextmanager
2545
- def lpd_for_transfer(self, enable: bool) -> Generator[None, None, None]:
2546
- """Context manager for the instrument's LPD state during a transfer."""
2547
- global_lpd_enabled = self.get_liquid_presence_detection()
2548
- self.set_liquid_presence_detection(enable=enable)
2549
- yield
2550
- self.set_liquid_presence_detection(enable=global_lpd_enabled)
2551
-
2552
2490
 
2553
2491
  class _TipInfo(NamedTuple):
2554
2492
  tiprack_location: Location
@@ -72,6 +72,7 @@ def raise_if_location_inside_liquid(
72
72
  def group_wells_for_multi_channel_transfer(
73
73
  targets: Sequence[Well],
74
74
  nozzle_map: NozzleMapInterface,
75
+ target_name: Literal["source", "destination"],
75
76
  ) -> List[Well]:
76
77
  """Takes a list of wells and a nozzle map and returns a list of target wells to address every well given
77
78
 
@@ -94,13 +95,20 @@ def group_wells_for_multi_channel_transfer(
94
95
  or (configuration == NozzleConfigurationType.ROW and active_nozzles == 12)
95
96
  or active_nozzles == 96
96
97
  ):
97
- return _group_wells_for_nozzle_configuration(list(targets), nozzle_map)
98
+ return _group_wells_for_nozzle_configuration(
99
+ list(targets), nozzle_map, target_name
100
+ )
98
101
  else:
99
- raise ValueError("Unsupported tip configuration for well grouping")
102
+ raise ValueError(
103
+ "Unsupported nozzle configuration for well grouping. Set group_wells to False"
104
+ " to only target wells with the primary nozzle for this configuration."
105
+ )
100
106
 
101
107
 
102
108
  def _group_wells_for_nozzle_configuration( # noqa: C901
103
- targets: List[Well], nozzle_map: NozzleMapInterface
109
+ targets: List[Well],
110
+ nozzle_map: NozzleMapInterface,
111
+ target_name: Literal["source", "destination"],
104
112
  ) -> List[Well]:
105
113
  """Groups wells together for a column, row, or full 96 configuration and returns a reduced list of target wells."""
106
114
  grouped_wells = []
@@ -132,8 +140,9 @@ def _group_wells_for_nozzle_configuration( # noqa: C901
132
140
  if active_wells_covered:
133
141
  if well.parent != active_labware:
134
142
  raise ValueError(
135
- "Could not resolve wells provided to pipette's nozzle configuration. "
136
- "Please ensure wells are ordered to match pipette's nozzle layout."
143
+ f"Could not group {target_name} wells to match pipette's nozzle configuration. Ensure that the"
144
+ " wells are ordered correctly (e.g. rows() for a row layout or columns() for a column layout), or"
145
+ " set group_wells to False to only target wells with the primary nozzle."
137
146
  )
138
147
 
139
148
  if well.well_name in active_wells_covered:
@@ -165,8 +174,9 @@ def _group_wells_for_nozzle_configuration( # noqa: C901
165
174
  alternate_384_well_coverage_count += 1
166
175
  else:
167
176
  raise ValueError(
168
- "Could not resolve wells provided to pipette's nozzle configuration. "
169
- "Please ensure wells are ordered to match pipette's nozzle layout."
177
+ f"Could not group {target_name} wells to match pipette's nozzle configuration. Ensure that the"
178
+ " wells are ordered correctly (e.g. rows() for a row layout or columns() for a column layout), or"
179
+ " set group_wells to False to only target wells with the primary nozzle."
170
180
  )
171
181
  # If we have no active wells covered to account for, add a new target well and list of covered wells to check
172
182
  else:
@@ -193,8 +203,8 @@ def _group_wells_for_nozzle_configuration( # noqa: C901
193
203
 
194
204
  if active_wells_covered:
195
205
  raise ValueError(
196
- "Could not target all wells provided without aspirating or dispensing from other wells. "
197
- f"Other wells that would be targeted: {active_wells_covered}"
206
+ f"Pipette will access {target_name} wells not provided in the liquid handling command."
207
+ f" Set group_wells to False or include these wells: {active_wells_covered}"
198
208
  )
199
209
 
200
210
  # If we reversed the lookup of wells, reverse the grouped wells we will return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.5.0a6
3
+ Version: 8.5.0a7
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Author: Opentrons
6
6
  Author-email: engineering@opentrons.com
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Topic :: Scientific/Engineering
22
22
  Requires-Python: >=3.10
23
23
  License-File: ../LICENSE
24
- Requires-Dist: opentrons-shared-data (==8.5.0a6)
24
+ Requires-Dist: opentrons-shared-data (==8.5.0a7)
25
25
  Requires-Dist: aionotify (==0.3.1)
26
26
  Requires-Dist: anyio (<4.0.0,>=3.6.1)
27
27
  Requires-Dist: jsonschema (<4.18.0,>=3.0.1)
@@ -35,9 +35,9 @@ Requires-Dist: pyusb (==1.2.1)
35
35
  Requires-Dist: packaging (>=21.0)
36
36
  Requires-Dist: importlib-metadata (>=1.0) ; python_version < "3.8"
37
37
  Provides-Extra: flex-hardware
38
- Requires-Dist: opentrons-hardware[flex] (==8.5.0a6) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.5.0a7) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.5.0a6) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.5.0a7) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -223,7 +223,7 @@ opentrons/protocol_api/_liquid_properties.py,sha256=DHdDHoset72mKq2sLaf355Zz1Xds
223
223
  opentrons/protocol_api/_nozzle_layout.py,sha256=-WA71bRDISs9bLwHdWqAyM7HBc53sOA8_BOVqYsuN3g,1095
224
224
  opentrons/protocol_api/_parameter_context.py,sha256=dvGMVObWDSERrXfTKSIwc4YeIdF_RD-q8ASNaSBTcxw,12967
225
225
  opentrons/protocol_api/_parameters.py,sha256=BGH50BFawoNnh7NRDh0tRrNncdwz_Ta25tbQfwtlYoM,1298
226
- opentrons/protocol_api/_transfer_liquid_validation.py,sha256=7k1QcYnmMt57KGs752EhIeDQS7XcfNvTH1D534v26FU,4418
226
+ opentrons/protocol_api/_transfer_liquid_validation.py,sha256=wYuvW3UwF0JcK_Hmxim-Fmy1VkSR1TLBW-7u59XADL0,4443
227
227
  opentrons/protocol_api/_types.py,sha256=6tPCuOmZ5GNtu-24zyY6O-KkXEqzhTAlHlKHQH3Dvzs,1413
228
228
  opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-7cw,625
229
229
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
@@ -249,7 +249,7 @@ opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4z
249
249
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
250
250
  opentrons/protocol_api/core/engine/deck_conflict.py,sha256=q3JViIAHDthIqq6ce7h2gxw3CHRfYsm5kkwzuXB-Gnc,12334
251
251
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
252
- opentrons/protocol_api/core/engine/instrument.py,sha256=COi9LB1jU-DaYMCw1eXcqfBs2Uu3Uv8ABcBMKYn-94U,106479
252
+ opentrons/protocol_api/core/engine/instrument.py,sha256=KgRDIq50Nah2lcMuOtcpDTjckt9ycqWtQ37u6GfpEnQ,103560
253
253
  opentrons/protocol_api/core/engine/labware.py,sha256=1xvzguNnK7aecFLiJK0gtRrZ5kpwtzLS73HnKvdJ5lc,8413
254
254
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=I4Cb8rqpBhmykQuZE8QRG802APrdCy_TYS88rm_9oGA,7159
255
255
  opentrons/protocol_api/core/engine/module_core.py,sha256=MLPgYSRJHUZPZ9rTLvsg3GlpL5b6-Pjk5UBgXCGrL6U,30994
@@ -526,7 +526,7 @@ opentrons/protocols/advanced_control/mix.py,sha256=GobQ9E6F2gARjfhNp2xdyWQXFBSwO
526
526
  opentrons/protocols/advanced_control/transfers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
527
527
  opentrons/protocols/advanced_control/transfers/common.py,sha256=Mal5AKO35nCXqjwxR6tDityEoLYg09Yty3Jv1fgOHnQ,5498
528
528
  opentrons/protocols/advanced_control/transfers/transfer.py,sha256=-vE1uZq2BqAagSGeiuTxTyL1wT6fza_fwkO_V_OMMFc,37318
529
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py,sha256=zgbpGwiH7mhUBC2gOMbMeTvaCa_-zkKIAYBzhpW3AK8,9124
529
+ opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py,sha256=uHUQJLYzDqA4pzZyIbR00PKRN5FMc6A6JgPBA9wSKTg,9713
530
530
  opentrons/protocols/api_support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
531
531
  opentrons/protocols/api_support/constants.py,sha256=pI_zJ8oORr6FUOaF508ttll3KOIYqRRgcwVFwnqZuqc,262
532
532
  opentrons/protocols/api_support/deck_type.py,sha256=cBxm-IQqFyL1QtYTMGtLXOlyuh-67xWgnJSP6rkg8oc,3942
@@ -584,9 +584,9 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
584
584
  opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
585
585
  opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
586
586
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
587
- opentrons-8.5.0a6.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
588
- opentrons-8.5.0a6.dist-info/METADATA,sha256=dzWtwQqk0zHTpNxPTjRA6c0Pq37BIyY7SAtT4GIublY,5084
589
- opentrons-8.5.0a6.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
590
- opentrons-8.5.0a6.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
591
- opentrons-8.5.0a6.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
592
- opentrons-8.5.0a6.dist-info/RECORD,,
587
+ opentrons-8.5.0a7.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
588
+ opentrons-8.5.0a7.dist-info/METADATA,sha256=hwuM6YYv_P5I0ajOPnA881RX44DKkJhCbARJrffgKcY,5084
589
+ opentrons-8.5.0a7.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
590
+ opentrons-8.5.0a7.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
591
+ opentrons-8.5.0a7.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
592
+ opentrons-8.5.0a7.dist-info/RECORD,,