opentrons 8.0.0a5__py2.py3-none-any.whl → 8.0.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.
@@ -2683,6 +2683,15 @@ class OT3API(
2683
2683
  self._pipette_handler.ready_for_tip_action(
2684
2684
  instrument, HardwareAction.LIQUID_PROBE, checked_mount
2685
2685
  )
2686
+ # default to using all available sensors
2687
+ if probe:
2688
+ checked_probe = probe
2689
+ else:
2690
+ checked_probe = (
2691
+ InstrumentProbeType.BOTH
2692
+ if instrument.channels > 1
2693
+ else InstrumentProbeType.PRIMARY
2694
+ )
2686
2695
 
2687
2696
  if not probe_settings:
2688
2697
  probe_settings = deepcopy(self.config.liquid_sense)
@@ -2756,7 +2765,7 @@ class OT3API(
2756
2765
  height = await self._liquid_probe_pass(
2757
2766
  checked_mount,
2758
2767
  probe_settings,
2759
- probe if probe else InstrumentProbeType.PRIMARY,
2768
+ checked_probe,
2760
2769
  p_pass_travel + p_impulse_mm,
2761
2770
  )
2762
2771
  # if we made it here without an error we found the liquid
@@ -16,6 +16,7 @@ from typing import (
16
16
  from opentrons_shared_data.errors.exceptions import MotionPlanningFailureError
17
17
  from opentrons_shared_data.module import FLEX_TC_LID_COLLISION_ZONE
18
18
 
19
+ from opentrons.hardware_control import CriticalPoint
19
20
  from opentrons.hardware_control.modules.types import ModuleType
20
21
  from opentrons.motion_planning import deck_conflict as wrapped_deck_conflict
21
22
  from opentrons.motion_planning import adjacent_slots_getters
@@ -228,9 +229,13 @@ def check_safe_for_pipette_movement(
228
229
  )
229
230
  primary_nozzle = engine_state.pipettes.get_primary_nozzle(pipette_id)
230
231
 
232
+ destination_cp = _get_critical_point_to_use(engine_state, labware_id)
233
+
231
234
  pipette_bounds_at_well_location = (
232
235
  engine_state.pipettes.get_pipette_bounds_at_specified_move_to_position(
233
- pipette_id=pipette_id, destination_position=well_location_point
236
+ pipette_id=pipette_id,
237
+ destination_position=well_location_point,
238
+ critical_point=destination_cp,
234
239
  )
235
240
  )
236
241
  if not _is_within_pipette_extents(
@@ -284,6 +289,21 @@ def check_safe_for_pipette_movement(
284
289
  )
285
290
 
286
291
 
292
+ def _get_critical_point_to_use(
293
+ engine_state: StateView, labware_id: str
294
+ ) -> Optional[CriticalPoint]:
295
+ """Return the critical point to use when accessing the given labware."""
296
+ # TODO (spp, 2024-09-17): looks like Y_CENTER of column is the same as its XY_CENTER.
297
+ # I'm using this if-else ladder to be consistent with what we do in
298
+ # `MotionPlanning.get_movement_waypoints_to_well()`.
299
+ # We should probably use only XY_CENTER in both places.
300
+ if engine_state.labware.get_should_center_column_on_target_well(labware_id):
301
+ return CriticalPoint.Y_CENTER
302
+ elif engine_state.labware.get_should_center_pipette_on_target_well(labware_id):
303
+ return CriticalPoint.XY_CENTER
304
+ return None
305
+
306
+
287
307
  def _slot_has_potential_colliding_object(
288
308
  engine_state: StateView,
289
309
  pipette_bounds: Tuple[Point, Point, Point, Point],
@@ -266,6 +266,7 @@ class InstrumentContext(publisher.CommandPublisher):
266
266
  and well is not None
267
267
  and self.liquid_presence_detection
268
268
  and self._96_tip_config_valid()
269
+ and self._core.get_current_volume() == 0
269
270
  ):
270
271
  self.require_liquid_presence(well=well)
271
272
 
@@ -20,6 +20,8 @@ from ..errors import (
20
20
  ProtocolEngineError,
21
21
  )
22
22
 
23
+ from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType
24
+
23
25
 
24
26
  PRIMARY_NOZZLE_TO_ENDING_NOZZLE_MAP = {
25
27
  "A1": {"COLUMN": "H1", "ROW": "A12"},
@@ -300,6 +302,13 @@ class HardwareTipHandler(TipHandler):
300
302
  This function will raise an exception if the specified tip presence status
301
303
  isn't matched.
302
304
  """
305
+ if (
306
+ self._state_view.pipettes.get_nozzle_layout_type(pipette_id)
307
+ == NozzleConfigurationType.SINGLE
308
+ and self._state_view.pipettes.get_channels(pipette_id) == 96
309
+ ):
310
+ # Tip presence sensing is not supported for single tip pick up on the 96ch Flex Pipette
311
+ return
303
312
  try:
304
313
  ot3api = ensure_ot3_hardware(hardware_api=self._hardware_api)
305
314
  hw_mount = self._state_view.pipettes.get_mount(pipette_id).to_hw_mount()
@@ -193,9 +193,12 @@ class VirtualPipetteDataProvider:
193
193
  pipette_model.pipette_channels,
194
194
  pipette_model.pipette_version,
195
195
  )
196
- nozzle_manager = NozzleConfigurationManager.build_from_config(
197
- config, valid_nozzle_maps
198
- )
196
+ if pipette_id not in self._nozzle_manager_layout_by_id:
197
+ nozzle_manager = NozzleConfigurationManager.build_from_config(
198
+ config, valid_nozzle_maps
199
+ )
200
+ else:
201
+ nozzle_manager = self._nozzle_manager_layout_by_id[pipette_id]
199
202
 
200
203
  tip_overlap_dict_for_tip_type = None
201
204
  for configuration in (
@@ -7,6 +7,7 @@ from typing_extensions import assert_type
7
7
  from opentrons_shared_data.pipette import pipette_definition
8
8
  from opentrons.config.defaults_ot2 import Z_RETRACT_DISTANCE
9
9
  from opentrons.hardware_control.dev_types import PipetteDict
10
+ from opentrons.hardware_control import CriticalPoint
10
11
  from opentrons.hardware_control.nozzle_manager import (
11
12
  NozzleConfigurationType,
12
13
  NozzleMap,
@@ -795,17 +796,27 @@ class PipetteView(HasState[PipetteState]):
795
796
  nozzle_map = self._state.nozzle_configuration_by_id.get(pipette_id)
796
797
  return nozzle_map.starting_nozzle if nozzle_map else None
797
798
 
798
- def get_primary_nozzle_offset(self, pipette_id: str) -> Point:
799
- """Get the pipette's current primary nozzle's offset."""
799
+ def _get_critical_point_offset_without_tip(
800
+ self, pipette_id: str, critical_point: Optional[CriticalPoint]
801
+ ) -> Point:
802
+ """Get the offset of the specified critical point from pipette's mount position."""
800
803
  nozzle_map = self._state.nozzle_configuration_by_id.get(pipette_id)
801
- if nozzle_map:
802
- primary_nozzle_offset = nozzle_map.starting_nozzle_offset
803
- else:
804
- # When not in partial configuration, back-left nozzle is the primary
805
- primary_nozzle_offset = self.get_config(
806
- pipette_id
807
- ).bounding_nozzle_offsets.back_left_offset
808
- return primary_nozzle_offset
804
+ # Nozzle map is unavailable only when there's no pipette loaded
805
+ # so this is merely for satisfying the type checker
806
+ assert (
807
+ nozzle_map is not None
808
+ ), "Error getting critical point offset. Nozzle map not found."
809
+ match critical_point:
810
+ case CriticalPoint.INSTRUMENT_XY_CENTER:
811
+ return nozzle_map.instrument_xy_center_offset
812
+ case CriticalPoint.XY_CENTER:
813
+ return nozzle_map.xy_center_offset
814
+ case CriticalPoint.Y_CENTER:
815
+ return nozzle_map.y_center_offset
816
+ case CriticalPoint.FRONT_NOZZLE:
817
+ return nozzle_map.front_nozzle_offset
818
+ case _:
819
+ return nozzle_map.starting_nozzle_offset
809
820
 
810
821
  def get_pipette_bounding_nozzle_offsets(
811
822
  self, pipette_id: str
@@ -817,32 +828,46 @@ class PipetteView(HasState[PipetteState]):
817
828
  """Get the bounding box of the pipette."""
818
829
  return self.get_config(pipette_id).pipette_bounding_box_offsets
819
830
 
831
+ # TODO (spp, 2024-09-17): in order to find the position of pipette at destination,
832
+ # this method repeats the same steps that waypoints builder does while finding
833
+ # waypoints to move to. We should consolidate these steps into a shared entity
834
+ # so that the deck conflict checker and movement plan builder always remain in sync.
820
835
  def get_pipette_bounds_at_specified_move_to_position(
821
836
  self,
822
837
  pipette_id: str,
823
838
  destination_position: Point,
839
+ critical_point: Optional[CriticalPoint],
824
840
  ) -> Tuple[Point, Point, Point, Point]:
825
- """Get the pipette's bounding offsets when primary nozzle is at the given position."""
826
- primary_nozzle_offset = self.get_primary_nozzle_offset(pipette_id)
841
+ """Get the pipette's bounding box position when critical point is at the destination position.
842
+
843
+ Returns a tuple of the pipette's bounding box position in deck coordinates as-
844
+ (back_left_bound, front_right_bound, back_right_bound, front_left_bound)
845
+ Bounding box of the pipette includes the pipette's outer casing as well as nozzles.
846
+ """
827
847
  tip = self.get_attached_tip(pipette_id)
828
- # TODO update this for pipette robot stackup
829
- # Primary nozzle position at destination, in deck coordinates
830
- primary_nozzle_position = destination_position + Point(
848
+
849
+ # *Offset* of pipette's critical point w.r.t pipette mount
850
+ critical_point_offset = self._get_critical_point_offset_without_tip(
851
+ pipette_id, critical_point
852
+ )
853
+
854
+ # Position of the above critical point at destination, in deck coordinates
855
+ critical_point_position = destination_position + Point(
831
856
  x=0, y=0, z=tip.length if tip else 0
832
857
  )
833
858
 
834
- # Get the pipette bounding box based on total nozzles
859
+ # Get the pipette bounding box coordinates
835
860
  pipette_bounds_offsets = self.get_config(
836
861
  pipette_id
837
862
  ).pipette_bounding_box_offsets
838
863
  pip_back_left_bound = (
839
- primary_nozzle_position
840
- - primary_nozzle_offset
864
+ critical_point_position
865
+ - critical_point_offset
841
866
  + pipette_bounds_offsets.back_left_corner
842
867
  )
843
868
  pip_front_right_bound = (
844
- primary_nozzle_position
845
- - primary_nozzle_offset
869
+ critical_point_position
870
+ - critical_point_offset
846
871
  + pipette_bounds_offsets.front_right_corner
847
872
  )
848
873
  pip_back_right_bound = Point(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.0.0a5
3
+ Version: 8.0.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.0.0a5
24
+ Requires-Dist: opentrons-shared-data ==8.0.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
@@ -33,9 +33,9 @@ Requires-Dist: click <9,>=8.0.0
33
33
  Requires-Dist: packaging >=21.0
34
34
  Requires-Dist: importlib-metadata >=1.0 ; python_version < "3.8"
35
35
  Provides-Extra: flex-hardware
36
- Requires-Dist: opentrons-hardware[flex] ==8.0.0a5 ; extra == 'flex-hardware'
36
+ Requires-Dist: opentrons-hardware[flex] ==8.0.0a7 ; extra == 'flex-hardware'
37
37
  Provides-Extra: ot2-hardware
38
- Requires-Dist: opentrons-hardware ==8.0.0a5 ; extra == 'ot2-hardware'
38
+ Requires-Dist: opentrons-hardware ==8.0.0a7 ; extra == 'ot2-hardware'
39
39
 
40
40
  .. _Full API Documentation: http://docs.opentrons.com
41
41
 
@@ -100,7 +100,7 @@ opentrons/hardware_control/module_control.py,sha256=JTS0ys8nyQfCoE099trGAIVTJQEU
100
100
  opentrons/hardware_control/motion_utilities.py,sha256=LuOZBcnNJmTPra6-mYX5wN3jh8PA2l81dy5amCyYpcQ,7164
101
101
  opentrons/hardware_control/nozzle_manager.py,sha256=XNEyNdh00QdZ7VECb--JUO_BI-96EwoAPuQ7bdGXSGs,16788
102
102
  opentrons/hardware_control/ot3_calibration.py,sha256=OHkQi7cwgncCZjTfYmaKLR-sb3uHe6CrC5_1HVY0UJo,44753
103
- opentrons/hardware_control/ot3api.py,sha256=3MczLnsiWidKoN5XLxedMf3bgcMsroQgCYOqPaOI-bI,116419
103
+ opentrons/hardware_control/ot3api.py,sha256=Jcxx47nr6C9-WD3OU7zOoZ0i2xxuZZIV8XXPyeM3VEM,116677
104
104
  opentrons/hardware_control/pause_manager.py,sha256=wmNmraimE2yZQVqCxX_rtQHUWRzpzyQEaym9fLMgyww,888
105
105
  opentrons/hardware_control/poller.py,sha256=iMwlIyXgL1UVaAZYAoDKTdzrQPoxDhhaGzT411aBiFw,3590
106
106
  opentrons/hardware_control/robot_calibration.py,sha256=HiCQNmdp59SbkzXpDGtPsN8rSfUj-ZU4v63vcSw4AbI,7149
@@ -219,7 +219,7 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
219
219
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
220
220
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
221
221
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
222
- opentrons/protocol_api/instrument_context.py,sha256=TqzML0qqGKBKaU4FUEJKZJ23c5kLzZXQR1sfamZaNJw,95810
222
+ opentrons/protocol_api/instrument_context.py,sha256=HOxDcWLDN8CqQZ38OCrolO8D54m21LLMZ_vdd9oDZfI,95863
223
223
  opentrons/protocol_api/labware.py,sha256=cxJp5wWMv-OKLmryEXwPgFL6T6pu8T7SXYlGWaVmB-g,47723
224
224
  opentrons/protocol_api/module_contexts.py,sha256=4uXWnO-w4Znbz27Y8m0uMJ_CR0U3Qy1r1ODntFbYMd0,37325
225
225
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
@@ -236,7 +236,7 @@ opentrons/protocol_api/core/protocol.py,sha256=C70tQe6ZTjYX56rvlSl8MW2CJl0Mb-yZt
236
236
  opentrons/protocol_api/core/well.py,sha256=quBAF0UjcsRcqZy_Cb13NIkfnx4y1VbEHZgGcDIl-wI,2393
237
237
  opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4zlg7Pq1Rf5Xk,1516
238
238
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
239
- opentrons/protocol_api/core/engine/deck_conflict.py,sha256=EBC15ROS9cEUSnKHzeaL9xOhN_WS3tSNic8S-kkFz-Q,24560
239
+ opentrons/protocol_api/core/engine/deck_conflict.py,sha256=BDSSbAbJu6HZanPehNh8m4chdT573Q9AL98pC2LULfw,25473
240
240
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
241
241
  opentrons/protocol_api/core/engine/instrument.py,sha256=r_2ZF3i_5FZqMdFipu0hXpgx9Pl5mM5_AfX7La8H_TU,35686
242
242
  opentrons/protocol_api/core/engine/labware.py,sha256=xb1osbmcHL80S9RLeqA9qKiA_CdyMNMW0In7Pukegf4,7008
@@ -378,7 +378,7 @@ opentrons/protocol_engine/execution/run_control.py,sha256=vWLSRdkds2CrtsJ0IU9hX-
378
378
  opentrons/protocol_engine/execution/status_bar.py,sha256=tR7CHS_y1ARQxcSKDO4YFU2cqVQhePzalmzsyH8b23A,970
379
379
  opentrons/protocol_engine/execution/thermocycler_movement_flagger.py,sha256=if_jbmszy2MFMJCEMwt_fP_h0T1OBnHrQyI4jtUygvY,6784
380
380
  opentrons/protocol_engine/execution/thermocycler_plate_lifter.py,sha256=SPzuiyNNB05YPb_czPr8KmnvBwmXTszvngW1CX3HVd4,3309
381
- opentrons/protocol_engine/execution/tip_handler.py,sha256=6Lqrk2CnoNF3B5ozwpHdIEUl6EFXECjBArf7kOGpv_g,14991
381
+ opentrons/protocol_engine/execution/tip_handler.py,sha256=AWVJXR9R91KvQWeRhVGXyoPzCDhLmGtyyRwqBAqjv8E,15405
382
382
  opentrons/protocol_engine/notes/__init__.py,sha256=JRh7fKZ4XLUSQOZeI853MYkAZpKvp34RY8yDAHzcEbk,197
383
383
  opentrons/protocol_engine/notes/notes.py,sha256=RlLpfElzIa_p51ECCug7Fueq2VHRUeBTtnk-2zQerp0,1419
384
384
  opentrons/protocol_engine/resources/__init__.py,sha256=-tuKcd2Fn3YKWDX-tDqgZYv5MOSekGqHaHSoE1XDY3M,745
@@ -390,7 +390,7 @@ opentrons/protocol_engine/resources/labware_validation.py,sha256=wrth5Qc-RSMQlVm
390
390
  opentrons/protocol_engine/resources/model_utils.py,sha256=C3OHUi-OtuFUm3dS5rApSU3EJ0clnaCZEyBku5sTjzA,941
391
391
  opentrons/protocol_engine/resources/module_data_provider.py,sha256=fU4l1Wkeb1odW6XekvC0_SS0KjzAOcHPJQ4dLMp74NU,1553
392
392
  opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7v5ETc8y5T_sbs-jTPxuSnooE,744
393
- opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=NYcQGJYQ-aeEME5nilUlkHF6oWfrNZt0op52bUH0czo,14623
393
+ opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=EVPvsMDyTduyQvkULF_c58qirH251bPusbNvZr8YCjA,14788
394
394
  opentrons/protocol_engine/state/__init__.py,sha256=l-VhTfs16xika3ZWPqfxovB1Z1GHuPRm-IHWrEOuzAw,1826
395
395
  opentrons/protocol_engine/state/abstract_store.py,sha256=b5cqKZhI6ERZj6gyL0kDutD6ogdQngR3T-JmPATvhi8,631
396
396
  opentrons/protocol_engine/state/addressable_areas.py,sha256=Al86_Qv-ikveekNPV4XS50yzFzXMGklUgEotvbg3O8s,28217
@@ -403,7 +403,7 @@ opentrons/protocol_engine/state/liquids.py,sha256=W7cf-mmVaZ3aNyiormFEy79aSvU__Q
403
403
  opentrons/protocol_engine/state/modules.py,sha256=bylqsYZyVjrnx6BUhDjJb-TofnqPNk0EUYV8j12UINE,50673
404
404
  opentrons/protocol_engine/state/motion.py,sha256=nh0UGOVvmpYynOchGJkVLTyIyiJ9CszRTUvp4Czr_GI,13955
405
405
  opentrons/protocol_engine/state/move_types.py,sha256=zSQj_qYHBi7_-wrpaZBKmX_O-wNZCpLZkCzagOwI-zY,2132
406
- opentrons/protocol_engine/state/pipettes.py,sha256=wS7q9Sau86zK5vCcHiSGRdMhWNm26GPKUDNJnSEjEHw,36053
406
+ opentrons/protocol_engine/state/pipettes.py,sha256=PK57-a2A5wkRwRW0OaEAPVeioN38aCOo9iZrByxT-I4,37350
407
407
  opentrons/protocol_engine/state/state.py,sha256=jx044yBfXFV1YO5aqXhJmy7iFx-tXEQ5rIl3lMcrY04,13562
408
408
  opentrons/protocol_engine/state/state_summary.py,sha256=8VCxEOBeUflx8IBYUYtgNdwcwgdVZv3R8rSfzsbai7U,923
409
409
  opentrons/protocol_engine/state/tips.py,sha256=gU2GsmaWPDyIIjWHj3KXv6NqxphfOd4eeNxF40hm5ok,22621
@@ -500,9 +500,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
500
500
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
501
501
  opentrons/util/logging_config.py,sha256=g3TdzDKa1pL_N3eKhRYCdqPaZYe_hpLV-e8llObTcT4,5657
502
502
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
503
- opentrons-8.0.0a5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
504
- opentrons-8.0.0a5.dist-info/METADATA,sha256=8bfifhIOeDmfyGhYLVdDykKvLIB4R6h6t-3WaKHeNRk,4990
505
- opentrons-8.0.0a5.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
506
- opentrons-8.0.0a5.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
507
- opentrons-8.0.0a5.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
508
- opentrons-8.0.0a5.dist-info/RECORD,,
503
+ opentrons-8.0.0a7.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
504
+ opentrons-8.0.0a7.dist-info/METADATA,sha256=t9_kvk6apuDByc7BPI8F4cM_TSe62ivSF71v5mpv0yQ,4990
505
+ opentrons-8.0.0a7.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
506
+ opentrons-8.0.0a7.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
507
+ opentrons-8.0.0a7.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
508
+ opentrons-8.0.0a7.dist-info/RECORD,,