simo 2.7.8__py3-none-any.whl → 2.7.10__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 simo might be problematic. Click here for more details.
- simo/core/forms.py +4 -1
- simo/core/models.py +0 -15
- simo/fleet/forms.py +0 -6
- simo/generic/socket_consumers.py +5 -5
- simo/multimedia/controllers.py +39 -2
- simo/multimedia/templates/admin/controller_widgets/player.html +11 -0
- simo/notifications/utils.py +2 -2
- simo/users/models.py +22 -0
- {simo-2.7.8.dist-info → simo-2.7.10.dist-info}/METADATA +1 -1
- {simo-2.7.8.dist-info → simo-2.7.10.dist-info}/RECORD +14 -13
- {simo-2.7.8.dist-info → simo-2.7.10.dist-info}/LICENSE.md +0 -0
- {simo-2.7.8.dist-info → simo-2.7.10.dist-info}/WHEEL +0 -0
- {simo-2.7.8.dist-info → simo-2.7.10.dist-info}/entry_points.txt +0 -0
- {simo-2.7.8.dist-info → simo-2.7.10.dist-info}/top_level.txt +0 -0
simo/core/forms.py
CHANGED
|
@@ -310,6 +310,7 @@ class ComponentAdminForm(forms.ModelForm):
|
|
|
310
310
|
|
|
311
311
|
base_fields.append('zone')
|
|
312
312
|
base_fields.append('category')
|
|
313
|
+
base_fields.append('show_in_app')
|
|
313
314
|
|
|
314
315
|
for field_name in cls.declared_fields:
|
|
315
316
|
if field_name not in main_fields:
|
|
@@ -319,7 +320,9 @@ class ComponentAdminForm(forms.ModelForm):
|
|
|
319
320
|
base_fields.append('notes')
|
|
320
321
|
|
|
321
322
|
fieldsets = [
|
|
322
|
-
(_("Base settings"), {
|
|
323
|
+
(_("Base settings"), {
|
|
324
|
+
'fields': base_fields + ['value_units', 'value_translation']}
|
|
325
|
+
),
|
|
323
326
|
]
|
|
324
327
|
if cls.has_alarm:
|
|
325
328
|
fieldsets.append(
|
simo/core/models.py
CHANGED
|
@@ -586,21 +586,6 @@ def is_in_alarm(self):
|
|
|
586
586
|
return self.is_in_alarm()
|
|
587
587
|
return bool(self.value)
|
|
588
588
|
|
|
589
|
-
def can_read(self, user):
|
|
590
|
-
if user.is_master:
|
|
591
|
-
return True
|
|
592
|
-
from .middleware import get_current_instance
|
|
593
|
-
instance = get_current_instance()
|
|
594
|
-
if instance:
|
|
595
|
-
role = user.get_role(instance)
|
|
596
|
-
if not role:
|
|
597
|
-
return False
|
|
598
|
-
for perm in role.component_permissions.all():
|
|
599
|
-
if perm.component.id == self.id:
|
|
600
|
-
return any([perm.write, perm.read])
|
|
601
|
-
return False
|
|
602
|
-
return False
|
|
603
|
-
|
|
604
589
|
def get_controller_methods(self):
|
|
605
590
|
c_methods = []
|
|
606
591
|
for m in inspect.getmembers(
|
simo/fleet/forms.py
CHANGED
|
@@ -306,12 +306,6 @@ class ColonelButtonConfigForm(ColonelComponentForm):
|
|
|
306
306
|
('up', "UP (On +5V delivery)")
|
|
307
307
|
)
|
|
308
308
|
)
|
|
309
|
-
btn_type = forms.ChoiceField(
|
|
310
|
-
label="Type", initial='momentary',
|
|
311
|
-
choices=(
|
|
312
|
-
('momentary', "Momentary"), ('toggle', "Toggle")
|
|
313
|
-
)
|
|
314
|
-
)
|
|
315
309
|
|
|
316
310
|
def __init__(self, *args, **kwargs):
|
|
317
311
|
super().__init__(*args, **kwargs)
|
simo/generic/socket_consumers.py
CHANGED
|
@@ -33,11 +33,11 @@ class CamStreamConsumer(AsyncWebsocketConsumer):
|
|
|
33
33
|
except:
|
|
34
34
|
return self.close()
|
|
35
35
|
|
|
36
|
-
can_read = await sync_to_async(
|
|
37
|
-
|
|
38
|
-
)(self.scope['user'])
|
|
39
|
-
if not can_read:
|
|
40
|
-
|
|
36
|
+
# can_read = await sync_to_async(
|
|
37
|
+
# self.component.can_read, thread_sensitive=True
|
|
38
|
+
# )(self.scope['user'])
|
|
39
|
+
# if not can_read:
|
|
40
|
+
# return self.close()
|
|
41
41
|
|
|
42
42
|
# self.video = cv2.VideoCapture(self.component.config['rtsp_address'])
|
|
43
43
|
# asyncio.create_task(self.send_cam())
|
simo/multimedia/controllers.py
CHANGED
|
@@ -4,6 +4,7 @@ from .app_widgets import AudioPlayerWidget, VideoPlayerWidget
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class BasePlayer(Switch):
|
|
7
|
+
admin_widget_template = 'admin/controller_widgets/player.html'
|
|
7
8
|
default_config = {
|
|
8
9
|
'has_volume_control': True,
|
|
9
10
|
}
|
|
@@ -50,19 +51,55 @@ class BasePlayer(Switch):
|
|
|
50
51
|
|
|
51
52
|
def set_volume(self, val):
|
|
52
53
|
assert 0 <= val <= 100
|
|
54
|
+
self.component.meta['volume'] = val
|
|
55
|
+
self.component.save()
|
|
53
56
|
self.send({'set_volume': val})
|
|
54
57
|
|
|
55
58
|
def get_volume(self):
|
|
59
|
+
'''override of possible with something more reliable'''
|
|
56
60
|
return self.component.meta['volume']
|
|
57
61
|
|
|
58
62
|
def set_shuffle_play(self, val):
|
|
63
|
+
self.component.meta['shuffle'] = bool(val)
|
|
64
|
+
self.component.save()
|
|
59
65
|
self.send({'shuffle': bool(val)})
|
|
60
66
|
|
|
61
67
|
def set_loop_play(self, val):
|
|
68
|
+
self.component.meta['loop'] = bool(val)
|
|
69
|
+
self.component.save()
|
|
62
70
|
self.send({'loop': bool(val)})
|
|
63
71
|
|
|
64
|
-
def play_library_item(self,
|
|
65
|
-
|
|
72
|
+
def play_library_item(self, id, volume=None, fade_in=None):
|
|
73
|
+
'''
|
|
74
|
+
:param id: Library item ID
|
|
75
|
+
:param volume: Volume to play at. Current volume will be used if not provided
|
|
76
|
+
:param fade_in: number of seconds to fade in
|
|
77
|
+
:return:
|
|
78
|
+
'''
|
|
79
|
+
self.send({'play_from_library': id, 'volume': volume, 'fade_in': fade_in})
|
|
80
|
+
|
|
81
|
+
def play_uri(self, uri, volume=None):
|
|
82
|
+
'''
|
|
83
|
+
Replace que with this single uri and play it immediately
|
|
84
|
+
:param uri: playable uri or url
|
|
85
|
+
:param volume: volume at which to play
|
|
86
|
+
:return:
|
|
87
|
+
'''
|
|
88
|
+
if volume:
|
|
89
|
+
assert 0 <= volume <= 100
|
|
90
|
+
self.send({"play_uri": uri, 'volume': volume})
|
|
91
|
+
|
|
92
|
+
def play_alert(self, val, volume=None):
|
|
93
|
+
'''
|
|
94
|
+
Plays alert and goes back to whatever was playing initially
|
|
95
|
+
:param val: Sound.id or uri
|
|
96
|
+
:param volume: volume at which to play
|
|
97
|
+
:return:
|
|
98
|
+
'''
|
|
99
|
+
assert type(val) in (int, str)
|
|
100
|
+
if volume:
|
|
101
|
+
assert 0 <= volume <= 100
|
|
102
|
+
self.send({"alert": val, 'volume': volume})
|
|
66
103
|
|
|
67
104
|
def toggle(self):
|
|
68
105
|
if self.component.value == 'playing':
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<div class="component-controller" data-ws_url="{{ obj.get_socket_url|default_if_none:"" }}">
|
|
2
|
+
{% if obj.value == 'playing' %}
|
|
3
|
+
<i class="fas fa-toggle-on fa-2x component_switch action"
|
|
4
|
+
data-method="pause"
|
|
5
|
+
></i>
|
|
6
|
+
{% else %}
|
|
7
|
+
<i class="fas fa-toggle-off fa-2x component_switch action"
|
|
8
|
+
data-method="play"
|
|
9
|
+
></i>
|
|
10
|
+
{% endif %}
|
|
11
|
+
</div>
|
simo/notifications/utils.py
CHANGED
|
@@ -33,7 +33,7 @@ def notify_users(severity, title, body=None, component=None, instance_users=None
|
|
|
33
33
|
severity=severity, body=body,
|
|
34
34
|
component=component
|
|
35
35
|
)
|
|
36
|
-
if
|
|
36
|
+
if instance_users is None:
|
|
37
37
|
instance_users = instance.instance_users.filter(
|
|
38
38
|
is_active=True
|
|
39
39
|
).select_related('user')
|
|
@@ -43,7 +43,7 @@ def notify_users(severity, title, body=None, component=None, instance_users=None
|
|
|
43
43
|
continue
|
|
44
44
|
if iuser.instance.id != instance.id:
|
|
45
45
|
continue
|
|
46
|
-
if
|
|
46
|
+
if not iuser.can_read(component):
|
|
47
47
|
continue
|
|
48
48
|
UserNotification.objects.create(
|
|
49
49
|
user=iuser.user, notification=notification,
|
simo/users/models.py
CHANGED
|
@@ -4,6 +4,7 @@ import subprocess
|
|
|
4
4
|
from django.urls import reverse
|
|
5
5
|
from django.utils.translation import gettext_lazy as _
|
|
6
6
|
from django.db import models
|
|
7
|
+
from django.db.models import Q
|
|
7
8
|
from django.db import transaction
|
|
8
9
|
from django.db.models.signals import post_save, post_delete, m2m_changed
|
|
9
10
|
from django.dispatch import receiver
|
|
@@ -129,6 +130,27 @@ class InstanceUser(DirtyFieldsMixin, models.Model, OnChangeMixin):
|
|
|
129
130
|
def get_instance(self):
|
|
130
131
|
return self.instance
|
|
131
132
|
|
|
133
|
+
def can_read(self, component):
|
|
134
|
+
if self.user.is_master:
|
|
135
|
+
return True
|
|
136
|
+
if self.role.is_superuser:
|
|
137
|
+
return True
|
|
138
|
+
return bool(
|
|
139
|
+
self.role.component_permissions.filter(component=component).filter(
|
|
140
|
+
Q(read=True) | Q(write=True)
|
|
141
|
+
).count())
|
|
142
|
+
|
|
143
|
+
def can_write(self, component):
|
|
144
|
+
if self.user.is_master:
|
|
145
|
+
return True
|
|
146
|
+
if self.role.is_superuser:
|
|
147
|
+
return True
|
|
148
|
+
return bool(
|
|
149
|
+
self.role.component_permissions.filter(
|
|
150
|
+
component=component, write=True
|
|
151
|
+
).count()
|
|
152
|
+
)
|
|
153
|
+
|
|
132
154
|
|
|
133
155
|
@receiver(post_save, sender=InstanceUser)
|
|
134
156
|
def post_instance_user_save(sender, instance, created, **kwargs):
|
|
@@ -75,12 +75,12 @@ simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ
|
|
|
75
75
|
simo/core/events.py,sha256=1_KIk5pJqdLPRQlCQ9xSyALst2Cn0b2lAEAJ3QjwIjE,4801
|
|
76
76
|
simo/core/filters.py,sha256=6wbn8C2WvKTTjtfMwwLBp2Fib1V0-DMpS4iqJd6jJQo,2540
|
|
77
77
|
simo/core/form_fields.py,sha256=m3dR31M31q3DQM-7P4jBOXLofm-PiC0ykIfUrpWhOjg,5007
|
|
78
|
-
simo/core/forms.py,sha256=
|
|
78
|
+
simo/core/forms.py,sha256=UGGsBU8qPFWf_NMGg6IvImloojhoU0sTX2jrJ9mJPjs,21748
|
|
79
79
|
simo/core/gateways.py,sha256=Y2BME6zSyeUq_e-hzEUF6gErCUCP6nFxedkLZKiLVOo,4141
|
|
80
80
|
simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
|
|
81
81
|
simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
|
|
82
82
|
simo/core/middleware.py,sha256=eUFf6iP-Snx_0TE3MoXsSwqrd5IjlukqZk2GQGStRCo,3385
|
|
83
|
-
simo/core/models.py,sha256
|
|
83
|
+
simo/core/models.py,sha256=-zhQEvQRqacTjdqL4Gv7shlP1Uo09Rj3vHKqNONlxWU,22716
|
|
84
84
|
simo/core/permissions.py,sha256=2YNRot2qoHjHKWPGOpO4PBseecctPbTlUQpepnFkCRs,3027
|
|
85
85
|
simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
|
|
86
86
|
simo/core/serializers.py,sha256=pa4F5fSvIxgGJWBEcXdzpmemRWl6QbUoUDMqQ_RdA2o,22514
|
|
@@ -10259,7 +10259,7 @@ simo/fleet/auto_urls.py,sha256=vrfrooPyY4pDuQjya-eLxCgZldfhwbEeEiXa7diO_CY,847
|
|
|
10259
10259
|
simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
|
|
10260
10260
|
simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
|
|
10261
10261
|
simo/fleet/controllers.py,sha256=PezfOT-1N_UONSsbyTXEIyGO6Po57KdEBRv4yzk_sw0,28605
|
|
10262
|
-
simo/fleet/forms.py,sha256=
|
|
10262
|
+
simo/fleet/forms.py,sha256=VcqATlX-omZruUgUC2fJpeLNUGSR-szmf36_M3aa5dg,66850
|
|
10263
10263
|
simo/fleet/gateways.py,sha256=C7dyapWDlJ5erYPNLkSoH50I8kj0lIXicSno0_CrdXc,5783
|
|
10264
10264
|
simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
|
|
10265
10265
|
simo/fleet/models.py,sha256=zPplx_v64nfKBmb-nCb74aCVtEeY3m3SjEy-VhbnydU,17511
|
|
@@ -10385,7 +10385,7 @@ simo/generic/forms.py,sha256=ikSwn6hg6m4XoaWyZNydw9e5aoFRHxbeM8tWsyYlen4,22993
|
|
|
10385
10385
|
simo/generic/gateways.py,sha256=SBQPlcU2oNCWzRQ1H1XWQ11O2E3zWDNImXlWNDzKg-Y,15865
|
|
10386
10386
|
simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
|
|
10387
10387
|
simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
|
|
10388
|
-
simo/generic/socket_consumers.py,sha256=
|
|
10388
|
+
simo/generic/socket_consumers.py,sha256=pyiqzfGxSKBNqfrfEJ_kCU0UbSC28XnvDn6QjKkbqyY,1767
|
|
10389
10389
|
simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
|
|
10390
10390
|
simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=D9b13pbMlirgHmjDnQhfLIDGSVINoSouHb4SWOeCRrs,1642
|
|
10391
10391
|
simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
|
|
@@ -10431,7 +10431,7 @@ simo/multimedia/admin.py,sha256=GgXiKTLfi3omjBurU-bKgneJRK-tAeiR8o2jo3zD7zs,1002
|
|
|
10431
10431
|
simo/multimedia/api.py,sha256=mZ5BTggWdc_kL8P70JGC3rTCiZKPnxWYoyNcAQkFnX4,285
|
|
10432
10432
|
simo/multimedia/app_widgets.py,sha256=g_IPx5bNmIS6JbaXXDCzYZYV2KVKAiYvWjH4oI30lWM,331
|
|
10433
10433
|
simo/multimedia/base_types.py,sha256=dAP7_uh_b3A03yXBJZyQdRFucKIro4_RkIZ5yOaWXVE,151
|
|
10434
|
-
simo/multimedia/controllers.py,sha256=
|
|
10434
|
+
simo/multimedia/controllers.py,sha256=A_kSKOVRJIiGvEl4CzpqjcWt4v-JsDQNQJ8ylrgplCc,3368
|
|
10435
10435
|
simo/multimedia/forms.py,sha256=oMCVUXRNiESrY3w_uBLRRgjMjx8BrmNeVglzorA9QtY,239
|
|
10436
10436
|
simo/multimedia/models.py,sha256=5aWGLWDdCkekGAOGZIdanvX1l6ULnhgJN4JAvDZT4nQ,734
|
|
10437
10437
|
simo/multimedia/requirements.txt,sha256=QeIhjf1RfNGCYn_WZm3VuinPI2wK31WEJPbCxRWxssY,28
|
|
@@ -10455,12 +10455,13 @@ simo/multimedia/migrations/__pycache__/0002_sound_length.cpython-38.pyc,sha256=5
|
|
|
10455
10455
|
simo/multimedia/migrations/__pycache__/0003_alter_sound_length.cpython-38.pyc,sha256=dkdqLx_cWLAxxVCUxuuAX39iTv7G5kG-PhJ40HsPzx8,669
|
|
10456
10456
|
simo/multimedia/migrations/__pycache__/0004_auto_20231023_1055.cpython-38.pyc,sha256=tX6x1gNeVcUHcCFvisP9Z2jPBE029TJG632fvtvUjV8,892
|
|
10457
10457
|
simo/multimedia/migrations/__pycache__/__init__.cpython-38.pyc,sha256=mCgSiQBphL85imdWyTi9-4zBDYF6HfXbhB0ycSPVVuA,175
|
|
10458
|
+
simo/multimedia/templates/admin/controller_widgets/player.html,sha256=v4PFoL37-C7L6ILZI6yF5ff9iO3EnEs5kXbRayaHy0s,358
|
|
10458
10459
|
simo/notifications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10459
10460
|
simo/notifications/admin.py,sha256=WQbN_bd2KRxVjbOajeworNrV9QlDNSadQT58La0Nn2M,1174
|
|
10460
10461
|
simo/notifications/api.py,sha256=QrfFn5kBU0vlqi8X368w1-0iTmDGu_hmMxLW2R0OTTg,1765
|
|
10461
10462
|
simo/notifications/models.py,sha256=QGDLGAi5gk8OTcvd7ho5WNdctDymWGmGF1ZqN4-G_ZA,2443
|
|
10462
10463
|
simo/notifications/serializers.py,sha256=altDEAPWwOhxRcEzE9-34jL8EFpyf3vPoEdAPoVLfGc,523
|
|
10463
|
-
simo/notifications/utils.py,sha256=
|
|
10464
|
+
simo/notifications/utils.py,sha256=k-dtvgPDuNB5T_PDPBA3NhQN_xZoIgRUGHQkBy1EGMg,2034
|
|
10464
10465
|
simo/notifications/__pycache__/__init__.cpython-38.pyc,sha256=YvucUfu98XFvEEg1LYFMlOZJpo_jSGxTVrM-ylAFLOg,167
|
|
10465
10466
|
simo/notifications/__pycache__/admin.cpython-38.pyc,sha256=MScNrtVM1wavefsPfxy0A7LVyXKcbvEkLH9GJkgNOl8,1945
|
|
10466
10467
|
simo/notifications/__pycache__/api.cpython-38.pyc,sha256=eQmCHwTnr4zQ3ZY_SKZVCryiSEnzmyIjHQM13pZ5LT0,2071
|
|
@@ -10484,7 +10485,7 @@ simo/users/auto_urls.py,sha256=RSUW3ai5LbMTknS8M7M5aOnG_YlFOVQrnNVNH-fkwlg,357
|
|
|
10484
10485
|
simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
|
|
10485
10486
|
simo/users/managers.py,sha256=OHgEP85MBtdkdYxdstBd8RavTBT8F_2WyDxUJ9aCqqM,246
|
|
10486
10487
|
simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
|
|
10487
|
-
simo/users/models.py,sha256=
|
|
10488
|
+
simo/users/models.py,sha256=qTlhML4zRfL_Gcomblc09GU1xWDa4DOwbFaxCgd_rsE,20563
|
|
10488
10489
|
simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
|
|
10489
10490
|
simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
|
|
10490
10491
|
simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
|
|
@@ -10607,9 +10608,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10607
10608
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10608
10609
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10609
10610
|
simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10610
|
-
simo-2.7.
|
|
10611
|
-
simo-2.7.
|
|
10612
|
-
simo-2.7.
|
|
10613
|
-
simo-2.7.
|
|
10614
|
-
simo-2.7.
|
|
10615
|
-
simo-2.7.
|
|
10611
|
+
simo-2.7.10.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10612
|
+
simo-2.7.10.dist-info/METADATA,sha256=FMpBbEAAJ0ZOZX4tmR9O9f-8ytqI4l4BHTCYUWAELbA,1953
|
|
10613
|
+
simo-2.7.10.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
|
10614
|
+
simo-2.7.10.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
|
|
10615
|
+
simo-2.7.10.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10616
|
+
simo-2.7.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|