copyparty 1.10.1__py3-none-any.whl → 1.10.2__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.
copyparty/__version__.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 10, 1)
3
+ VERSION = (1, 10, 2)
4
4
  CODENAME = "tftp"
5
- BUILD_DT = (2024, 2, 18)
5
+ BUILD_DT = (2024, 2, 21)
6
6
 
7
7
  S_VERSION = ".".join(map(str, VERSION))
8
8
  S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
copyparty/ftpd.py CHANGED
@@ -20,6 +20,7 @@ from .authsrv import VFS
20
20
  from .bos import bos
21
21
  from .util import (
22
22
  Daemon,
23
+ ODict,
23
24
  Pebkac,
24
25
  exclude_dotfiles,
25
26
  fsenc,
@@ -540,6 +541,8 @@ class Ftpd(object):
540
541
  if self.args.ftp4:
541
542
  ips = [x for x in ips if ":" not in x]
542
543
 
544
+ ips = list(ODict.fromkeys(ips)) # dedup
545
+
543
546
  ioloop = IOLoop()
544
547
  for ip in ips:
545
548
  for h, lp in hs:
copyparty/httpcli.py CHANGED
@@ -3135,11 +3135,15 @@ class HttpCli(object):
3135
3135
 
3136
3136
  ext = ext.rstrip(".") or "unk"
3137
3137
  if len(ext) > 11:
3138
- ext = "" + ext[-9:]
3138
+ ext = "~" + ext[-9:]
3139
3139
 
3140
+ return self.tx_svg(ext, exact)
3141
+
3142
+ def tx_svg(self, txt , small = False) :
3140
3143
  # chrome cannot handle more than ~2000 unique SVGs
3141
- chrome = " rv:" not in self.ua
3142
- mime, ico = self.ico.get(ext, not exact, chrome)
3144
+ # so url-param "raster" returns a png/webp instead
3145
+ # (useragent-sniffing kinshi due to caching proxies)
3146
+ mime, ico = self.ico.get(txt, not small, "raster" in self.uparam)
3143
3147
 
3144
3148
  lm = formatdate(self.E.t0, usegmt=True)
3145
3149
  self.reply(ico, mime=mime, headers={"Last-Modified": lm})
@@ -3403,6 +3407,9 @@ class HttpCli(object):
3403
3407
  self.reply(pt.encode("utf-8"), status=rc)
3404
3408
  return True
3405
3409
 
3410
+ if "th" in self.ouparam:
3411
+ return self.tx_svg("e" + pt[:3])
3412
+
3406
3413
  t = t.format(self.args.SR)
3407
3414
  qv = quotep(self.vpaths) + self.ourlq()
3408
3415
  html = self.j2s("splash", this=self, qvpath=qv, msg=t)
@@ -3783,12 +3790,15 @@ class HttpCli(object):
3783
3790
  if idx and hasattr(idx, "p_end"):
3784
3791
  icur = idx.get_cur(dbv.realpath)
3785
3792
 
3793
+ th_fmt = self.uparam.get("th")
3786
3794
  if self.can_read:
3787
- th_fmt = self.uparam.get("th")
3788
3795
  if th_fmt is not None:
3796
+ nothumb = "dthumb" in dbv.flags
3789
3797
  if is_dir:
3790
3798
  vrem = vrem.rstrip("/")
3791
- if icur and vrem:
3799
+ if nothumb:
3800
+ pass
3801
+ elif icur and vrem:
3792
3802
  q = "select fn from cv where rd=? and dn=?"
3793
3803
  crd, cdn = vrem.rsplit("/", 1) if "/" in vrem else ("", vrem)
3794
3804
  # no mojibake support:
@@ -3811,10 +3821,10 @@ class HttpCli(object):
3811
3821
  break
3812
3822
 
3813
3823
  if is_dir:
3814
- return self.tx_ico("a.folder")
3824
+ return self.tx_svg("folder")
3815
3825
 
3816
3826
  thp = None
3817
- if self.thumbcli:
3827
+ if self.thumbcli and not nothumb:
3818
3828
  thp = self.thumbcli.get(dbv, vrem, int(st.st_mtime), th_fmt)
3819
3829
 
3820
3830
  if thp:
@@ -3825,6 +3835,9 @@ class HttpCli(object):
3825
3835
 
3826
3836
  return self.tx_ico(rem)
3827
3837
 
3838
+ elif self.can_write and th_fmt is not None:
3839
+ return self.tx_svg("upload\nonly")
3840
+
3828
3841
  elif self.can_get and self.avn:
3829
3842
  axs = self.avn.axs
3830
3843
  if self.uname not in axs.uhtml:
copyparty/ico.py CHANGED
@@ -8,7 +8,7 @@ import re
8
8
 
9
9
  from .__init__ import PY2
10
10
  from .th_srv import HAVE_PIL, HAVE_PILF
11
- from .util import BytesIO # type: ignore
11
+ from .util import BytesIO, html_escape # type: ignore
12
12
 
13
13
 
14
14
  class Ico(object):
@@ -31,10 +31,9 @@ class Ico(object):
31
31
 
32
32
  w = 100
33
33
  h = 30
34
- if "n" in self.args.th_crop and as_thumb:
34
+ if as_thumb:
35
35
  sw, sh = self.args.th_size.split("x")
36
36
  h = int(100.0 / (float(sw) / float(sh)))
37
- w = 100
38
37
 
39
38
  if chrome:
40
39
  # cannot handle more than ~2000 unique SVGs
@@ -99,6 +98,6 @@ class Ico(object):
99
98
  fill="#{}" font-family="monospace" font-size="14px" style="letter-spacing:.5px">{}</text>
100
99
  </g></svg>
101
100
  """
102
- svg = svg.format(h, c[:6], c[6:], ext)
101
+ svg = svg.format(h, c[:6], c[6:], html_escape(ext, True))
103
102
 
104
103
  return "image/svg+xml", svg.encode("utf-8")
copyparty/tftpd.py CHANGED
@@ -36,7 +36,7 @@ from partftpy.TftpShared import TftpException
36
36
  from .__init__ import EXE, TYPE_CHECKING
37
37
  from .authsrv import VFS
38
38
  from .bos import bos
39
- from .util import BytesIO, Daemon, exclude_dotfiles, min_ex, runhook, undot
39
+ from .util import BytesIO, Daemon, ODict, exclude_dotfiles, min_ex, runhook, undot
40
40
 
41
41
  if TYPE_CHECKING:
42
42
  from .svchub import SvcHub
@@ -166,6 +166,8 @@ class Tftpd(object):
166
166
  if self.args.ftp4:
167
167
  ips = [x for x in ips if ":" not in x]
168
168
 
169
+ ips = list(ODict.fromkeys(ips)) # dedup
170
+
169
171
  for ip in ips:
170
172
  name = "tftp_%s" % (ip,)
171
173
  Daemon(self._start, name, [ip, ports])
@@ -176,18 +178,54 @@ class Tftpd(object):
176
178
 
177
179
  def _start(self, ip, ports):
178
180
  fam = socket.AF_INET6 if ":" in ip else socket.AF_INET
179
- srv = TftpServer.TftpServer("/", self._ls)
180
- with self.mutex:
181
- self.srv.append(srv)
182
- self.ips.append(ip)
183
- try:
184
- srv.listen(ip, self.port, af_family=fam, ports=ports)
185
- except OSError:
181
+ have_been_alive = False
182
+ while True:
183
+ srv = TftpServer.TftpServer("/", self._ls)
186
184
  with self.mutex:
187
- self.srv.remove(srv)
188
- self.ips.remove(ip)
189
- if ip != "0.0.0.0" or "::" not in self.ips:
190
- raise
185
+ self.srv.append(srv)
186
+ self.ips.append(ip)
187
+
188
+ try:
189
+ # this is the listen loop; it should block forever
190
+ srv.listen(ip, self.port, af_family=fam, ports=ports)
191
+ except:
192
+ with self.mutex:
193
+ self.srv.remove(srv)
194
+ self.ips.remove(ip)
195
+
196
+ try:
197
+ srv.sock.close()
198
+ except:
199
+ pass
200
+
201
+ try:
202
+ bound = bool(srv.listenport)
203
+ except:
204
+ bound = False
205
+
206
+ if bound:
207
+ # this instance has managed to bind at least once
208
+ have_been_alive = True
209
+
210
+ if have_been_alive:
211
+ t = "tftp server [%s]:%d crashed; restarting in 3 sec:\n%s"
212
+ error(t, ip, self.port, min_ex())
213
+ time.sleep(3)
214
+ continue
215
+
216
+ # server failed to start; could be due to dualstack (ipv6 managed to bind and this is ipv4)
217
+ if ip != "0.0.0.0" or "::" not in self.ips:
218
+ # nope, it's fatal
219
+ t = "tftp server [%s]:%d failed to start:\n%s"
220
+ error(t, ip, self.port, min_ex())
221
+
222
+ # yep; ignore
223
+ # (TODO: move the "listening @ ..." infolog in partftpy to
224
+ # after the bind attempt so it doesn't print twice)
225
+ return
226
+
227
+ info("tftp server [%s]:%d terminated", ip, self.port)
228
+ break
191
229
 
192
230
  def stop(self):
193
231
  with self.mutex:
Binary file
@@ -161,3 +161,4 @@
161
161
  </body>
162
162
 
163
163
  </html>
164
+
Binary file
@@ -61,3 +61,4 @@
61
61
 
62
62
  </body>
63
63
  </html>
64
+
copyparty/web/cf.html CHANGED
@@ -25,3 +25,4 @@
25
25
  </body>
26
26
 
27
27
  </html>
28
+
Binary file
copyparty/web/md.html CHANGED
@@ -160,3 +160,4 @@ try { l.light = drk? 0:1; } catch (ex) { }
160
160
  <script src="{{ r }}/.cpr/md2.js?_={{ ts }}"></script>
161
161
  {%- endif %}
162
162
  </body></html>
163
+
copyparty/web/mde.html CHANGED
@@ -54,3 +54,4 @@ try { l.light = drk? 0:1; } catch (ex) { }
54
54
  <script src="{{ r }}/.cpr/deps/easymde.js?_={{ ts }}"></script>
55
55
  <script src="{{ r }}/.cpr/mde.js?_={{ ts }}"></script>
56
56
  </body></html>
57
+
copyparty/web/msg.html CHANGED
@@ -48,4 +48,5 @@
48
48
  {%- endif %}
49
49
  </body>
50
50
 
51
- </html>
51
+ </html>
52
+
copyparty/web/splash.html CHANGED
@@ -118,3 +118,4 @@ document.documentElement.className = (STG && STG.cpp_thm) || "{{ this.args.theme
118
118
  <script src="{{ r }}/.cpr/splash.js?_={{ ts }}"></script>
119
119
  </body>
120
120
  </html>
121
+
copyparty/web/svcs.html CHANGED
@@ -246,3 +246,4 @@ document.documentElement.className = (STG && STG.cpp_thm) || "{{ args.theme }}";
246
246
  <script src="{{ r }}/.cpr/svcs.js?_={{ ts }}"></script>
247
247
  </body>
248
248
  </html>
249
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: copyparty
3
- Version: 1.10.1
3
+ Version: 1.10.2
4
4
  Summary: Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
5
5
  Author-email: ed <copyparty@ocv.me>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  copyparty/__init__.py,sha256=34xcU8AoRRQscgVSx2gC6DeUyu7ZLmEVlXjttdQgXnI,1752
2
2
  copyparty/__main__.py,sha256=wK7Fop32aq7LUKmBCQcp3A6bJ2abdpj3em9IigFyniI,91595
3
- copyparty/__version__.py,sha256=Yf9rAPI4EWShbqAGltVRunB7inrUrDMybrzWdRaWf-0,246
3
+ copyparty/__version__.py,sha256=z7G2R3a_jwf2rpKu1PpKRwOFSv86M6MOa1nRTzu_t9I,246
4
4
  copyparty/authsrv.py,sha256=BzJwPbYhTr9etW50DMY0UXRHBdNOKdnSdTuZ4qXlNvs,73470
5
5
  copyparty/broker_mp.py,sha256=4mEZC5tiHUazJMgYuwInNo2dxS7jrbzrGb1qs2UBt9k,3948
6
6
  copyparty/broker_mpw.py,sha256=4ZI7bJYOwUibeAJVv9_FPGNmHrr9eOtkj_Kz0JEppTU,3197
@@ -10,11 +10,11 @@ copyparty/cert.py,sha256=bt1n-629-Gtez1C_CroXq53gXEmUsVjkTbkQ6Gu2Zfc,7323
10
10
  copyparty/cfg.py,sha256=XMqgS5JMcTe4vCmAnUkSXrKBPTzn0zHYsBenXcZNK_s,9000
11
11
  copyparty/dxml.py,sha256=lZpg-kn-kQsXRtNY1n6fRaS-b7uXzMCyv8ovKnhZcZc,1548
12
12
  copyparty/fsutil.py,sha256=c4fTvmclKbVABNsjU4rGddsjCgRwi9YExAyo-06ATc8,3932
13
- copyparty/ftpd.py,sha256=wBoNl-DBMXJhP5irFKEFisMg10vouB5-VA9c6Juy1tI,15878
14
- copyparty/httpcli.py,sha256=wjVzOIstXy7bqjYWc2O7yxLRX3kdnZ7ki4vs9wOCtmQ,141841
13
+ copyparty/ftpd.py,sha256=BqxH4j-mLrjRvxW3Lnz-qrR4_ETv3OnmIRNifSf_3Fk,15939
14
+ copyparty/httpcli.py,sha256=YoumInsa3mzoJXQHjznsPpDYuKuzx0DoLXgx6vy8Oew,142323
15
15
  copyparty/httpconn.py,sha256=XyFv6yIsyq0InrqulwovsmAcqziEq_O2zsI41K8bJWs,6698
16
16
  copyparty/httpsrv.py,sha256=q0z4RuoTMiZz_QbUSCFikIDbKHm9_JT1uGTGuDvOdO0,16218
17
- copyparty/ico.py,sha256=NLWrgXwNPFHx30l8NOS5RaK-YSTntvAtQG31-bDwmLc,3562
17
+ copyparty/ico.py,sha256=AYHdK6NlYBfBgafVYXia3jHQ9XHZdUL1D8WftLMAzIU,3545
18
18
  copyparty/mdns.py,sha256=CcraggbDxTT1ntYzD8Ebgqmw5Q4HkyZcfh5ymtCV_ak,17469
19
19
  copyparty/metrics.py,sha256=glBeNYGWMF4zEK9__aKks7qKnSwwJuWAzPx6ljRYt4k,8754
20
20
  copyparty/mtag.py,sha256=OZM6cVJafOe_LZ4bPJzVJbORA_omzewwJh-N11u3nak,16855
@@ -27,7 +27,7 @@ copyparty/sutil.py,sha256=dZhDAzVAp02i6YmGqcedy4LaYVffnJCSp3F6WEwfz7c,2967
27
27
  copyparty/svchub.py,sha256=LyhbfI4pYga-X7VSsbyzx3xM5kn2e4Z6bSObU4cRU0w,29036
28
28
  copyparty/szip.py,sha256=SJg5nzN_5oaIsIYXlRvcLHVTqngLAOPfe4_WVsuhSkw,8520
29
29
  copyparty/tcpsrv.py,sha256=2LGUqOBAIrsmL-1pwrbsPXR71gutHccqRp-hjzt91Us,17289
30
- copyparty/tftpd.py,sha256=ljT5AE1Uc88ZxqQjnvWnff9ELOTcM3E_Hj2EozL10qc,11673
30
+ copyparty/tftpd.py,sha256=yM_byDfFI2c7TwgDbTtw9xt3LWJ3PBBHfIsMsB6MDow,13028
31
31
  copyparty/th_cli.py,sha256=e2FF-wVY4qcwAO8hrtTlwn3EJIOHyZt5sYhl0N8eudk,4378
32
32
  copyparty/th_srv.py,sha256=HBw6mq0RrJkAJupJpwFAjCMNS67Y9hda6sv7gFSzRwk,25764
33
33
  copyparty/u2idx.py,sha256=JBEqKX1ZM8GIvQrDYb5VQ_5QiFNFsjWF6H9drHlPVEY,12709
@@ -55,26 +55,26 @@ copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUu
55
55
  copyparty/stolen/ifaddr/_shared.py,sha256=cJACl8cOxQ-HSYphZTzKMAjAx_TAFyJwUPjfD102Xqw,6111
56
56
  copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
57
57
  copyparty/web/baguettebox.js.gz,sha256=BxwvSjky72hZprWofueRrlskiIeRrgGERUpKiZXQ5C8,7671
58
- copyparty/web/browser.css.gz,sha256=b8Ua3XIWFKP59iLsAz7aj8dMziBfg9GjKJuYAHLR0ns,11359
59
- copyparty/web/browser.html,sha256=pIkjj1J5vY-yy4_BsN0gZrBHiooEeLcMIeqnvcIotoY,4872
60
- copyparty/web/browser.js.gz,sha256=Ji72MRytc-wbp6Ly4EHx_xUv7Sr5-67YVbPJZDDcY9I,66518
61
- copyparty/web/browser2.html,sha256=3kR3QiDXYqtAo7gOoBtdTP3eRvibUCZHVVAbmAfaAVU,1604
62
- copyparty/web/cf.html,sha256=_tgwgNtK5MpjvvthGXx6Q9sasDaiWruyZfXsXYVW2KA,588
58
+ copyparty/web/browser.css.gz,sha256=_C5z5xYMkKGnwT_y_dmQzbQBkXbYn6h0KWGdiMv_7yQ,11380
59
+ copyparty/web/browser.html,sha256=72E2Q6grz_MtkmFVIXE_0rOVzliyQo-XwuawkJsB-qY,4873
60
+ copyparty/web/browser.js.gz,sha256=NdOb9VBrO_ETpDt6LBhoUPPhiehYEckDCzVZndfpmG0,66579
61
+ copyparty/web/browser2.html,sha256=AtGRGtb_rsyu-gWXEuXDMg9WqbjJFcDDJXel3ScG-4c,1605
62
+ copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
63
63
  copyparty/web/dbg-audio.js.gz,sha256=Ma-KZtK8LnmiwNvNKFKXMPYl_Nn_3U7GsJ6-DRWC2HE,688
64
64
  copyparty/web/md.css.gz,sha256=DadSn01UeCBE47AKqCjmrc7x2ZLZMwl4f__RhGCDzS4,2011
65
- copyparty/web/md.html,sha256=Wv7QgWgOH4q_i1g89YaNNQO9SQ7xfbIAgqTp4FlI1vM,4109
65
+ copyparty/web/md.html,sha256=QdrN1-58IgdXj6QnT9w3_nbT825A6UWknj6WOKxn69I,4110
66
66
  copyparty/web/md.js.gz,sha256=7uNDAB8ctTLm4vr3ui-hfqusn7rORDOJfydonOFEWCU,4277
67
67
  copyparty/web/md2.css.gz,sha256=bM_1hsegXnEig1b6OQ28yWWUlMPje6u9M58VZ1Z-C9g,681
68
68
  copyparty/web/md2.js.gz,sha256=P47IdvqfOaDSnAxKk-0K8au9yUkH3be6t4YZ8AosDtI,8343
69
69
  copyparty/web/mde.css.gz,sha256=L6YhxnYBoqT5bSwD99rx8ALXDh8d_1-sCvbc_p3MoAU,929
70
- copyparty/web/mde.html,sha256=VOvill4xAy7B5ZC_m-z4Xwu5_y_Ta4J7GzzxAE7dMJ8,1677
70
+ copyparty/web/mde.html,sha256=1KPTKGFxTTuJ9Zp9OBdmm1DREtSvijqnlsZoNTpv7q0,1678
71
71
  copyparty/web/mde.js.gz,sha256=eo-UjMKIbRcPL6LR8BDl4IkCGcpJyFK0mhYte7WgqLc,2219
72
72
  copyparty/web/msg.css.gz,sha256=-wOmwxU0_Xg2W53rIAjKA2TeFAVQNJeT8ZMtmiJiviY,252
73
- copyparty/web/msg.html,sha256=V-X8PDeu64itAYijLjXTKJJzXylLxFVrJXdh-XM9-50,894
73
+ copyparty/web/msg.html,sha256=-MPzXZnHzQNuX04-aSn_fA7L15GASOHnCyeS1eVCYUI,896
74
74
  copyparty/web/splash.css.gz,sha256=ZJ1E7wWGYBVl50ytkxdYkLsLDhRJtGwP2-YdMUo7MgI,927
75
- copyparty/web/splash.html,sha256=eYBC4h23RSGQMYoFYAIn3hwr-fycqM86hhC9kt85LMM,3781
75
+ copyparty/web/splash.html,sha256=4ZgHc7v1C9ABwzde4UvlsyTCtkmIwKVMXm-3rHcFXsM,3782
76
76
  copyparty/web/splash.js.gz,sha256=3PMKsMLwEsHP8eonBmtvonm9yeNq69xjMi8ZqnVeKcA,1255
77
- copyparty/web/svcs.html,sha256=xwxvs7Fad8h9xn7xe3D7_zbR-GF-sMRyDgPi2m5yOiA,11701
77
+ copyparty/web/svcs.html,sha256=Jn-G2QMF09oc01C_tmJwGZAdjFzbeu4unLSs6dowluM,11702
78
78
  copyparty/web/svcs.js.gz,sha256=k81ZvZ3I-f4fMHKrNGGOgOlvXnCBz0mVjD-8mieoWCA,520
79
79
  copyparty/web/ui.css.gz,sha256=oyrc_sf0u-KycOUV7FoRI7uF6oK6ruQ13Qzyz-7rad8,2567
80
80
  copyparty/web/up2k.js.gz,sha256=mT9u6jZFWjTTVgNodHrMvmuQ-sp7N4S6AtJHlrbOqoE,22027
@@ -90,7 +90,7 @@ copyparty/web/dd/4.png,sha256=fIwEVmtZNZtloZuVEKPKnkx3SELwRJmB3US61y7t2lI,248
90
90
  copyparty/web/dd/5.png,sha256=Lfpu8-yOlhONuoMbygloKqQVPXSm9gjxH2gUYn5QQAE,250
91
91
  copyparty/web/dd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  copyparty/web/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- copyparty/web/deps/marked.js.gz,sha256=jS4XXdh9KkF-isrI_nObhQOhQnlnnYZd90xzuRoeenI,22376
93
+ copyparty/web/deps/marked.js.gz,sha256=WhUw0LPWs5cxqORQmW-zajQiUc5rSRkcvf3eT3-XSZc,22372
94
94
  copyparty/web/deps/mini-fa.css.gz,sha256=CTPrNaH8OTVmxajrGP88E2MkjadY9_81TBVnd9sw9Y8,572
95
95
  copyparty/web/deps/mini-fa.woff,sha256=L9DNncV2TIyvsrspMbJouvnnt7F068Hbn7YZYvN76AU,2784
96
96
  copyparty/web/deps/prism.css.gz,sha256=Z_A6rJ3MN5KWnjvXaV787aTW_5DT-xjFd0YZ7_W-Krk,1468
@@ -99,9 +99,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
99
99
  copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
100
100
  copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
101
101
  copyparty/web/deps/sha512.hw.js.gz,sha256=vqoXeracj-99Z5MfY3jK2N4WiSzYQdfjy0RnUlQDhSU,8110
102
- copyparty-1.10.1.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
103
- copyparty-1.10.1.dist-info/METADATA,sha256=qyBDrdFsyK6XUgSIXmiQZo3oTmEbCoKSHU2jgibety0,112378
104
- copyparty-1.10.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
105
- copyparty-1.10.1.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
106
- copyparty-1.10.1.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
107
- copyparty-1.10.1.dist-info/RECORD,,
102
+ copyparty-1.10.2.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
103
+ copyparty-1.10.2.dist-info/METADATA,sha256=VztHHVGSLDK0ZRVxlGhBN2WuBCO3fpz6rbK0iVROAYY,112378
104
+ copyparty-1.10.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
105
+ copyparty-1.10.2.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
106
+ copyparty-1.10.2.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
107
+ copyparty-1.10.2.dist-info/RECORD,,