fastled 1.1.31__tar.gz → 1.1.32__tar.gz

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.
Files changed (106) hide show
  1. {fastled-1.1.31 → fastled-1.1.32}/PKG-INFO +2 -1
  2. {fastled-1.1.31 → fastled-1.1.32}/README.md +1 -0
  3. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/__init__.py +1 -1
  4. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/open_browser.py +6 -5
  5. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/parse_args.py +3 -0
  6. fastled-1.1.32/src/fastled/project_init.py +68 -0
  7. {fastled-1.1.31 → fastled-1.1.32}/src/fastled.egg-info/PKG-INFO +2 -1
  8. {fastled-1.1.31 → fastled-1.1.32}/src/fastled.egg-info/SOURCES.txt +1 -2
  9. fastled-1.1.32/tests/test_project_init.py +33 -0
  10. fastled-1.1.31/examples/SdCard/SdCard.ino +0 -87
  11. fastled-1.1.31/examples/SdCard/screenmap.json.h +0 -4
  12. fastled-1.1.31/src/fastled/project_init.py +0 -37
  13. {fastled-1.1.31 → fastled-1.1.32}/.aiderignore +0 -0
  14. {fastled-1.1.31 → fastled-1.1.32}/.github/workflows/build_multi_docker_image.yml +0 -0
  15. {fastled-1.1.31 → fastled-1.1.32}/.github/workflows/lint.yml +0 -0
  16. {fastled-1.1.31 → fastled-1.1.32}/.github/workflows/test_macos.yml +0 -0
  17. {fastled-1.1.31 → fastled-1.1.32}/.github/workflows/test_ubuntu.yml +0 -0
  18. {fastled-1.1.31 → fastled-1.1.32}/.github/workflows/test_win.yml +0 -0
  19. {fastled-1.1.31 → fastled-1.1.32}/.gitignore +0 -0
  20. {fastled-1.1.31 → fastled-1.1.32}/.pylintrc +0 -0
  21. {fastled-1.1.31 → fastled-1.1.32}/.vscode/launch.json +0 -0
  22. {fastled-1.1.31 → fastled-1.1.32}/.vscode/settings.json +0 -0
  23. {fastled-1.1.31 → fastled-1.1.32}/.vscode/tasks.json +0 -0
  24. {fastled-1.1.31 → fastled-1.1.32}/LICENSE +0 -0
  25. {fastled-1.1.31 → fastled-1.1.32}/MANIFEST.in +0 -0
  26. {fastled-1.1.31 → fastled-1.1.32}/clean +0 -0
  27. {fastled-1.1.31 → fastled-1.1.32}/docs/fastled.js +0 -0
  28. {fastled-1.1.31 → fastled-1.1.32}/docs/fastled.wasm +0 -0
  29. {fastled-1.1.31 → fastled-1.1.32}/docs/index.css +0 -0
  30. {fastled-1.1.31 → fastled-1.1.32}/docs/index.html +0 -0
  31. {fastled-1.1.31 → fastled-1.1.32}/docs/index.js +0 -0
  32. {fastled-1.1.31 → fastled-1.1.32}/examples/Blink/Blink.ino +0 -0
  33. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/Chromancer.ino +0 -0
  34. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/detail.h +0 -0
  35. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/gary_woos_wled_port/gary_woos_wled_ledmap.h +0 -0
  36. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/gary_woos_wled_port/presets.json +0 -0
  37. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/gary_woos_wled_port/presets.min.json +0 -0
  38. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/gen.py +0 -0
  39. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/mapping.h +0 -0
  40. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/net.h +0 -0
  41. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/output.json +0 -0
  42. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/ripple.h +0 -0
  43. {fastled-1.1.31 → fastled-1.1.32}/examples/Chromancer/screenmap.json.h +0 -0
  44. {fastled-1.1.31 → fastled-1.1.32}/examples/ColorPalette/ColorPalette.ino +0 -0
  45. {fastled-1.1.31 → fastled-1.1.32}/examples/ColorTemperature/ColorTemperature.ino +0 -0
  46. {fastled-1.1.31 → fastled-1.1.32}/examples/Cylon/Cylon.ino +0 -0
  47. {fastled-1.1.31 → fastled-1.1.32}/examples/DemoReel100/DemoReel100.ino +0 -0
  48. {fastled-1.1.31 → fastled-1.1.32}/examples/Esp32Rmt51/Esp32Rmt51.ino +0 -0
  49. {fastled-1.1.31 → fastled-1.1.32}/examples/EspI2SDemo/EspI2SDemo.ino +0 -0
  50. {fastled-1.1.31 → fastled-1.1.32}/examples/Fire2012/Fire2012.ino +0 -0
  51. {fastled-1.1.31 → fastled-1.1.32}/examples/Fire2012WithPalette/Fire2012WithPalette.ino +0 -0
  52. {fastled-1.1.31 → fastled-1.1.32}/examples/FirstLight/FirstLight.ino +0 -0
  53. {fastled-1.1.31 → fastled-1.1.32}/examples/FxEngine/FxEngine.ino +0 -0
  54. {fastled-1.1.31 → fastled-1.1.32}/examples/Noise/Noise.ino +0 -0
  55. {fastled-1.1.31 → fastled-1.1.32}/examples/NoisePlayground/NoisePlayground.ino +0 -0
  56. {fastled-1.1.31 → fastled-1.1.32}/examples/NoisePlusPalette/NoisePlusPalette.ino +0 -0
  57. {fastled-1.1.31 → fastled-1.1.32}/examples/OctoWS2811/OctoWS2811.ino +0 -0
  58. {fastled-1.1.31 → fastled-1.1.32}/examples/Pacifica/Pacifica.ino +0 -0
  59. {fastled-1.1.31 → fastled-1.1.32}/examples/Pride2015/Pride2015.ino +0 -0
  60. {fastled-1.1.31 → fastled-1.1.32}/examples/TwinkleFox/TwinkleFox.ino +0 -0
  61. {fastled-1.1.31 → fastled-1.1.32}/examples/Video/Gfx2Video/Gfx2Video.ino +0 -0
  62. {fastled-1.1.31 → fastled-1.1.32}/examples/WasmScreenCoords/WasmScreenCoords.ino +0 -0
  63. {fastled-1.1.31 → fastled-1.1.32}/examples/Water/Water.ino +0 -0
  64. {fastled-1.1.31 → fastled-1.1.32}/examples/XYMatrix/XYMatrix.ino +0 -0
  65. {fastled-1.1.31 → fastled-1.1.32}/examples/wasm/wasm.ino +0 -0
  66. {fastled-1.1.31 → fastled-1.1.32}/install +0 -0
  67. {fastled-1.1.31 → fastled-1.1.32}/lint +0 -0
  68. {fastled-1.1.31 → fastled-1.1.32}/pyproject.toml +0 -0
  69. {fastled-1.1.31 → fastled-1.1.32}/requirements.testing.txt +0 -0
  70. {fastled-1.1.31 → fastled-1.1.32}/setup.cfg +0 -0
  71. {fastled-1.1.31 → fastled-1.1.32}/setup.py +0 -0
  72. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/app.py +0 -0
  73. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/assets/example.txt +0 -0
  74. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/build_mode.py +0 -0
  75. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/cli.py +0 -0
  76. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/client_server.py +0 -0
  77. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/compile_server.py +0 -0
  78. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/docker_manager.py +0 -0
  79. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/env.py +0 -0
  80. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/filewatcher.py +0 -0
  81. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/keyboard.py +0 -0
  82. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/paths.py +0 -0
  83. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/select_sketch_directory.py +0 -0
  84. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/sketch.py +0 -0
  85. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/spinner.py +0 -0
  86. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/string_diff.py +0 -0
  87. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/types.py +0 -0
  88. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/util.py +0 -0
  89. {fastled-1.1.31 → fastled-1.1.32}/src/fastled/web_compile.py +0 -0
  90. {fastled-1.1.31 → fastled-1.1.32}/src/fastled.egg-info/dependency_links.txt +0 -0
  91. {fastled-1.1.31 → fastled-1.1.32}/src/fastled.egg-info/entry_points.txt +0 -0
  92. {fastled-1.1.31 → fastled-1.1.32}/src/fastled.egg-info/requires.txt +0 -0
  93. {fastled-1.1.31 → fastled-1.1.32}/src/fastled.egg-info/top_level.txt +0 -0
  94. {fastled-1.1.31 → fastled-1.1.32}/test +0 -0
  95. {fastled-1.1.31 → fastled-1.1.32}/tests/test_bad_ino.py +0 -0
  96. {fastled-1.1.31 → fastled-1.1.32}/tests/test_cli.py +0 -0
  97. {fastled-1.1.31 → fastled-1.1.32}/tests/test_compile_server.py +0 -0
  98. {fastled-1.1.31 → fastled-1.1.32}/tests/test_embedded_data.py +0 -0
  99. {fastled-1.1.31 → fastled-1.1.32}/tests/test_filechanger.py +0 -0
  100. {fastled-1.1.31 → fastled-1.1.32}/tests/test_ino/bad/bad.ino +0 -0
  101. {fastled-1.1.31 → fastled-1.1.32}/tests/test_ino/embedded/data/bigdata.dat +0 -0
  102. {fastled-1.1.31 → fastled-1.1.32}/tests/test_ino/embedded/wasm.ino +0 -0
  103. {fastled-1.1.31 → fastled-1.1.32}/tests/test_ino/wasm/wasm.ino +0 -0
  104. {fastled-1.1.31 → fastled-1.1.32}/tests/test_server_and_client_seperatly.py +0 -0
  105. {fastled-1.1.31 → fastled-1.1.32}/tests/test_webcompile.py +0 -0
  106. {fastled-1.1.31 → fastled-1.1.32}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastled
3
- Version: 1.1.31
3
+ Version: 1.1.32
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -163,6 +163,7 @@ A: A big chunk of space is being used by unnecessary javascript `emscripten` is
163
163
 
164
164
  # Revisions
165
165
 
166
+ * 1.1.32 - `--init` now asks for which example you want, then tells you where the example was downloaded to. No longer auto-compiles.
166
167
  * 1.1.31 - `--local` is auto-enabled if docker is installed, use `--web` to force web compiler. Updating is much more pretty.
167
168
  * 1.1.30 - Added `--init` to initialize a demo project.
168
169
  * 1.1.29 - Remove annoying dbg messages i left in.
@@ -140,6 +140,7 @@ A: A big chunk of space is being used by unnecessary javascript `emscripten` is
140
140
 
141
141
  # Revisions
142
142
 
143
+ * 1.1.32 - `--init` now asks for which example you want, then tells you where the example was downloaded to. No longer auto-compiles.
143
144
  * 1.1.31 - `--local` is auto-enabled if docker is installed, use `--web` to force web compiler. Updating is much more pretty.
144
145
  * 1.1.30 - Added `--init` to initialize a demo project.
145
146
  * 1.1.29 - Remove annoying dbg messages i left in.
@@ -1,3 +1,3 @@
1
1
  """FastLED Wasm Compiler package."""
2
2
 
3
- __version__ = "1.1.31"
3
+ __version__ = "1.1.32"
@@ -13,11 +13,12 @@ def _open_browser_python(fastled_js: Path, port: int) -> Server:
13
13
  """Start livereload server in the fastled_js directory using API"""
14
14
  print(f"\nStarting livereload server in {fastled_js} on port {port}")
15
15
 
16
- server = Server()
17
- server.watch(str(fastled_js / "index.html"), delay=0.1)
18
- server.setHeader("Cache-Control", "no-cache")
19
- server.serve(root=str(fastled_js), port=port, open_url_delay=0.5)
20
- return server
16
+ # server = Server()
17
+ # server.watch(str(fastled_js / "index.html"), delay=0.1)
18
+ # server.setHeader("Cache-Control", "no-cache")
19
+ # server.serve(root=str(fastled_js), port=port, open_url_delay=0.5)
20
+ # return server
21
+ os.system(f"cd {fastled_js} && live-server")
21
22
 
22
23
 
23
24
  def _find_open_port(start_port: int) -> int:
@@ -106,6 +106,9 @@ def parse_args() -> argparse.Namespace:
106
106
 
107
107
  if args.init:
108
108
  args.directory = project_init()
109
+ print("\nInitialized FastLED project in", args.directory)
110
+ print(f"Use 'fastled {args.directory}' to compile the project.")
111
+ sys.exit(0)
109
112
 
110
113
  if not args.update:
111
114
  if args.no_auto_updates:
@@ -0,0 +1,68 @@
1
+ import zipfile
2
+ from pathlib import Path
3
+
4
+ import httpx
5
+
6
+ from fastled.env import DEFAULT_URL
7
+
8
+ ENDPOINT_PROJECT_INIT = f"{DEFAULT_URL}/project/init"
9
+ ENDPOINT_INFO = f"{DEFAULT_URL}/info"
10
+ DEFAULT_EXAMPLE = "wasm"
11
+
12
+
13
+ def get_examples() -> list[str]:
14
+ response = httpx.get(ENDPOINT_INFO, timeout=4)
15
+ response.raise_for_status()
16
+ return response.json()["examples"]
17
+
18
+
19
+ def _prompt_for_example() -> str:
20
+ examples = get_examples()
21
+ while True:
22
+ print("Available examples:")
23
+ for i, example in enumerate(examples):
24
+ print(f" [{i+1}]: {example}")
25
+ answer = input("Enter the example number or name: ").strip()
26
+ if answer.isdigit():
27
+ example_num = int(answer) - 1
28
+ if example_num < 0 or example_num >= len(examples):
29
+ print("Invalid example number")
30
+ continue
31
+ return examples[example_num]
32
+ elif answer in examples:
33
+ return answer
34
+
35
+
36
+ def project_init(example: str | None = None, outputdir: Path | None = None) -> Path:
37
+ """
38
+ Initialize a new FastLED project.
39
+ """
40
+
41
+ outputdir = outputdir or Path("fastled")
42
+ if example is None:
43
+ try:
44
+ example = _prompt_for_example()
45
+ except httpx.HTTPStatusError:
46
+ print(
47
+ f"Failed to fetch examples, using default example '{DEFAULT_EXAMPLE}'"
48
+ )
49
+ example = DEFAULT_EXAMPLE
50
+ assert example is not None
51
+ response = httpx.get(f"{ENDPOINT_PROJECT_INIT}/{example}", timeout=20)
52
+ response.raise_for_status()
53
+ content = response.content
54
+ tmpzip = outputdir / "fastled.zip"
55
+ outputdir.mkdir(exist_ok=True)
56
+ tmpzip.write_bytes(content)
57
+ with zipfile.ZipFile(tmpzip, "r") as zip_ref:
58
+ zip_ref.extractall(outputdir)
59
+ tmpzip.unlink()
60
+ return outputdir.iterdir().__next__()
61
+
62
+
63
+ def unit_test() -> None:
64
+ project_init()
65
+
66
+
67
+ if __name__ == "__main__":
68
+ unit_test()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastled
3
- Version: 1.1.31
3
+ Version: 1.1.32
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -163,6 +163,7 @@ A: A big chunk of space is being used by unnecessary javascript `emscripten` is
163
163
 
164
164
  # Revisions
165
165
 
166
+ * 1.1.32 - `--init` now asks for which example you want, then tells you where the example was downloaded to. No longer auto-compiles.
166
167
  * 1.1.31 - `--local` is auto-enabled if docker is installed, use `--web` to force web compiler. Updating is much more pretty.
167
168
  * 1.1.30 - Added `--init` to initialize a demo project.
168
169
  * 1.1.29 - Remove annoying dbg messages i left in.
@@ -53,8 +53,6 @@ examples/NoisePlusPalette/NoisePlusPalette.ino
53
53
  examples/OctoWS2811/OctoWS2811.ino
54
54
  examples/Pacifica/Pacifica.ino
55
55
  examples/Pride2015/Pride2015.ino
56
- examples/SdCard/SdCard.ino
57
- examples/SdCard/screenmap.json.h
58
56
  examples/TwinkleFox/TwinkleFox.ino
59
57
  examples/Video/Gfx2Video/Gfx2Video.ino
60
58
  examples/WasmScreenCoords/WasmScreenCoords.ino
@@ -94,6 +92,7 @@ tests/test_cli.py
94
92
  tests/test_compile_server.py
95
93
  tests/test_embedded_data.py
96
94
  tests/test_filechanger.py
95
+ tests/test_project_init.py
97
96
  tests/test_server_and_client_seperatly.py
98
97
  tests/test_webcompile.py
99
98
  tests/test_ino/bad/bad.ino
@@ -0,0 +1,33 @@
1
+ import unittest
2
+ from pathlib import Path
3
+ from tempfile import TemporaryDirectory
4
+
5
+ from fastled.project_init import get_examples, project_init
6
+
7
+ HERE = Path(__file__).parent
8
+ TEST_DIR = HERE / "test_ino" / "wasm"
9
+
10
+
11
+ class ProjectInitTester(unittest.TestCase):
12
+ """Main tester class."""
13
+
14
+ def test_get_examples(self) -> None:
15
+ """Test get_examples function."""
16
+ examples = get_examples()
17
+ self.assertTrue(len(examples) > 0)
18
+ self.assertTrue("wasm" in examples)
19
+
20
+ def test_compile(self) -> None:
21
+ """Test web compilation functionality with real server."""
22
+ # Test the web_compile function with actual server call
23
+ with TemporaryDirectory() as tmpdir:
24
+ out = Path(tmpdir)
25
+ project_init(example="wasm", outputdir=out)
26
+ # print out everything in the out dir
27
+ for f in out.iterdir():
28
+ print(f)
29
+ self.assertTrue((out / "wasm" / "wasm.ino").exists())
30
+
31
+
32
+ if __name__ == "__main__":
33
+ unittest.main()
@@ -1,87 +0,0 @@
1
-
2
-
3
-
4
- #ifdef __AVR__
5
- void setup() {
6
- // put your setup code here, to run once:
7
- }
8
-
9
- void loop() {
10
- // put your main code here, to run repeatedly:
11
- }
12
- #else
13
-
14
- #include <FastLED.h>
15
- #include "Arduino.h"
16
-
17
-
18
- #include "fx/2d/noisepalette.hpp"
19
- // #include "fx/2d/animartrix.hpp"
20
- #include "fx/fx_engine.h"
21
- #include "fx/video.h"
22
- #include "file_system.h"
23
- #include "fl/ui.h"
24
- #include "screenmap.h"
25
- #include "file_system.h"
26
-
27
- using namespace fl;
28
-
29
-
30
- #include "screenmap.json.h" // const char JSON_SCREEN_MAP[] = { ... }
31
-
32
-
33
- #define LED_PIN 2
34
- #define LED_TYPE WS2811
35
- #define COLOR_ORDER GRB
36
- #define FPS 30
37
- #define CHIP_SELECT_PIN 5
38
-
39
-
40
- #define MATRIX_WIDTH 32
41
- #define MATRIX_HEIGHT 32
42
-
43
-
44
- #define NUM_LEDS (MATRIX_WIDTH * MATRIX_HEIGHT)
45
- #define IS_SERPINTINE true
46
-
47
-
48
- Title title("SDCard Demo - Mapped Video");
49
- Description description("Video data is streamed off of a SD card and displayed on a LED strip. The video data is mapped to the LED strip using a ScreenMap.");
50
-
51
-
52
- CRGB leds[NUM_LEDS];
53
- ScreenMap screenMap;
54
-
55
- FileSystem filesystem;
56
- Video video;
57
-
58
-
59
- void setup() {
60
- Serial.begin(115200);
61
- delay(1000); // sanity delay
62
- if (!filesystem.beginSd(CHIP_SELECT_PIN)) {
63
- Serial.println("Failed to initialize file system.");
64
- }
65
- // JSON_SCREEN_MAP
66
- FixedMap<Str, ScreenMap, 16> screenMaps;
67
- ScreenMap::ParseJson(JSON_SCREEN_MAP, &screenMaps);
68
- ScreenMap screenMap = screenMaps["strip1"];
69
-
70
- FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS)
71
- .setCorrection(TypicalLEDStrip)
72
- .setScreenMap(screenMap);
73
- FastLED.setBrightness(96);
74
- //fxEngine.addFx(animartrix);
75
- video = filesystem.openVideo("data/video.dat", NUM_LEDS, FPS);
76
- if (!video) {
77
- Serial.println("Failed to instantiate video");
78
- }
79
- }
80
-
81
- void loop() {
82
- uint32_t now = millis();
83
- video.draw(now, leds);
84
- FastLED.show();
85
- }
86
-
87
- #endif
@@ -1,4 +0,0 @@
1
-
2
- const char JSON_SCREEN_MAP[] = R"(
3
- {"map": {"strip1": {"x": [-0.5, -1.21, -1.91, -2.62, -3.33, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -4.74, -4.04, -3.33, -2.62, -1.91, -1.21, -1.91, -2.62, -3.33, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -4.74, -4.04, -3.33, -2.62, -3.33, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -4.74, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -18.18, -18.89, -18.18, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -18.18, -18.89, -19.59, -20.3, -19.59, -18.89, -18.18, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -18.18, -18.89, -19.59, -20.3, -21.01, -21.71, -21.01, -20.3, -19.59, -18.89, -18.18, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 9.9, 10.61, 9.9, 9.19, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -9.9, -9.19, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -9.9, -10.61, 0.5, 1.21, 1.91, 2.62, 3.33, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 4.74, 4.04, 3.33, 2.62, 1.91, 1.21, 1.91, 2.62, 3.33, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 4.74, 4.04, 3.33, 2.62, 3.33, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 4.74, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 18.18, 18.89, 18.18, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 18.18, 18.89, 19.59, 20.3, 19.59, 18.89, 18.18, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 18.18, 18.89, 19.59, 20.3, 21.01, 21.71, 21.01, 20.3, 19.59, 18.89, 18.18, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -9.9, -10.61, -9.9, -9.19, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 9.9, 9.19, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 9.9, 10.61], "y": [0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -9.9, -10.61, -9.9, -9.19, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 9.9, 9.19, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 9.9, 10.61, -0.5, -1.21, -1.91, -2.62, -3.33, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -4.74, -4.04, -3.33, -2.62, -1.91, -1.21, -1.91, -2.62, -3.33, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -4.74, -4.04, -3.33, -2.62, -3.33, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -4.74, -4.04, -4.74, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -6.16, -5.45, -6.16, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -7.57, -6.86, -7.57, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -18.18, -18.89, -18.18, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -8.98, -8.28, -8.98, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -18.18, -18.89, -19.59, -20.3, -19.59, -18.89, -18.18, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, -10.4, -9.69, -10.4, -11.11, -11.81, -12.52, -13.23, -13.94, -14.64, -15.35, -16.06, -16.76, -17.47, -18.18, -18.89, -19.59, -20.3, -21.01, -21.71, -21.01, -20.3, -19.59, -18.89, -18.18, -17.47, -16.76, -16.06, -15.35, -14.64, -13.94, -13.23, -12.52, -11.81, -11.11, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 9.9, 10.61, 9.9, 9.19, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 8.48, 9.19, 8.48, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 7.07, 7.78, 7.07, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 6.36, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 4.24, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 3.54, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 1.41, 2.12, 1.41, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -9.9, -9.19, -8.48, -7.78, -7.07, -6.36, -5.66, -4.95, -4.24, -3.54, -2.83, -2.12, -1.41, -0.71, 0.0, 0.71, 0.0, -0.71, -1.41, -2.12, -2.83, -3.54, -4.24, -4.95, -5.66, -6.36, -7.07, -7.78, -8.48, -9.19, -9.9, -10.61, 0.5, 1.21, 1.91, 2.62, 3.33, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 4.74, 4.04, 3.33, 2.62, 1.91, 1.21, 1.91, 2.62, 3.33, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 4.74, 4.04, 3.33, 2.62, 3.33, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 4.74, 4.04, 4.74, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 6.16, 5.45, 6.16, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 7.57, 6.86, 7.57, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 18.18, 18.89, 18.18, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 8.98, 8.28, 8.98, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 18.18, 18.89, 19.59, 20.3, 19.59, 18.89, 18.18, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11, 10.4, 9.69, 10.4, 11.11, 11.81, 12.52, 13.23, 13.94, 14.64, 15.35, 16.06, 16.76, 17.47, 18.18, 18.89, 19.59, 20.3, 21.01, 21.71, 21.01, 20.3, 19.59, 18.89, 18.18, 17.47, 16.76, 16.06, 15.35, 14.64, 13.94, 13.23, 12.52, 11.81, 11.11], "diameter": 0.25}}}
4
- )";
@@ -1,37 +0,0 @@
1
- import zipfile
2
- from pathlib import Path
3
-
4
- import httpx
5
-
6
- from fastled.env import DEFAULT_URL
7
-
8
- ENDPOINT = f"{DEFAULT_URL}/project/init"
9
-
10
-
11
- def project_init() -> Path:
12
- """
13
- Initialize a new FastLED project.
14
- """
15
- response = httpx.get(ENDPOINT, timeout=20)
16
- response.raise_for_status()
17
- content = response.content
18
- output = Path("fastled.zip")
19
- output.write_bytes(content)
20
- # unzip the content
21
- outdir = Path("fastled")
22
- if outdir.exists():
23
- print("Project already initialized.")
24
- return Path("fastled").iterdir().__next__()
25
- with zipfile.ZipFile(output, "r") as zip_ref:
26
- zip_ref.extractall(outdir)
27
- print(f"Project initialized successfully at {outdir}")
28
- output.unlink()
29
- return Path("fastled").iterdir().__next__()
30
-
31
-
32
- def unit_test() -> None:
33
- project_init()
34
-
35
-
36
- if __name__ == "__main__":
37
- unit_test()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes