fastled 1.2.75__py3-none-any.whl → 1.2.77__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.
fastled/__init__.py CHANGED
@@ -7,17 +7,14 @@ from typing import Generator
7
7
 
8
8
  from .compile_server import CompileServer
9
9
  from .live_client import LiveClient
10
+ from .settings import DOCKER_FILE, IMAGE_NAME
10
11
  from .site.build import build
11
12
  from .types import BuildMode, CompileResult, CompileServerError
12
13
 
13
14
  # IMPORTANT! There's a bug in github which will REJECT any version update
14
15
  # that has any other change in the repo. Please bump the version as the
15
16
  # ONLY change in a commit, or else the pypi update and the release will fail.
16
- __version__ = "1.2.75"
17
-
18
- DOCKER_FILE = (
19
- "https://raw.githubusercontent.com/zackees/fastled-wasm/refs/heads/main/Dockerfile"
20
- )
17
+ __version__ = "1.2.77"
21
18
 
22
19
 
23
20
  class Api:
@@ -154,7 +151,6 @@ class Docker:
154
151
  @staticmethod
155
152
  def purge() -> None:
156
153
  from fastled.docker_manager import DockerManager
157
- from fastled.settings import IMAGE_NAME
158
154
 
159
155
  docker_mgr = DockerManager()
160
156
  docker_mgr.purge(image_name=IMAGE_NAME)
@@ -217,4 +213,5 @@ __all__ = [
217
213
  "CompileResult",
218
214
  "CompileServerError",
219
215
  "BuildMode",
216
+ "DOCKER_FILE",
220
217
  ]
fastled/app.py CHANGED
@@ -68,19 +68,37 @@ def main() -> int:
68
68
  print("Building is disabled")
69
69
  build = False
70
70
 
71
- if build:
72
- raise NotImplementedError("Building is not yet supported.")
71
+ if interactive:
72
+ # raise NotImplementedError("Building is not yet supported.")
73
73
  file_watcher_set(False)
74
- project_root = Path(".").absolute()
75
- print(f"Building Docker image at {project_root}")
76
- from fastled import Api, Docker
77
-
78
- server = Docker.spawn_server_from_fastled_repo(
79
- project_root=project_root,
74
+ # project_root = Path(".").absolute()
75
+ # print(f"Building Docker image at {project_root}")
76
+ from fastled import Api
77
+
78
+ # server = Docker.spawn_server_from_fastled_repo(
79
+ # project_root=project_root,
80
+ # interactive=interactive,
81
+ # sketch_folder=directory,
82
+ # )
83
+ # assert isinstance(server, CompileServer)
84
+ server: CompileServer = CompileServer(
80
85
  interactive=interactive,
81
- sketch_folder=directory,
86
+ auto_updates=False,
87
+ mapped_dir=directory,
88
+ auto_start=False,
89
+ remove_previous=False,
82
90
  )
83
- assert isinstance(server, CompileServer)
91
+
92
+ server.start(wait_for_startup=False)
93
+
94
+ try:
95
+ while server.process_running():
96
+ # wait for ctrl-c
97
+ time.sleep(0.1)
98
+ except KeyboardInterrupt:
99
+ print("\nExiting from server...")
100
+ server.stop()
101
+ return 0
84
102
 
85
103
  try:
86
104
  if interactive:
@@ -0,0 +1,21 @@
1
+ import sys
2
+
3
+ from fastled.app import main as app_main
4
+
5
+ if __name__ == "__main__":
6
+ # Note that the entry point for the exe is in cli.py
7
+ try:
8
+ import os
9
+
10
+ os.chdir("../fastled")
11
+ # sys.argv.append("--server")
12
+ # sys.argv.append("--local")
13
+ sys.argv.append("examples/FxWave2d")
14
+ sys.argv.append("-i")
15
+ sys.exit(app_main())
16
+ except KeyboardInterrupt:
17
+ print("\nExiting from main...")
18
+ sys.exit(1)
19
+ except Exception as e:
20
+ print(f"Error: {e}")
21
+ sys.exit(1)
@@ -37,6 +37,32 @@ def _try_get_fastled_src(path: Path) -> Path | None:
37
37
  return None
38
38
 
39
39
 
40
+ def _port_is_free(port: int) -> bool:
41
+ """Check if a port is free."""
42
+ import socket
43
+
44
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
45
+ try:
46
+ sock.bind(("localhost", port)) and sock.bind(("0.0.0.0", port))
47
+ return True
48
+ except OSError:
49
+ return False
50
+
51
+
52
+ def _find_free_port() -> int:
53
+ """Find a free port on the system."""
54
+
55
+ start_port = 49152
56
+ tries = 10
57
+
58
+ for port in range(start_port, start_port + tries):
59
+ if _port_is_free(port):
60
+ return port
61
+ raise RuntimeError(
62
+ f"No free port found in the range {start_port}-{start_port + tries - 1}"
63
+ )
64
+
65
+
40
66
  class CompileServerImpl:
41
67
  def __init__(
42
68
  self,
@@ -202,6 +228,7 @@ class CompileServerImpl:
202
228
  image_name=IMAGE_NAME, tag="latest", upgrade=upgrade
203
229
  )
204
230
  DISK_CACHE.put("last-update", now_str)
231
+ CLIENT_PORT = 80 # TODO: Don't use port 80.
205
232
 
206
233
  print("Docker image now validated")
207
234
  port = SERVER_PORT
@@ -209,7 +236,11 @@ class CompileServerImpl:
209
236
  server_command = ["/bin/bash"]
210
237
  else:
211
238
  server_command = ["python", "/js/run.py", "server"] + SERVER_OPTIONS
212
- ports = {80: port}
239
+ if self.interactive:
240
+ print("Disabling port forwarding in interactive mode")
241
+ ports = {}
242
+ else:
243
+ ports = {CLIENT_PORT: port}
213
244
  volumes = []
214
245
  if self.fastled_src_dir:
215
246
  print(
@@ -269,6 +300,13 @@ class CompileServerImpl:
269
300
  print("Compile server starting")
270
301
  return port
271
302
  else:
303
+ client_port_mapped = CLIENT_PORT in ports
304
+ port_is_free = _port_is_free(CLIENT_PORT)
305
+ if client_port_mapped and port_is_free:
306
+ warnings.warn(
307
+ f"Can't expose port {CLIENT_PORT}, disabling port forwarding in interactive mode"
308
+ )
309
+ ports = {}
272
310
  self.docker.run_container_interactive(
273
311
  image_name=IMAGE_NAME,
274
312
  tag="latest",
fastled/docker_manager.py CHANGED
@@ -25,7 +25,7 @@ from docker.models.containers import Container
25
25
  from docker.models.images import Image
26
26
  from filelock import FileLock
27
27
 
28
- from fastled.print_filter import PrintFilter
28
+ from fastled.print_filter import PrintFilter, PrintFilterFastled
29
29
  from fastled.spinner import Spinner
30
30
 
31
31
  CONFIG_DIR = Path(user_data_dir("fastled", "fastled"))
@@ -103,7 +103,7 @@ class Volume:
103
103
  # Override the default PrintFilter to use a custom one.
104
104
  def make_default_print_filter() -> PrintFilter:
105
105
  """Create a default PrintFilter instance."""
106
- return PrintFilter()
106
+ return PrintFilterFastled()
107
107
 
108
108
 
109
109
  class RunningContainer:
fastled/parse_args.py CHANGED
@@ -24,10 +24,37 @@ def _find_fastled_repo(start: Path) -> Path | None:
24
24
  return None
25
25
 
26
26
 
27
+ _DEFAULT_HELP_TEXT = """
28
+ FastLED WASM Compiler - Useful options:
29
+ <directory> Directory containing the FastLED sketch to compile
30
+ --init [example] Initialize one of the top tier WASM examples
31
+ --web [url] Use web compiler
32
+ --server Run the compiler server
33
+ --debug Build with debug symbols for dev-tools debugging
34
+ --quick Build in quick mode (default)
35
+ --release Build in optimized release mode
36
+ --profile Enable profiling the C++ build system
37
+ --update Update the docker image for the wasm compiler
38
+ --purge Remove all FastLED containers and images
39
+ --version Show version information
40
+ --help Show detailed help
41
+ Examples:
42
+ fastled (will auto detect the sketch directory and prompt you)
43
+ fastled my_sketch
44
+ fastled my_sketch --web (compiles using the web compiler only)
45
+ fastled --init Blink (initializes a new sketch directory with the Blink example)
46
+ fastled --server (runs the compiler server in the current directory)
47
+ """
48
+
49
+
27
50
  def parse_args() -> Args:
28
51
  """Parse command-line arguments."""
29
52
  from fastled import __version__
30
53
 
54
+ # Check if no arguments were provided
55
+ if len(sys.argv) == 1:
56
+ print(_DEFAULT_HELP_TEXT)
57
+
31
58
  parser = argparse.ArgumentParser(description=f"FastLED WASM Compiler {__version__}")
32
59
  parser.add_argument("--version", action="version", version=f"{__version__}")
33
60
  parser.add_argument(
fastled/print_filter.py CHANGED
@@ -1,4 +1,26 @@
1
1
  import re
2
+ from abc import ABC, abstractmethod
3
+
4
+
5
+ class PrintFilter(ABC):
6
+ """Abstract base class for filtering text output."""
7
+
8
+ def __init__(self, echo: bool = True) -> None:
9
+ self.echo = echo
10
+
11
+ @abstractmethod
12
+ def filter(self, text: str) -> str:
13
+ """Filter the text according to implementation-specific rules."""
14
+ pass
15
+
16
+ def print(self, text: str | bytes) -> str:
17
+ """Prints the text to the console after filtering."""
18
+ if isinstance(text, bytes):
19
+ text = text.decode("utf-8")
20
+ text = self.filter(text)
21
+ if self.echo:
22
+ print(text, end="")
23
+ return text
2
24
 
3
25
 
4
26
  def _handle_ino_cpp(line: str) -> str:
@@ -17,31 +39,37 @@ def _handle_ino_cpp(line: str) -> str:
17
39
  return line
18
40
 
19
41
 
20
- class PrintFilter:
21
- """Provides filtering for text output so that source files match up with local names."""
42
+ def _handle_fastled_src(line: str) -> str:
43
+ return line.replace("fastled/src", "src")
44
+
45
+
46
+ class PrintFilterDefault(PrintFilter):
47
+ """Provides default filtering for FastLED output."""
48
+
49
+ def filter(self, text: str) -> str:
50
+ return text
51
+
52
+
53
+ class PrintFilterFastled(PrintFilter):
54
+ """Provides filtering for FastLED output so that source files match up with local names."""
22
55
 
23
56
  def __init__(self, echo: bool = True) -> None:
24
- self.echo = echo
57
+ super().__init__(echo)
25
58
  self.build_started = False
26
- pass
27
59
 
28
- def _filter_all(self, text: str) -> str:
60
+ def filter(self, text: str) -> str:
29
61
  lines = text.splitlines()
30
62
  out: list[str] = []
31
63
  for line in lines:
64
+ ## DEBUG DO NOT SUBMIT
65
+ # print(line)
32
66
  if "# WASM is building" in line:
33
67
  self.build_started = True
34
- if self.build_started:
68
+ line = _handle_fastled_src(
69
+ line
70
+ ) # Always convert fastled/src to src for file matchups.
71
+ if self.build_started or " error: " in line:
35
72
  line = _handle_ino_cpp(line)
36
73
  out.append(line)
37
74
  text = "\n".join(out)
38
75
  return text
39
-
40
- def print(self, text: str | bytes) -> str:
41
- """Prints the text to the console."""
42
- if isinstance(text, bytes):
43
- text = text.decode("utf-8")
44
- text = self._filter_all(text)
45
- if self.echo:
46
- print(text, end="")
47
- return text
fastled/settings.py CHANGED
@@ -12,3 +12,7 @@ SERVER_PORT = 9021
12
12
  IMAGE_NAME = "niteris/fastled-wasm"
13
13
  DEFAULT_CONTAINER_NAME = "fastled-wasm-compiler"
14
14
  # IMAGE_TAG = "latest"
15
+
16
+ DOCKER_FILE = (
17
+ "https://raw.githubusercontent.com/zackees/fastled-wasm/refs/heads/main/Dockerfile"
18
+ )
fastled/types.py CHANGED
@@ -4,6 +4,8 @@ from enum import Enum
4
4
  from pathlib import Path
5
5
  from typing import Any
6
6
 
7
+ from fastled.print_filter import PrintFilterFastled
8
+
7
9
 
8
10
  @dataclass
9
11
  class Args:
@@ -102,6 +104,11 @@ class CompileResult:
102
104
  def to_dict(self) -> dict[str, Any]:
103
105
  return self.__dict__.copy()
104
106
 
107
+ def __post_init__(self):
108
+ # Filter the stdout.
109
+ pf = PrintFilterFastled(echo=False)
110
+ self.stdout = pf.print(self.stdout)
111
+
105
112
 
106
113
  class CompileServerError(Exception):
107
114
  """Error class for failing to instantiate CompileServer."""
fastled/web_compile.py CHANGED
@@ -4,6 +4,7 @@ import json
4
4
  import os
5
5
  import shutil
6
6
  import tempfile
7
+ import time
7
8
  import zipfile
8
9
  from concurrent.futures import Future, ThreadPoolExecutor, as_completed
9
10
  from dataclasses import dataclass
@@ -154,6 +155,37 @@ def find_good_connection(
154
155
  return None
155
156
 
156
157
 
158
+ def _banner(msg: str) -> str:
159
+ """
160
+ Create a banner for the given message.
161
+ Example:
162
+ msg = "Hello, World!"
163
+ print -> "#################"
164
+ "# Hello, World! #"
165
+ "#################"
166
+ """
167
+ lines = msg.split("\n")
168
+ # Find the width of the widest line
169
+ max_width = max(len(line) for line in lines)
170
+ width = max_width + 4 # Add 4 for "# " and " #"
171
+
172
+ # Create the top border
173
+ banner = "\n" + "#" * width + "\n"
174
+
175
+ # Add each line with proper padding
176
+ for line in lines:
177
+ padding = max_width - len(line)
178
+ banner += f"# {line}{' ' * padding} #\n"
179
+
180
+ # Add the bottom border
181
+ banner += "#" * width + "\n"
182
+ return banner
183
+
184
+
185
+ def _print_banner(msg: str) -> None:
186
+ print(_banner(msg))
187
+
188
+
157
189
  def web_compile(
158
190
  directory: Path | str,
159
191
  host: str | None = None,
@@ -161,11 +193,12 @@ def web_compile(
161
193
  build_mode: BuildMode | None = None,
162
194
  profile: bool = False,
163
195
  ) -> CompileResult:
196
+ start_time = time.time()
164
197
  if isinstance(directory, str):
165
198
  directory = Path(directory)
166
199
  host = _sanitize_host(host or DEFAULT_HOST)
167
200
  build_mode = build_mode or BuildMode.QUICK
168
- print("Compiling on", host)
201
+ _print_banner(f"Compiling on {host}")
169
202
  auth_token = auth_token or _AUTH_TOKEN
170
203
  if not directory.exists():
171
204
  raise FileNotFoundError(f"Directory not found: {directory}")
@@ -186,7 +219,7 @@ def web_compile(
186
219
 
187
220
  connection_result = find_good_connection(urls)
188
221
  if connection_result is None:
189
- print("Connection failed to all endpoints")
222
+ _print_banner("Connection failed to all endpoints")
190
223
  return CompileResult(
191
224
  success=False,
192
225
  stdout="Connection failed",
@@ -270,6 +303,9 @@ def web_compile(
270
303
  relative_path = file_path.relative_to(extract_path)
271
304
  out_zip.write(file_path, relative_path)
272
305
 
306
+ diff_time = time.time() - start_time
307
+ msg = f"Compilation success, took {diff_time:.2f} seconds"
308
+ _print_banner(msg)
273
309
  return CompileResult(
274
310
  success=True,
275
311
  stdout=stdout,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.2.75
3
+ Version: 1.2.77
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -1,33 +1,34 @@
1
- fastled/__init__.py,sha256=xipAccpkKKMAReisV4TKrsvg6jSwr47YOR_UQiOAQ0g,6770
2
- fastled/app.py,sha256=vteMH0WvWGkQq-FR6SdAzqJcHqx0Gcj-aclXYZL7n5Q,4073
1
+ fastled/__init__.py,sha256=jcXru6wq69PDDaohulLi5gYXikZoeAqi7YJVuNV-LJg,6680
2
+ fastled/app.py,sha256=0W8Mbplo5UCRzj7nMVgkmCBddQGufsUQjkUUT4pMp74,4611
3
3
  fastled/cli.py,sha256=FjVr31ht0UPlAcmX-84NwfAGMQHTkrCe4o744jCAxiw,375
4
4
  fastled/cli_test.py,sha256=qJB9yLRFR3OwOwdIWSQ0fQsWLnA37v5pDccufiP_hTs,512
5
+ fastled/cli_test_interactive.py,sha256=BjNhveZOk5aCffHbcrxPQQjWmAuj4ClVKKcKX5eY6yM,542
5
6
  fastled/client_server.py,sha256=eG82h-27Y40szCew976lv9I6bP-YxtRV6sFNDVNTapo,14525
6
7
  fastled/compile_server.py,sha256=rkXvrvdav5vDG8lv_OlBX3YSCHtnHMt25nXbfeg_r78,2960
7
- fastled/compile_server_impl.py,sha256=LnvxeSgBQ3lvey3_dz71UnJjCb5WTUQaPYtuSc1BMvo,10706
8
- fastled/docker_manager.py,sha256=1qKM_Ufp3hD3FcS8uUy5mV4s7ogJ92AR-qTida8QV3U,35129
8
+ fastled/compile_server_impl.py,sha256=dfybPABcSu1Go0CaqpUP56vbaELMlr-ER-CwSYhaCCE,11903
9
+ fastled/docker_manager.py,sha256=SC_qV6grNTGh0QD1ubKrULQblrN-2PORocISlaZg9NQ,35156
9
10
  fastled/filewatcher.py,sha256=3qS3L7zMQhFuVrkeGn1djsB_cB6x_E2YGJmmQWVAU_w,10033
10
11
  fastled/interactive_srcs.py,sha256=F5nHdJc60xsnmOtnKhngE9JytqGn56PmYw_MVSIX1ac,138
11
12
  fastled/keyboard.py,sha256=UTAsqCn1UMYnB8YDzENiLTj4GeL45tYfEcO7_5fLFEg,3556
12
13
  fastled/keyz.py,sha256=LO-8m_7CpNDiZLM-FXhQ30f9gN1bUYz5lOsUPTIbI-c,4020
13
14
  fastled/live_client.py,sha256=MDauol0mxtXggV1Pv9ahC0Jjg_4wnnV6FjGEtdd9cxU,2763
14
15
  fastled/open_browser.py,sha256=Fv1w645rrVROaW4jjyU70Cfz6QPbyIqjK5yu16lhBlo,3836
15
- fastled/parse_args.py,sha256=Y6ZNjMNkXiXvGs_oa-2RgwSH7Yb-Ogpi4pzLBf455II,8112
16
+ fastled/parse_args.py,sha256=lF63joIP2rN706n1rbxmBhWyogN91zjocyFtTVHOnds,9306
16
17
  fastled/paths.py,sha256=VsPmgu0lNSCFOoEC0BsTYzDygXqy15AHUfN-tTuzDZA,99
17
- fastled/print_filter.py,sha256=IijutPR_gmyM6Jjm6b7h1UGHNcjiNoAdO_cWihMWT4I,1512
18
+ fastled/print_filter.py,sha256=ZpebuqfWEraSBD3Dm0PVZhQVBnU_NSILniwBHwjC1qM,2342
18
19
  fastled/project_init.py,sha256=bBt4DwmW5hZkm9ICt9Qk-0Nr_0JQM7icCgH5Iv-bCQs,3984
19
20
  fastled/select_sketch_directory.py,sha256=-eudwCns3AKj4HuHtSkZAFwbnf005SNL07pOzs9VxnE,1383
20
21
  fastled/server_fastapi.py,sha256=ytsL4poO-yugDIhvYJq6nCNdLZ4fQJ1AFqXkF-uEkqo,1488
21
22
  fastled/server_fastapi_cli.py,sha256=fJGLvbJx5ertsZER_lgg0GfkYTX-V2rxzbNO1lEapU0,1392
22
23
  fastled/server_flask.py,sha256=i0OtDdrjiF9hjKNnI2ebf6Ag-mxMmtUCxnuHMBOzx7I,4665
23
24
  fastled/server_start.py,sha256=NfAV5pWdXn2HDvqiMrpHxuNqh2vnB4xVFltV5Pn16GM,3509
24
- fastled/settings.py,sha256=URgM6ZPlQYF-0ZTEhQCX8isLR6CbmYGwhDX4uXbh-ZI,468
25
+ fastled/settings.py,sha256=oezRvRUJWwauO-kpC4LDbKg6Q-ij4d09UtR2vkjSAPU,575
25
26
  fastled/sketch.py,sha256=tHckjDj8P6BI_LWzUFM071a9qcqPs-r-qFWIe50P5Xw,3391
26
27
  fastled/spinner.py,sha256=VHxmvB92P0Z_zYxRajb5HiNmkHHvZ5dG7hKtZltzpcs,867
27
28
  fastled/string_diff.py,sha256=NbtYxvBFxTUdmTpMLizlgZj2ULJ-7etj72GBdWDTGws,2496
28
- fastled/types.py,sha256=ZFqHxYIGSeQb9FiImA5KDXZLhmmVSjOrIQDduwxmCZw,4494
29
+ fastled/types.py,sha256=mNchhIW5m6hBBv63OYE0V_u5yGnS505eWjw7HCazb_s,4694
29
30
  fastled/util.py,sha256=17f2A52TfBErJOEGC_Vs72t1mTDocLVTfnR9hWbXW8A,501
30
- fastled/web_compile.py,sha256=H2Tm5kMBaRjqdHqxv7L3-xSeYNHi0k0P-XM0Cn9esOo,10360
31
+ fastled/web_compile.py,sha256=QTYHtcm55zsFxPhdA-qSPfL5Q4lhL3h3oNmir3m-Y3s,11345
31
32
  fastled/assets/example.txt,sha256=lTBovRjiz0_TgtAtbA1C5hNi2ffbqnNPqkKg6UiKCT8,54
32
33
  fastled/assets/localhost-key.pem,sha256=Q-CNO_UoOd8fFNN4ljcnqwUeCMhzTplRjLO2x0pYRlU,1704
33
34
  fastled/assets/localhost.pem,sha256=QTwUtTwjYWbm9m3pHW2IlK2nFZJ8b0pppxPjhgVZqQo,1619
@@ -35,9 +36,9 @@ fastled/site/build.py,sha256=2YKU_UWKlJdGnjdbAbaL0co6kceFMSTVYwH1KCmgPZA,13987
35
36
  fastled/site/examples.py,sha256=s6vj2zJc6BfKlnbwXr1QWY1mzuDBMt6j5MEBOWjO_U8,155
36
37
  fastled/test/can_run_local_docker_tests.py,sha256=LEuUbHctRhNNFWcvnz2kEGmjDJeXO4c3kNpizm3yVJs,400
37
38
  fastled/test/examples.py,sha256=GfaHeY1E8izBl6ZqDVjz--RHLyVR4NRnQ5pBesCFJFY,1673
38
- fastled-1.2.75.dist-info/licenses/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
39
- fastled-1.2.75.dist-info/METADATA,sha256=9bfoTdPGaNXYG5VCTNQHAkna4UC3DlDO4f0KjqG3cjA,22065
40
- fastled-1.2.75.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
41
- fastled-1.2.75.dist-info/entry_points.txt,sha256=RCwmzCSOS4-C2i9EziANq7Z2Zb4KFnEMR1FQC0bBwAw,101
42
- fastled-1.2.75.dist-info/top_level.txt,sha256=Bbv5kpJpZhWNCvDF4K0VcvtBSDMa8B7PTOrZa9CezHY,8
43
- fastled-1.2.75.dist-info/RECORD,,
39
+ fastled-1.2.77.dist-info/licenses/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
40
+ fastled-1.2.77.dist-info/METADATA,sha256=8iJ_j3x7Iemf1vLZr3-eLPDE2pFfSXs_ObEs1A0XC4Y,22065
41
+ fastled-1.2.77.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
42
+ fastled-1.2.77.dist-info/entry_points.txt,sha256=RCwmzCSOS4-C2i9EziANq7Z2Zb4KFnEMR1FQC0bBwAw,101
43
+ fastled-1.2.77.dist-info/top_level.txt,sha256=Bbv5kpJpZhWNCvDF4K0VcvtBSDMa8B7PTOrZa9CezHY,8
44
+ fastled-1.2.77.dist-info/RECORD,,