code-painter 1.0.0__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.
Files changed (271) hide show
  1. code_painter-1.0.0.dist-info/METADATA +89 -0
  2. code_painter-1.0.0.dist-info/RECORD +271 -0
  3. code_painter-1.0.0.dist-info/WHEEL +4 -0
  4. code_painter-1.0.0.dist-info/licenses/LICENSE +8 -0
  5. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264/__init__.py +0 -0
  6. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226/__init__.py +0 -0
  7. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/246/321/207/320/245/320/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233.py +63 -0
  8. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233.py +72 -0
  9. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226//321/211/320/273/320/250/321/206/342/225/225/320/225/321/204/342/225/225/320/246/321/207/320/245/320/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233.py +177 -0
  10. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237/__init__.py +0 -0
  11. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/204/342/225/225/320/232/321/210/320/261/320/263/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +57 -0
  12. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +71 -0
  13. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/237/320/241/321/205/320/256/320/233/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +54 -0
  14. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/237/320/241/321/210/320/231/342/226/223/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +68 -0
  15. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/342/225/225/342/225/234/321/205/320/275/320/240/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +55 -0
  16. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/320/254/342/225/235/321/207/320/255/320/253/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +58 -0
  17. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/320/254/342/225/235/321/211/320/245/320/254/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +64 -0
  18. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/210/320/223/320/261/321/211/320/261/342/225/227/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +39 -0
  19. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260/__init__.py +0 -0
  20. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/204/342/225/234/320/254/321/206/320/246/320/227/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +25 -0
  21. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/205/320/237/320/264/321/206/320/246/320/227/321/204/342/225/243/320/266/321/206/342/224/202/320/245/321/205/320/275/320/247/321/205/320/225/342/225/225.py +414 -0
  22. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/244/342/226/221/321/205/320/275/320/247/321/206/320/260/342/225/235_/321/206/320/277/320/253/321/207/320/274/320/244/321/205/320/275/320/247/321/205/342/225/225/320/246.py +42 -0
  23. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/244/342/226/221/321/205/320/275/320/247/321/206/320/260/342/225/235_/321/211/320/242/320/262/321/207/320/274/320/244/321/205/320/275/320/247/321/205/342/225/225/320/246.py +40 -0
  24. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/273/320/246/321/206/320/236/320/242/321/204/342/225/243/320/266/321/206/342/224/202/320/245_/321/205/342/225/221/320/226/321/204/342/225/234/320/251/321/205/342/225/243/342/224/244/321/207/320/262/320/241/321/206/320/246/320/227.py +38 -0
  25. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/210/320/233/342/226/222/321/210/320/277/320/275/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +25 -0
  26. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/342/225/226/320/265/321/204/342/225/234/320/254/__init__.py +0 -0
  27. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/342/225/226/320/265/321/204/342/225/234/320/254//321/205/320/254/320/226/321/205/342/225/234/320/262/321/205/320/235/342/226/221/321/207/320/273/320/260.py +22 -0
  28. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265/__init__.py +0 -0
  29. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/233/342/225/235/321/205/320/253/342/225/233.py +17 -0
  30. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/225/320/275/321/211/320/255/320/262/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +59 -0
  31. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/235/320/221/321/204/342/225/221/320/234/321/211/320/255/320/262/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +66 -0
  32. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/253/320/253/321/211/320/255/320/262/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +56 -0
  33. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/253/342/225/234/321/206/320/247/320/247/321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +216 -0
  34. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/342/225/234/320/271/321/210/320/231/342/226/223/321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +216 -0
  35. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +252 -0
  36. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221/__init__.py +0 -0
  37. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/221/320/244/321/206/320/250/320/257/321/207/342/225/221/320/262/321/206/320/247/320/247/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +52 -0
  38. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/225/320/231/321/205/320/275/320/247/321/207/342/225/227/320/237/321/205/320/223/320/237/321/207/342/224/244/320/260/321/210/320/231/342/225/221/321/206/320/254/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +32 -0
  39. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/225/320/254/321/211/320/263/320/236/321/207/342/225/221/320/262/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +39 -0
  40. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/225/320/275/321/207/320/267/320/233/321/205/320/264/320/272/321/206/320/256/320/221/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +97 -0
  41. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/320/264/320/272/321/206/320/256/320/221/321/205/320/253/342/225/233/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +54 -0
  42. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/320/277/320/226/321/205/342/225/221/320/266/321/205/320/223/320/237/321/207/342/224/244/320/260/321/206/320/236/320/267/321/205/320/230/342/225/242/321/206/320/250/320/236/321/206/320/252/320/247/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +51 -0
  43. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/342/225/233/320/276/321/204/342/224/220/320/261/321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263.py +54 -0
  44. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +23 -0
  45. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/223/320/237/321/207/342/224/244/320/260/321/207/320/244/342/225/227/321/210/320/231/342/225/221/321/206/320/254/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +29 -0
  46. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/227/320/260/321/204/342/225/234/320/245/321/205/320/253/342/225/233/321/205/342/225/234/320/262/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +26 -0
  47. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/232/320/270/321/206/342/225/235/320/273/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +19 -0
  48. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/267/320/243/321/206/342/226/221/320/237/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +20 -0
  49. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/277/320/226/321/205/342/225/221/320/266/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +31 -0
  50. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/204/342/225/225/320/231/321/205/320/275/320/247/321/207/342/225/227/320/237/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +25 -0
  51. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/205/320/253/342/225/233/321/206/320/260/320/227/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +23 -0
  52. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/205/320/254/320/226/321/205/320/241/320/270/321/207/320/236/320/227/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +125 -0
  53. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +20 -0
  54. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +20 -0
  55. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/206/342/226/221/342/224/244/321/206/342/225/227/342/224/244/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +25 -0
  56. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/207/320/221/342/226/221/321/207/342/225/221/342/224/220/321/206/320/255/320/261/321/207/320/276/320/220/321/207/342/225/221/320/266/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +26 -0
  57. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/207/320/244/342/225/241/321/210/320/267/320/226/321/204/342/224/220/320/261/321/205/320/237/342/225/226/321/206/342/225/241/320/233/321/210/320/277/320/245/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +40 -0
  58. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/207/342/225/221/320/262/321/205/320/262/320/251/321/206/320/220/320/220/321/206/320/247/320/267/321/207/342/225/227/320/237/321/205/320/225/342/225/225.py +72 -0
  59. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/211/320/254/320/243/321/210/320/251/342/225/243/321/207/320/221/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +29 -0
  60. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236/__init__.py +0 -0
  61. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/231/320/227/321/211/320/255/320/262/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232.py +45 -0
  62. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/264/320/275/321/205/320/254/320/226/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232.py +37 -0
  63. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/264/320/275/321/205/320/254/320/226/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +36 -0
  64. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/275/320/263/321/206/320/246/342/225/243/321/205/342/225/234/320/262/321/211/342/225/227/320/224/321/211/320/227/320/241/321/205/320/230/320/226/321/205/320/231/342/226/223.py +67 -0
  65. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/207/320/230/342/226/222/321/205/342/224/220/320/223/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +36 -0
  66. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/207/320/257/320/271/321/205/342/225/234/320/262/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232.py +34 -0
  67. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/207/320/257/320/271/321/205/342/225/234/320/262/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +36 -0
  68. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/342/225/241/320/233/321/210/320/277/320/245//321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/342/224/202/320/270/321/210/320/267/320/263/321/205/342/226/222/320/222.py +95 -0
  69. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/342/225/241/320/233/321/210/320/277/320/245//321/206/342/225/241/320/233/321/210/320/277/320/245/321/207/342/225/227/320/224/321/205/320/240/320/230.py +30 -0
  70. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240/__init__.py +0 -0
  71. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/205/320/275/320/240/321/206/320/263/320/233/321/206/320/263/320/233/321/210/342/226/221/342/226/222/1.json +11 -0
  72. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/233/342/225/235/321/205/320/253/342/225/233.py +17 -0
  73. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/210/342/226/222/320/261/321/206/320/263/320/233.py +21 -0
  74. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/206/320/247/320/265/321/205/320/236/320/226/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +21 -0
  75. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/211/320/252/320/237/321/210/342/225/221/320/273/321/204/342/225/221/320/244/321/205/320/275/320/240/321/206/320/263/320/233.py +58 -0
  76. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227/__init__.py +0 -0
  77. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/204/342/225/225/320/231/321/205/320/236/320/257/321/210/320/231/342/226/223/321/207/342/225/227/320/250/321/205/320/253/342/225/233.py +19 -0
  78. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/205/320/220/320/242/321/205/342/225/234/342/226/222/321/206/320/245/320/230/321/206/320/256/320/254.py +21 -0
  79. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/205/320/240/320/224/321/205/320/253/342/225/234/321/205/320/253/342/225/234/321/206/320/247/320/247.py +102 -0
  80. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/206/320/270/320/261/321/206/320/255/342/224/220/321/210/342/225/242/320/225/321/207/342/225/221/320/267/321/207/320/236/320/253/321/204/342/225/225/342/225/234.py +21 -0
  81. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/207/320/273/320/233/321/204/342/225/234/320/243/321/206/320/245/320/230/321/206/320/256/320/254/321/207/320/240/320/223.py +54 -0
  82. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/320/277/320/224/321/205/320/230/320/226/321/210/320/261/320/270/321/206/320/223/320/225/321/205/320/234/320/225.py +13 -0
  83. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/342/225/242/320/225/321/207/342/225/221/320/267/321/207/320/236/320/253/321/204/342/225/225/342/225/234.py +539 -0
  84. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240/__init__.py +0 -0
  85. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222_/321/204/342/225/234/320/236/321/211/320/257/342/224/202/321/210/342/226/221/342/226/222/321/210/320/261/320/270.py +48 -0
  86. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222_/321/205/320/264/320/267/321/210/342/226/221/342/226/222/321/210/320/261/320/270.py +48 -0
  87. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222_/321/211/320/273/320/250/321/211/320/257/342/224/202/321/210/342/226/221/342/226/222/321/210/320/261/320/270.py +48 -0
  88. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243/__init__.py +0 -0
  89. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243/_/321/210/320/277/342/224/244/321/206/320/250/320/236.txt +5 -0
  90. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/204/342/225/221/320/226/321/210/320/267/320/263/321/206/320/253/342/224/244/321/205/320/264/320/252/321/205/320/232/320/257/321/210/320/223/342/225/234.py +272 -0
  91. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/225/342/226/222/321/207/320/244/320/270/__init__.py +0 -0
  92. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/225/342/226/222/321/207/320/244/320/270//321/205/320/253/342/225/234/321/205/320/276/342/225/242/321/207/320/276/320/220/321/207/320/260/320/221.py +261 -0
  93. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/225/342/226/222/321/207/320/244/320/270//321/210/320/277/320/247/321/207/342/225/227/320/237/321/211/320/253/320/226.py +114 -0
  94. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/230/320/255/321/205/320/275/320/266/321/206/320/270/320/261/321/206/320/255/342/224/220.py +51 -0
  95. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226/__init__.py +0 -0
  96. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/246/321/207/320/245/320/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276.py +112312 -0
  97. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276.py +23337 -0
  98. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276.py +25 -0
  99. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +194 -0
  100. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +77 -0
  101. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237/__init__.py +0 -0
  102. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/204/342/225/225/320/232/321/210/342/225/221/320/273/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  103. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/225/320/223/321/207/342/224/244/320/260/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +78 -0
  104. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/240/320/236/321/205/320/237/320/241/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +30 -0
  105. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/250/342/224/244/321/205/342/225/226/342/224/244/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  106. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/225/320/223/321/207/342/224/244/320/260.py +728 -0
  107. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +287 -0
  108. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/205/320/276/320/252/321/204/342/225/243/320/231.py +371 -0
  109. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/270/320/261/321/206/320/255/342/224/220/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +321 -0
  110. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/270/320/261/321/206/320/255/342/224/220/321/207/320/244/320/257/321/206/320/230/320/240/321/205/320/251/320/270.py +340 -0
  111. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +334 -0
  112. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +46 -0
  113. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/211/320/223/320/270/321/204/342/225/227/342/225/242.py +115 -0
  114. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/211/320/262/320/254/321/210/320/231/342/226/223/321/205/320/276/320/252/321/204/342/225/243/320/231.py +234 -0
  115. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/237/320/241/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  116. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/342/225/225/342/225/234/321/205/320/275/320/240/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  117. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/207/320/276/342/226/222.py +12 -0
  118. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/207/320/254/320/231/321/206/320/277/320/253/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  119. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/207/320/254/342/225/235/321/207/320/255/320/253/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  120. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/207/320/254/342/225/235/321/211/320/245/320/254/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  121. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/220/342/224/202/321/206/320/254/342/225/241/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  122. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/223/320/234/321/206/320/251/320/277/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  123. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/223/320/261/321/211/320/261/342/225/227/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  124. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/263/320/225/321/211/320/265/342/226/221/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  125. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/211/320/255/320/262/321/211/320/223/320/270/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  126. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/211/342/225/235/342/225/227/321/205/320/275/320/240/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  127. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260/__init__.py +0 -0
  128. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/204/342/225/234/320/254/321/206/320/246/320/227/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220.py +78 -0
  129. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/244/342/226/221/321/205/320/275/320/247/321/206/320/260/342/225/235/321/205/320/275/320/247/321/205/342/225/225/320/246/321/206/320/270/320/261/321/206/320/255/342/224/220.py +175 -0
  130. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/273/320/246/321/206/320/236/320/242/321/204/342/225/243/320/266/321/206/342/224/202/320/245.py +32 -0
  131. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/210/320/233/342/226/222/321/210/320/277/320/275/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220.py +37 -0
  132. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/211/320/273/320/250/321/206/342/225/225/320/225/321/207/320/244/342/225/241/321/205/320/275/320/240/321/204/342/225/243/320/266/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +416 -0
  133. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261/__init__.py +0 -0
  134. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/205/342/225/221/320/232.py +0 -0
  135. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/230/342/224/220/321/211/320/247/342/224/244.py +286 -0
  136. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/257/320/254/321/205/320/275/320/240.py +0 -0
  137. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/261/320/234/321/205/320/275/320/240.py +0 -0
  138. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/264/320/225/321/205/320/275/320/240.py +0 -0
  139. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/211/320/242/320/262/321/207/320/240/342/224/244.py +0 -0
  140. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/342/225/226/320/265/321/204/342/225/234/320/254/__init__.py +0 -0
  141. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/342/225/226/320/265/321/204/342/225/234/320/254//321/205/320/254/320/226/321/205/342/225/234/320/262/321/205/320/235/342/226/221/321/207/320/273/320/260/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +121 -0
  142. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/205/342/225/226/320/265/__init__.py +0 -0
  143. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/227/320/260/321/204/342/225/234/320/245/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +118 -0
  144. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/342/225/243/342/224/202/321/211/320/255/320/262/321/207/320/273/320/233/321/204/342/225/234/320/243/321/207/320/244/342/225/227.py +66 -0
  145. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221/__init__.py +0 -0
  146. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/320/277/320/226/321/205/342/225/221/320/266/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +103 -0
  147. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/342/225/233/320/276/321/204/342/224/220/320/261/321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263.py +243 -0
  148. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/223/320/237/321/207/342/224/244/320/260/321/210/320/231/342/225/221/321/206/320/254/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +172 -0
  149. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/227/320/260/321/204/342/225/234/320/245/321/205/320/253/342/225/233/321/205/342/225/234/320/262/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +82 -0
  150. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/232/320/270/321/206/342/225/235/320/273/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +41 -0
  151. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/235/320/245/321/210/320/231/342/226/223/321/210/320/223/320/234/321/206/320/251/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +45 -0
  152. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/264/320/246/321/205/320/263/342/224/202/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +241 -0
  153. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/267/320/243/321/206/342/226/221/320/237/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +63 -0
  154. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +41 -0
  155. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/207/320/257/320/271/321/211/320/250/342/225/241/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +188 -0
  156. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +43 -0
  157. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/226/222/320/237/321/205/342/225/243/320/245/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +170 -0
  158. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +80 -0
  159. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +143 -0
  160. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/211/320/227/320/235/321/205/320/264/320/235/321/206/342/225/225/320/240/321/210/342/224/220/320/241/321/210/320/231/342/226/223/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +67 -0
  161. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/211/320/244/320/221/321/205/342/226/222/320/237/321/207/320/244/342/225/227/321/211/320/255/320/262.py +68 -0
  162. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/251/342/225/221/321/210/320/223/342/225/234/321/206/320/231/320/233/321/206/320/254/342/225/221/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +64 -0
  163. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/207/320/244/342/225/241/321/210/320/267/320/226/321/204/342/224/220/320/261/321/205/320/237/342/225/226/321/206/342/225/241/320/233/321/210/320/277/320/245/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +76 -0
  164. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/245/342/226/221/321/205/320/275/320/266/__init__.py +0 -0
  165. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/245/342/226/221/321/205/320/275/320/266//321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +84 -0
  166. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/245/342/226/221/321/205/320/275/320/266//321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +43 -0
  167. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240/__init__.py +0 -0
  168. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/233/342/225/235/321/205/320/253/342/225/233.py +362 -0
  169. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/210/342/226/222/320/261/321/206/320/263/320/233.py +323 -0
  170. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/206/320/247/320/265/321/205/320/236/320/226/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +177 -0
  171. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/207/320/244/342/225/241/321/210/320/267/320/226/321/204/342/224/220/320/261/321/205/320/237/342/225/226/321/206/342/225/241/320/233/321/210/320/277/320/245/321/205/320/253/342/225/233/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +248 -0
  172. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/207/342/225/221/342/225/225/321/207/320/274/320/244/321/204/342/225/221/320/244/321/205/320/275/320/240/321/206/320/263/320/233.py +244 -0
  173. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/211/342/225/221/342/225/227/321/205/342/226/221/320/226/321/207/320/231/320/234.py +121 -0
  174. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227/__init__.py +0 -0
  175. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/204/342/225/225/320/231/321/205/320/236/320/257/321/210/320/231/342/226/223/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +144 -0
  176. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/204/342/225/225/320/231/321/206/320/254/320/230/321/204/342/225/225/320/231/321/205/320/253/342/225/233/321/206/320/260/320/227/321/210/320/276/342/225/233/321/210/320/276/320/261.py +77 -0
  177. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/205/320/264/320/272/321/206/320/256/320/221/321/205/320/253/342/225/233/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +59 -0
  178. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/206/320/231/320/233/321/206/320/254/342/225/221/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/210/320/231/342/225/221/321/206/320/254/320/277/321/207/320/244/342/225/227.py +215 -0
  179. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +64 -0
  180. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243/321/205/320/253/342/225/233/321/206/320/260/320/227/321/210/320/276/342/225/233/321/210/320/276/320/261.py +46 -0
  181. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/320/263/342/225/225/321/207/320/254/342/225/2353D/321/205/320/253/342/225/233.py +56 -0
  182. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/320/277/320/224/321/205/320/230/320/226/321/210/320/261/320/270/321/206/320/223/320/225/321/205/320/234/320/225.py +75 -0
  183. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/342/225/242/320/225/321/207/342/225/221/320/267/321/207/320/236/320/253/321/204/342/225/225/342/225/234/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +577 -0
  184. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/211/320/257/342/224/202/321/204/342/225/243/320/240/__init__.py +0 -0
  185. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220.py +164 -0
  186. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/PDF/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +317 -0
  187. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/SVG/321/205/320/253/342/225/233/321/207/320/231/320/227/321/207/342/224/244/320/262/321/205/342/225/235/320/245/321/205/320/253/342/225/233.py +73 -0
  188. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/SVG/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/342/225/234/320/274/321/205/320/225/320/223/321/207/342/224/244/320/260.py +325 -0
  189. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/_SVG/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/342/225/234/320/274/321/205/320/225/320/223/321/207/342/224/244/320/260.py +151 -0
  190. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/__init__.py +16 -0
  191. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/_/321/210/320/277/342/224/244/321/206/320/250/320/236.txt +2 -0
  192. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/cairosvg/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +81 -0
  193. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/204/342/225/225/320/275/321/206/320/246/320/227/321/207/342/225/235/320/246/321/207/320/270/320/233/321/205/320/276/320/252/321/204/342/225/243/320/231.py +356 -0
  194. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/220/320/242/321/210/320/267/320/242/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +217 -0
  195. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243/__init__.py +23 -0
  196. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260.py +1269 -0
  197. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_SVG/321/205/320/253/342/225/233.py +45 -0
  198. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/253/342/225/233.py +233 -0
  199. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/253/342/225/233/321/206/320/261/320/230.py +62 -0
  200. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/254/320/226.py +78 -0
  201. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/264/320/235/321/207/320/244/320/270.py +72 -0
  202. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/264/320/252/321/210/342/225/233/342/225/243/321/205/342/225/234/320/262.py +88 -0
  203. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/232/320/250/321/207/342/225/221/342/224/220.py +71 -0
  204. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/246/320/227/321/205/320/275/320/247.py +239 -0
  205. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/260/320/227/321/210/320/276/342/226/221.py +18 -0
  206. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/264/320/275/321/205/320/254/320/226.py +79 -0
  207. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/270/320/261/321/206/320/255/342/224/220.py +119 -0
  208. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/207/320/257/320/271/321/205/342/225/234/320/262.py +92 -0
  209. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/207/342/225/221/342/224/220.py +76 -0
  210. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/207/342/225/227/320/224.py +124 -0
  211. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/210/320/263/320/221/321/205/320/231/320/272.py +48 -0
  212. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/210/342/225/226/320/277/321/205/342/225/233/320/224.py +1786 -0
  213. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/210/342/225/226/320/277/321/205/342/225/233/320/224/321/206/320/246/320/227/321/205/320/275/320/247.py +119 -0
  214. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/211/320/221/320/276/321/207/342/225/234/320/271.py +75 -0
  215. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/211/320/243/342/225/233/321/206/320/236/320/265.py +39 -0
  216. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/210/342/225/234/320/274/321/210/342/225/226/320/277/321/205/342/225/233/320/224/321/206/320/244/320/277/321/206/320/234/320/221.py +14 -0
  217. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/237/320/277/321/206/320/243/320/235/321/204/342/225/234/320/254/321/205/320/225/320/223/321/207/342/224/244/320/260/321/211/320/253/320/226/321/205/320/240/320/230.py +98 -0
  218. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/206/342/225/225/320/240/321/205/320/237/320/250/321/210/320/231/342/226/223.py +67 -0
  219. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +86 -0
  220. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/206/320/236/320/242/321/205/320/230/320/247/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +178 -0
  221. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/211/320/227/320/235/321/205/320/264/320/235/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +270 -0
  222. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/232/320/270/321/207/320/244/342/225/227/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +477 -0
  223. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/235/342/226/221/321/207/320/273/320/260/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +354 -0
  224. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/237/320/250/321/206/320/235/320/262/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +115 -0
  225. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/237/320/250/321/206/320/235/320/262/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226_/321/204/342/224/220/320/255/321/207/320/245/320/251.py +419 -0
  226. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/253/342/225/233/321/205/320/223/320/237/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +468 -0
  227. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/204/342/225/234/320/243/321/206/320/257/320/265/321/206/320/231/342/225/233/321/205/320/251/320/270.py +321 -0
  228. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/204/342/225/234/320/243/321/206/320/257/320/265/321/207/320/254/320/233/321/207/342/224/244/320/262/321/205/342/225/235/320/245/321/211/320/261/342/225/241/321/207/320/244/320/257/321/206/320/230/320/240.py +169 -0
  229. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/204/342/225/234/320/243/321/206/320/260/342/225/226/321/205/342/225/235/320/237.css +36 -0
  230. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/207/320/274/320/266/321/204/342/225/225/342/226/223/321/205/320/230/320/247/321/210/320/261/320/270.py +2680 -0
  231. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/276/320/252/321/204/342/225/243/320/231/321/211/320/253/320/226.py +974 -0
  232. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/342/225/234/320/262/321/207/320/232/342/225/242/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +220 -0
  233. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/231/342/225/243/321/211/320/227/320/237zip/321/210/320/267/320/263/321/205/320/236/320/233.py +82 -0
  234. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +132 -0
  235. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/246/320/227/321/205/320/275/320/247/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +170 -0
  236. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/260/342/225/226/321/205/342/225/235/320/237/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +500 -0
  237. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/342/225/227/320/264/321/211/320/245/320/254/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +392 -0
  238. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/342/225/242/320/230/321/206/320/221/320/277/321/206/320/261/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +88 -0
  239. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/231/342/225/243/321/206/320/276/320/232/321/207/320/274/320/266/321/205/320/237/342/225/226.md +90 -0
  240. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +73 -0
  241. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +3172 -0
  242. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +1793 -0
  243. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/274/320/266/321/205/320/237/342/225/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +34 -0
  244. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/342/225/221/342/224/220/321/206/320/255/320/261/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +423 -0
  245. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/342/226/222/342/225/227/321/205/320/256/320/233/321/210/342/225/234/320/274/321/206/320/235/320/262/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +30 -0
  246. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/210/342/225/226/320/277/321/205/342/225/233/320/224/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +633 -0
  247. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/211/320/220/320/252/321/207/320/244/320/270/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +501 -0
  248. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/211/320/225/320/235/321/207/342/225/234/320/276.py +42 -0
  249. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/205/320/253/342/225/234/321/206/320/247/320/247//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/253/342/225/234/321/206/320/247/320/247.svg +47 -0
  250. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263/4g.svg +3 -0
  251. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263/5g.svg +3 -0
  252. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263/hd.svg +45 -0
  253. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/204/342/224/220/320/261/321/205/320/237/342/225/226.svg +3 -0
  254. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/205/320/262/320/256/321/205/320/232/320/260.svg +5 -0
  255. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/206/320/231/320/233/321/207/320/244/342/225/241/321/207/320/275/320/242.svg +17 -0
  256. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/206/320/255/320/265/321/207/320/244/342/225/241.svg +5 -0
  257. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/244/342/225/241/321/206/342/226/222/320/260.svg +6 -0
  258. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/253/342/225/225/321/206/320/254/342/225/221.svg +24 -0
  259. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/254/342/225/235/321/207/320/255/320/253.svg +4 -0
  260. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/274/320/241/321/210/320/224/342/225/225.svg +6 -0
  261. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/210/320/243/320/255/321/207/320/231/320/251.svg +2 -0
  262. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/210/320/277/320/275/321/211/320/257/342/224/202.svg +1 -0
  263. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/210/342/224/220/320/240/321/205/320/232/320/270/321/211/320/256/320/233.svg +16 -0
  264. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/211/320/244/320/221.svg +17 -0
  265. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2261.svg +2 -0
  266. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2262.svg +2 -0
  267. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2263.svg +2 -0
  268. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2264.svg +2 -0
  269. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2265.svg +2 -0
  270. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2266_black.svg +2 -0
  271. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2266_red.svg +2 -0
@@ -0,0 +1,1793 @@
1
+ # -*- coding:utf-8 -*-
2
+ # title :
3
+ # description :
4
+ # author :Python超人/三月三提供
5
+ # date :2024-06-01
6
+ # link :https://gitee.com/march3
7
+ # python_version :3.9
8
+ # ==============================================================================
9
+ import svgwrite
10
+ import xml.etree.ElementTree as ET
11
+ import os
12
+ import re
13
+
14
+ from 神笔码靓.神笔库.定义集 import *
15
+ from 神笔码靓.神笔库.通用工具集 import *
16
+
17
+
18
+ class 神笔绘图板工具:
19
+ PATH_COMMANDS_MAPPINGS = {
20
+ "移动": "M", # x, y
21
+ "移动到": "M", # x, y
22
+ "直线": "L", # x, y
23
+ "水平直线": "H", # x
24
+ "水平线": "H", # x
25
+ "垂直直线": "V", # y
26
+ "垂直线": "V", # y
27
+ "曲线": "C", # (x1, y1), (x2, y2), (x, y)
28
+ "平滑曲线": "S", # (x2, y2), (x, y)
29
+ "二次贝塞尔曲线": "Q", # (x2, y2), (x, y)
30
+ "平滑的二次贝塞尔曲线": "T", # x, y
31
+ "椭圆弧线": "A", # (rx, ry), x_axis_rotation, (large_arc_flag, sweep_flag), (x, y)
32
+ "关闭路径": "Z",
33
+ "闭合路径": "Z",
34
+ "关闭": "Z",
35
+ "闭合": "Z",
36
+
37
+ # 扩展支持
38
+ "倒角": "倒角", # 倒角长度
39
+ "倒圆角": "倒圆角", # 倒角半径, 方向
40
+ "圆弧线": "圆弧线",
41
+ # "矩形", "绘制矩形", "rect" 开始X, 开始Y, 宽度, 高度, 顺时针
42
+ }
43
+
44
+ @staticmethod
45
+ def 获取SVG图片大小(SVG文件):
46
+ # 打开SVG文件
47
+ tree = ET.parse(SVG文件)
48
+ root = tree.getroot()
49
+
50
+ width = root.get('width')
51
+ height = root.get('height')
52
+ if width is None or height is None:
53
+ x, y, width, height = root.get("viewBox").split(" ")
54
+ # 尺寸单位换算公式大全
55
+ # 1. 像素(px)与厘米(cm)的换算公式
56
+ # 在设计中,经常需要将像素转换为厘米或将厘米转换为像素。其换算公式为:
57
+ # 厘米 = 像素 ÷ dpi * 2.54
58
+ # 像素 = 厘米 ÷ 2.54 * dpi
59
+ # 其中,dpi为每英寸显示器点数,常见值为72、96、150、300等。需要根据具体情况进行判断,以得到精确的结果。
60
+ # 2. 像素(px)与点(pt)的换算公式
61
+ # 像素和点是两个常用的尺寸单位,它们的换算公式为:
62
+ # 像素 = 点 ÷ 72 * dpi
63
+ # 点 = 像素 ÷ dpi * 72
64
+ # 其中,dpi的值与第一节中的相同。
65
+ # 3. 英寸(in)与厘米(cm)的换算公式
66
+ # 英寸是比较普遍的尺寸单位,而在国内,厘米也是常用的单位。其换算公式为:
67
+ # 英寸 = 厘米 ÷ 2.54
68
+ # 厘米 = 英寸 * 2.54
69
+ # 4. 毫米(mm)与英寸(in)的换算公式
70
+ # 毫米也是常用的尺寸单位之一,它与英寸的换算关系为:
71
+ # 毫米 = 英寸 × 25.4
72
+ # 英寸 = 毫米 ÷ 25.4
73
+ # 5. 点(pt)与毫米(mm)的换算公式
74
+ # 点是一种常见的排版单位,而毫米也是广泛使用的长度单位之一。它们的换算公式为:
75
+ # 点 = 毫米 ÷ 25.4 × 72
76
+ # 毫米 = 点 ÷ 72 × 25.4
77
+ # 6. 厘米(cm)与磅(pt)的换算公式
78
+ # 磅是一种在排版中比较常见的单位,那么它与厘米又该如何换算呢?其公式为:
79
+ # 磅 = 厘米 ÷ 2.54 × 72
80
+ # 厘米 = 磅 ÷ 72 × 2.54
81
+ # 7. 毫米(mm)与磅(pt)的换算公式
82
+ # 之前提到,毫米是可以用作长度单位的。它与磅的换算关系为:
83
+ # 磅 = 毫米 ÷ 25.4 × 72
84
+ # 毫米 = 磅 ÷ 72 × 25.4
85
+ # 8. 像素(px)、点(pt)和磅(pt)之间的换算公式
86
+ # 在数字排版时,常常需要将其它尺寸单位转换为像素、点或磅等单位。它们之间的换算公式如下所示:
87
+ # 1像素(px) = 1点(pt) = 0.75磅 像素 = 点 ÷ 72 * dpi
88
+ if width.endswith("pt"):
89
+ # 1像素=0.75pt = 0.2645833333333333mm = 0.02645833333333333cm = 1REM
90
+ width = float(width.strip('pt')) / 0.75
91
+ height = float(height.strip('pt')) / 0.75
92
+ # 增加其他的单位和px换算的代码 1in = 2.54cm = 25.4 mm = 72pt = 6pc
93
+ # elif width.endswith("cm"): # 以下代码AI生成,需要验证
94
+ # width = float(width.strip('cm'))*2.54
95
+ # height = float(height.strip('cm'))*2.54
96
+ # elif width.endswith("mm"):
97
+ # width = float(width.strip('mm'))*2.54
98
+ # height = float(height.strip('mm'))*2.54
99
+ # elif width.endswith("in"):
100
+ # width = float(width.strip('in'))*2.54*72
101
+ # height = float(height.strip('in'))*2.54*72
102
+ # elif width.endswith("pc"):
103
+ # width = float(width.strip('pc'))*2.54*12
104
+ # height = float(height.strip('pc'))*2.54*12
105
+ elif width.endswith("px"):
106
+ width = float(width.strip('px'))
107
+ height = float(height.strip('px'))
108
+ else:
109
+ width = float(width)
110
+ height = float(height)
111
+
112
+ return width, height
113
+
114
+ @staticmethod
115
+ def 缩放SVG图片_(SVG文件, 缩放=2.0, 缩放后SVG文件=None):
116
+ tree = ET.parse(SVG文件)
117
+ root = tree.getroot()
118
+
119
+ if 缩放后SVG文件 is None:
120
+ 缩放后SVG文件 = SVG文件[:-4] + f"{缩放}.svg"
121
+
122
+ # 获取SVG的宽度和高度
123
+ width = float(root.get('width').strip('px'))
124
+ height = float(root.get('height').strip('px'))
125
+ # 修改SVG的缩放比例
126
+ root.set('width', str(width * 缩放) + 'px')
127
+ root.set('height', str(height * 缩放) + 'px')
128
+
129
+ # 保存修改后的SVG文件
130
+ tree.write(缩放后SVG文件)
131
+
132
+ @staticmethod
133
+ def 缩放SVG图片(SVG文件, 缩放, 缩放后SVG文件=None):
134
+ if 缩放 == 1:
135
+ svg_width, svg_height = 神笔绘图板工具.获取SVG图片大小(SVG文件)
136
+ return SVG文件, (svg_width, svg_height)
137
+
138
+ if 缩放后SVG文件 is None:
139
+ 缩放后SVG文件 = SVG文件[:-4] + f"{缩放}.svg"
140
+
141
+ 缩放后SVG文件, svg_size = 神笔绘图板工具._scale_svg(SVG文件, 缩放, 缩放后SVG文件) # 放大 2 倍
142
+
143
+ # with open(缩放后SVG文件, 'w', encoding="UTF-8") as f:
144
+ # f.write(scaled_svg)
145
+ # print(缩放后SVG文件, f"已放大{缩放}倍")
146
+ return 缩放后SVG文件, svg_size
147
+
148
+ @staticmethod
149
+ def 获取元素的坐标信息(对象元素):
150
+ if hasattr(对象元素, "attribs"):
151
+ if "x" in 对象元素.attribs:
152
+ elm_x = float(str(对象元素['x']).strip("px"))
153
+ else:
154
+ elm_x = None
155
+ if "y" in 对象元素.attribs:
156
+ elm_y = float(str(对象元素['y']).strip("px"))
157
+ else:
158
+ elm_y = None
159
+ if 'width' in 对象元素.attribs:
160
+ elm_width = 对象元素['width']
161
+ else:
162
+ elm_width = None
163
+ if 'height' in 对象元素.attribs:
164
+ elm_height = 对象元素['height']
165
+ else:
166
+ elm_height = None
167
+ else:
168
+ elm_x, elm_y, elm_width, elm_height = None, None, None, None
169
+
170
+ if elm_x is None or elm_y is None or elm_width is None or elm_height is None:
171
+ if not hasattr(对象元素, "elementname"):
172
+ return None
173
+ _对象元素 = 对象元素
174
+ if 对象元素.elementname == "use":
175
+ return 神笔绘图板工具.获取元素的坐标信息(对象元素.href)
176
+ # if 对象元素.elementname == 'symbol':
177
+ # return
178
+ if _对象元素.elementname in ["g", "symbol"]:
179
+ return 神笔绘图板工具._get_group_bbox(_对象元素)
180
+ elif _对象元素.elementname == "path":
181
+ return 神笔绘图板工具._get_path_bbox(_对象元素)
182
+ elif _对象元素.elementname == "ellipse":
183
+ return 神笔绘图板工具._get_ellipse_bbox(_对象元素)
184
+ elif _对象元素.elementname == "circle":
185
+ return 神笔绘图板工具._get_circle_bbox(_对象元素)
186
+ elif _对象元素.elementname == "text":
187
+ return 神笔绘图板工具._get_text_bbox(_对象元素)
188
+ elif _对象元素.elementname == "use":
189
+ return None
190
+ else:
191
+ raise Exception(f"elementname = {_对象元素.elementname}")
192
+ else:
193
+ return (elm_x, elm_y), (elm_width + elm_x, elm_height + elm_y)
194
+
195
+ @staticmethod
196
+ def split_decimals(num_str):
197
+ parts = []
198
+ dot_positions = [i for i, char in enumerate(num_str) if char == '.']
199
+ if len(dot_positions) > 1:
200
+ first_part = num_str[:dot_positions[0]] + '.' + num_str[dot_positions[0] + 1:dot_positions[1]]
201
+ second_part = '0.' + num_str[dot_positions[1] + 1:]
202
+ parts.append(first_part)
203
+ if second_part.count('.') > 1:
204
+ vals = 神笔绘图板工具.split_decimals(second_part)
205
+ parts += vals
206
+ else:
207
+ parts.append(second_part)
208
+
209
+ return parts
210
+
211
+ @staticmethod
212
+ def path_d_split(data):
213
+ cmd_arg_num_dict = {
214
+ "m": 2, "l": 2, "t": 2,
215
+ "q": 4, "s": 4,
216
+ "c": 6, "a": 7, "h": 1, "v": 1
217
+ }
218
+
219
+ commands = re.findall(r'[mltqscahvzMLTQSCAHVZ][^mltqscahvzMLTQSCAHVZ]*', data)
220
+ split_commands = []
221
+ for command in commands:
222
+ cmd_tag = command[0]
223
+ cmd_vals = command[1:]
224
+ # 处理小数
225
+ cmd_vals = cmd_vals.replace("-.", "-0.").replace(",.", ",0.").replace(" .", " 0."). \
226
+ replace("-", " -").replace(",", " ").replace(" ", " ").replace(" ", " ")
227
+
228
+ vals = cmd_vals.split(" ")
229
+ vals = [v for v in vals if v != '']
230
+ _vals = []
231
+ for val in vals:
232
+ if val.count('.') >= 2:
233
+ _vals += 神笔绘图板工具.split_decimals(val)
234
+ else:
235
+ _vals.append(val)
236
+
237
+ vals = _vals
238
+
239
+ cmd_arg_num = cmd_arg_num_dict.get(cmd_tag.lower(), None)
240
+ if cmd_arg_num is None:
241
+ split_commands.append(command)
242
+ elif len(vals) > cmd_arg_num:
243
+ vi = 0
244
+ for v in range(0, len(vals), cmd_arg_num):
245
+ cmd_text = cmd_tag
246
+ for i in range(cmd_arg_num):
247
+ try:
248
+ if i % 2 == 0:
249
+ cmd_text += f"{vals[vi]},"
250
+ else:
251
+ cmd_text += f"{vals[vi]} "
252
+ except Exception as e:
253
+ pass
254
+ vi += 1
255
+ split_commands.append(str(cmd_text).strip())
256
+ elif len(vals) == cmd_arg_num:
257
+ cmd_text = cmd_tag
258
+ for i in range(cmd_arg_num):
259
+ if i % 2 == 0:
260
+ cmd_text += f"{vals[i]},"
261
+ else:
262
+ cmd_text += f"{vals[i]} "
263
+ split_commands.append(str(cmd_text).strip())
264
+ else:
265
+ split_commands.append(command)
266
+
267
+ # print(split_commands)
268
+ return split_commands
269
+
270
+ @staticmethod
271
+ def _矩形转SVG绘制路径命令(命令):
272
+ 命令集 = []
273
+ 命令ID, 开始X, 开始Y, 宽度, 高度, *顺时针 = 命令
274
+ if len(顺时针) == 0:
275
+ 顺时针 = True
276
+ else:
277
+ 顺时针 = 顺时针[0] in ["顺时针", True]
278
+
279
+ 命令集.append(("M", 开始X, 开始Y))
280
+
281
+ if 顺时针:
282
+ 命令集.append(("H", 开始X + 宽度))
283
+ 命令集.append(("V", 开始Y + 高度))
284
+ 命令集.append(("H", 开始X))
285
+ 命令集.append(("Z",))
286
+ else:
287
+ 命令集.append(("V", 开始Y + 高度))
288
+ 命令集.append(("H", 开始X + 宽度))
289
+ 命令集.append(("V", 开始Y))
290
+ 命令集.append(("Z",))
291
+
292
+ return 命令集
293
+
294
+ @staticmethod
295
+ def 转SVG绘制路径命令(路径点列表):
296
+
297
+ # M = moveto 移动到指定位置
298
+ # L = lineto 绘制直线
299
+ # H = horizontal lineto 绘制水平直线
300
+ # V = vertical lineto 绘制垂直直线
301
+ # C = curveto 绘制曲线
302
+ # S = smooth curveto 绘制平滑曲线
303
+ # Q = quadratic Bézier curve 绘制二次贝塞尔曲线
304
+ # T = smooth quadratic Bézier curveto 绘制平滑的二次贝塞尔曲线
305
+ # A = elliptical Arc 绘制椭圆弧线
306
+ # Z = closepath 关闭路径
307
+ SVG路径点列表 = []
308
+ for cmd_idx, cmd in enumerate(路径点列表):
309
+ def 获取倒角的三个点():
310
+ prev2_cmd = list(SVG路径点列表[-2])
311
+ prev_cmd = list(SVG路径点列表[-1])
312
+ next_cmd = list(路径点列表[cmd_idx + 1])
313
+ return prev2_cmd, prev_cmd, next_cmd
314
+
315
+ if isinstance(cmd, str):
316
+ cmd_list = [cmd]
317
+ else:
318
+ cmd_list = list(cmd)
319
+
320
+ if str(cmd_list[0]).lower() in ["矩形", "绘制矩形", "rect"]:
321
+ 命令集 = 神笔绘图板工具._矩形转SVG绘制路径命令(cmd_list)
322
+ for 命令 in 命令集:
323
+ SVG路径点列表.append(tuple(命令))
324
+ else:
325
+ cmd_list[0] = 神笔绘图板工具.PATH_COMMANDS_MAPPINGS.get(cmd_list[0], cmd_list[0])
326
+ cmd_args = cmd_list[1:]
327
+ if cmd_list[0] in ["倒角"]:
328
+ 倒角半径 = cmd_list[1]
329
+ prev2_cmd, prev_cmd, next_cmd = 获取倒角的三个点()
330
+
331
+ from 神笔码靓.神笔库.倒角工具集 import 计算倒圆角切点坐标
332
+ 起点, 终点, 角度方向 = 计算倒圆角切点坐标((prev2_cmd[1], prev2_cmd[2]), (prev_cmd[1], prev_cmd[2]),
333
+ (next_cmd[1], next_cmd[2]), 倒角半径)
334
+
335
+ prev_cmd = prev_cmd[0], 起点.x, 起点.y
336
+ SVG路径点列表[-1] = prev_cmd
337
+ 路径点列表[cmd_idx + 1] = next_cmd
338
+ SVG路径点列表.append(("L", 终点.x, 终点.y))
339
+
340
+ elif cmd_list[0] in ["倒圆角"]:
341
+ 倒角半径, *方向 = cmd_list[1:]
342
+ if len(方向) == 0:
343
+ 方向 = None
344
+ else:
345
+ 方向 = 方向[0]
346
+ prev2_cmd, prev_cmd, next_cmd = 获取倒角的三个点()
347
+
348
+ from 神笔码靓.神笔库.倒角工具集 import 计算倒圆角切点坐标
349
+ 起点, 终点, 角度方向 = 计算倒圆角切点坐标((prev2_cmd[1], prev2_cmd[2]), (prev_cmd[1], prev_cmd[2]),
350
+ (next_cmd[1], next_cmd[2]), 倒角半径)
351
+
352
+ if 方向 is None:
353
+ 方向 = 1 if 角度方向 else 0
354
+ # else:
355
+ # 方向 = 1
356
+
357
+ prev_cmd = prev_cmd[0], 起点.x, 起点.y
358
+ SVG路径点列表[-1] = prev_cmd
359
+ 路径点列表[cmd_idx + 1] = next_cmd
360
+ 是否大弧 = 0
361
+ SVG路径点列表.append(("A", 倒角半径, 倒角半径, 0, 是否大弧, 方向, 终点.x, 终点.y))
362
+ elif cmd_list[0] in ["圆弧线"]:
363
+ if len(cmd_list[1:]) == 4:
364
+ 倒角半径, 方向, x, y = cmd_list[1:]
365
+ 是否大弧 = 0
366
+ elif len(cmd_list[1:]) == 5:
367
+ 倒角半径, 方向, x, y, 是否大弧 = cmd_list[1:]
368
+ if 是否大弧 == True or 是否大弧 == 1:
369
+ 是否大弧 = 1
370
+ else:
371
+ 是否大弧 = 0
372
+ if 方向 != 0:
373
+ 方向 = 1
374
+ SVG路径点列表.append(("A", 倒角半径, 倒角半径, 0, 是否大弧, 方向, x, y))
375
+ else:
376
+ SVG路径点列表.append(tuple(cmd_list))
377
+
378
+ return SVG路径点列表
379
+
380
+ #
381
+ # @staticmethod
382
+ # def path_d_split(d):
383
+ # cmds = 神笔绘图板工具.split_commands_step_1(d)
384
+ # return 神笔绘图板工具.split_command_step_2(cmds)
385
+
386
+ @staticmethod
387
+ def 绝对坐标转相对坐标(path_cmds):
388
+ # Uppercase commands indicates absolute coordinates,
389
+ # lowercase commands indicates relative coordinates
390
+ commands = ['M', 'L', 'H', 'V', 'C', 'S', 'Q', 'T', 'A', 'Z']
391
+ commands_upper = [c.upper() for c in commands]
392
+ commands_lower = [c.lower() for c in commands]
393
+ # commands = commands_upper + commands_lower
394
+ current_x = 0
395
+ current_y = 0
396
+ new_path_cmds = []
397
+ for idx, cmd in enumerate(path_cmds):
398
+ cmd = 神笔绘图板工具._fixed_d(cmd, idx)
399
+ cmd_tag = cmd[0]
400
+
401
+ if idx > 0:
402
+ if cmd_tag in ["V"]:
403
+ current_y = 0
404
+ elif cmd_tag in ["H"]:
405
+ current_x = 0
406
+ elif cmd_tag in commands_upper:
407
+ current_x, current_y = 0, 0
408
+ # M = moveto 移动到指定位置
409
+ # L = lineto 绘制直线
410
+ # H = horizontal lineto 绘制水平直线
411
+ # V = vertical lineto 绘制垂直直线
412
+ # C = curveto 绘制曲线
413
+ # S = smooth curveto 绘制平滑曲线
414
+ # Q = quadratic Bézier curve 绘制二次贝塞尔曲线
415
+ # T = smooth quadratic Bézier curveto 绘制平滑的二次贝塞尔曲线
416
+ # A = elliptical Arc 绘制椭圆弧线
417
+ # Z = closepath 关闭路径
418
+ if cmd_tag in ['M', 'm', 'L', 'l', 'T', 't']:
419
+ x, y = map(float, cmd[1:].split(','))
420
+ current_x = x - current_x
421
+ current_y = y - current_y
422
+ if idx == 0:
423
+ new_path_cmds.append(cmd)
424
+ else:
425
+ if cmd_tag in commands_lower:
426
+ new_path_cmds.append(cmd)
427
+ else:
428
+ new_path_cmds.append("{}{:.2f},{:.2f}".format(cmd_tag.lower(), current_x, current_y))
429
+ current_x = x
430
+ current_y = y
431
+ elif cmd_tag in ['Q', 'q', 'S', 's']:
432
+ (x1, y1), (x, y) = [list(map(float, s.split(","))) for s in cmd[1:].split(" ") if s != '']
433
+ x1 = x1 - current_x
434
+ y1 = y1 - current_y
435
+ current_x = x - current_x
436
+ current_y = y - current_y
437
+ if cmd_tag in commands_lower:
438
+ new_path_cmds.append(cmd)
439
+ else:
440
+ new_path_cmds.append(
441
+ "{}{:.2f},{:.2f} {:.2f},{:.2f}".format(cmd_tag.lower(), x1, y1, current_x, current_y))
442
+ current_x = x
443
+ current_y = y
444
+ elif cmd_tag in ['C', 'c']:
445
+ (x1, y1), (x2, y2), (x, y) = [list(map(float, s.split(","))) for s in cmd[1:].split(" ") if s != '']
446
+ x1 = x1 - current_x
447
+ y1 = y1 - current_y
448
+ x2 = x2 - current_x
449
+ y2 = y2 - current_y
450
+ current_x = x - current_x
451
+ current_y = y - current_y
452
+ if cmd_tag in commands_lower:
453
+ new_path_cmds.append(cmd)
454
+ else:
455
+ new_path_cmds.append(
456
+ "{}{:.2f},{:.2f} {:.2f},{:.2f} {:.2f},{:.2f}".format(cmd_tag.lower(), x1, y1, x2, y2, current_x,
457
+ current_y))
458
+ current_x = x
459
+ current_y = y
460
+ elif cmd_tag in ['A', 'a']:
461
+ # raise Exception("AAAAAAAA")
462
+ # (rx, ry), (x_axis_rotation), (large_arc_flag,sweep_flag), (x, y)
463
+ (rx, ry), x_axis_rotation, (large_arc_flag, sweep_flag), (x, y) = [list(map(float, s.split(","))) for s
464
+ in cmd[1:].split(" ") if s != '']
465
+ # # rx ry x-axis-rotation large-arc-flag sweep-flag x y)
466
+ current_x = x - current_x
467
+ current_y = y - current_y
468
+ new_path_cmds.append(
469
+ "{}{:.2f},{:.2f} {} {},{} {:.2f},{:.2f}".format(cmd_tag.upper(), rx, ry,
470
+ int(x_axis_rotation[0]),
471
+ int(large_arc_flag), int(sweep_flag), current_x,
472
+ current_y))
473
+ # current_x = x
474
+ # current_y = y
475
+
476
+ elif cmd_tag in ['H', 'h']:
477
+ x = float(cmd[1:])
478
+ current_x = x - current_x
479
+ if cmd_tag in commands_lower:
480
+ new_path_cmds.append(cmd)
481
+ else:
482
+ new_path_cmds.append("{}{:.2f}".format(cmd_tag.lower(), current_x))
483
+ current_x = x
484
+ elif cmd_tag in ['V', 'v']:
485
+ y = float(cmd[1:])
486
+ current_y = y - current_y
487
+ if cmd_tag in commands_lower:
488
+ new_path_cmds.append(cmd)
489
+ else:
490
+ new_path_cmds.append("{}{:.2f}".format(cmd_tag.lower(), current_y))
491
+ current_y = y
492
+ elif cmd_tag in ['Z', 'z']:
493
+ new_path_cmds.append(cmd)
494
+
495
+ return new_path_cmds
496
+
497
+ @staticmethod
498
+ def _fixed_d(di, idx):
499
+ if idx == 0:
500
+ return di
501
+ if not isinstance(di[0], str):
502
+ di = tuple(["L"] + list(di))
503
+
504
+ return di
505
+
506
+ @staticmethod
507
+ def _fixed_point(point, idx):
508
+ if idx == 0:
509
+ if point[0] in ["M", "m"]:
510
+ return "M", point[1], point[2]
511
+ if len(point) == 2:
512
+ return "M", point[0], point[1]
513
+ if len(point) == 1:
514
+ point = point[0]
515
+ d = point[1:].split(",")
516
+ return point[0], float(d[0]), float(d[1])
517
+ return "M", point[0], point[1]
518
+ if not isinstance(point[0], str):
519
+ point = "L", point[0], point[1]
520
+
521
+ return point
522
+
523
+ @staticmethod
524
+ def 获取点列表的坐标(点列表):
525
+ pts = []
526
+ for idx, point in enumerate(点列表):
527
+ point = 神笔绘图板工具._fixed_point(point, idx)
528
+ cmd_tag = point[0].upper()
529
+ if cmd_tag in ['M', 'm', 'L', 'l', 'T', 't']:
530
+ pts.append((point[1], point[2]))
531
+ elif cmd_tag in ['Q', 'q', 'S', 's']:
532
+ if len(point) == 5:
533
+ x, y = point[3], point[4]
534
+ pts.append((x, y))
535
+ elif cmd_tag in ['C', 'c']:
536
+ prev_pt = 点列表[idx - 1]
537
+ if len(点列表) < idx + 1:
538
+ next_pt = 点列表[idx + 1]
539
+ if next_pt[0] == "Z":
540
+ next_pt = 点列表[0]
541
+ else:
542
+ next_pt = None
543
+
544
+ if len(prev_pt) == 2:
545
+ prev_x, prev_y = prev_pt
546
+ elif len(prev_pt) > 2:
547
+ prev_x, prev_y = prev_pt[-2], prev_pt[-1]
548
+ else:
549
+ raise Exception("格式错误")
550
+
551
+ if len(point) == 7:
552
+ next_x, next_y = point[5], point[6]
553
+ elif next_pt is None:
554
+ next_x, next_y = None, None
555
+ elif len(next_pt) == 2:
556
+ next_x, next_y = next_pt
557
+ elif len(next_pt) > 2:
558
+ next_x, next_y = next_pt[1], next_pt[2]
559
+ else:
560
+ raise Exception("格式错误")
561
+
562
+ if len(point) == 5: #
563
+ # pts.append((point[1], point[2], (prev_x, prev_y)))
564
+ pass
565
+ if next_x is None or next_y is None:
566
+ pts.append((point[3], point[4]))
567
+ else:
568
+ # pts.append((point[3], point[4], (next_x, next_y)))
569
+ pass
570
+
571
+ elif len(point) == 7: #
572
+ # pts.append((point[1], point[2], (prev_x, prev_y)))
573
+ pass
574
+ if next_x is None or next_y is None:
575
+ pts.append((point[3], point[4]))
576
+ else:
577
+ # pts.append((point[3], point[4], (next_x, next_y)))
578
+ pass
579
+ pts.append((point[5], point[6]))
580
+ elif cmd_tag in ['A', 'a']:
581
+ if len(point) == 8: #
582
+ x, y = point[6], point[7]
583
+ pts.append((x, y))
584
+ elif cmd_tag in ['H', 'h']:
585
+ y = pts[-1][1]
586
+ pts.append((point[1], y))
587
+ elif cmd_tag in ['V', 'v']:
588
+ x = pts[-1][0]
589
+ pts.append((x, point[1]))
590
+ return pts
591
+
592
+ @staticmethod
593
+ def 点列表转SVG路径(point_list):
594
+ cmds = []
595
+ for idx, point in enumerate(point_list):
596
+ point = 神笔绘图板工具._fixed_point(point, idx)
597
+ cmd_tag = point[0].upper()
598
+ if cmd_tag in ['M', 'm', 'L', 'l', 'T', 't']:
599
+ cmds.append("{}{:.2f},{:.2f}".format(cmd_tag.upper(), float(point[1]), float(point[2])))
600
+ elif cmd_tag in ['Q', 'q', 'S', 's']:
601
+ if len(point) == 3: #
602
+ last_p = point_list[idx + 1]
603
+ x, y = last_p[0], last_p[1]
604
+ elif len(point) == 5: #
605
+ x, y = point[3], point[4]
606
+ else:
607
+ raise Exception("格式错误:", point)
608
+ cmds.append("{}{:.2f},{:.2f} {:.2f},{:.2f}".format(cmd_tag.upper(),
609
+ float(point[1]), float(point[2]),
610
+ float(x), float(y)))
611
+ elif cmd_tag in ['C', 'c']:
612
+ if len(point) == 5: #
613
+ last_p = point_list[idx + 1]
614
+ x, y = last_p[0], last_p[1]
615
+ elif len(point) == 7: #
616
+ x, y = point[5], point[6]
617
+ else:
618
+ raise Exception("格式错误:", point)
619
+ cmds.append(
620
+ "{}{:.2f},{:.2f} {:.2f},{:.2f} {:.2f},{:.2f}".format(cmd_tag.upper(),
621
+ float(point[1]), float(point[2]),
622
+ float(point[3]),
623
+ float(point[4]),
624
+ float(x), float(y)))
625
+ elif cmd_tag in ['A', 'a']:
626
+ # a 150,150 0 1,0 150,-150
627
+ if len(point) == 6: #
628
+ last_p = point_list[idx + 1]
629
+ x, y = last_p[0], last_p[1]
630
+ elif len(point) == 8: #
631
+ x, y = point[6], point[7]
632
+ else:
633
+ raise Exception("格式错误:", point)
634
+ # rx ry x-axis-rotation large-arc-flag sweep-flag x y)
635
+ # {}{:.2f},{:.2f} {:.2f} {:.2f},{:.2f} {:.2f},{:.2f
636
+ cmds.append(
637
+ "{}{:.2f},{:.2f} {} {},{} {:.2f},{:.2f}".format(cmd_tag.upper(), float(point[1]), float(point[2]),
638
+ int(point[3]),
639
+ int(point[4]), int(point[5]), float(x), float(y)))
640
+
641
+ # raise Exception("AAAAAAAA")
642
+ elif cmd_tag in ['H', 'h', 'V', 'v']:
643
+ cmds.append("{}{:.2f}".format(cmd_tag.upper(), float(point[1])))
644
+ elif cmd_tag in ['Z', 'z']:
645
+ cmds.append("Z")
646
+
647
+ return cmds
648
+
649
+ @staticmethod
650
+ def 相对坐标转绝对坐标(path_cmds):
651
+ # Uppercase commands indicates absolute coordinates,
652
+ # lowercase commands indicates relative coordinates
653
+ commands = ['M', 'L', 'H', 'V', 'C', 'S', 'Q', 'T', 'A', 'Z']
654
+ commands_upper = [c.upper() for c in commands]
655
+ commands_lower = [c.lower() for c in commands]
656
+ # commands = commands_upper + commands_lower
657
+ current_x = 0
658
+ current_y = 0
659
+ new_path_cmds = []
660
+ for idx, cmd in enumerate(path_cmds):
661
+ cmd = 神笔绘图板工具._fixed_d(cmd, idx)
662
+ cmd_tag = cmd[0] # path_cmds[idx-1][0] in ["h","H"] and cmd_tag in ["l","L"]
663
+ if idx > 0:
664
+ if cmd_tag in ["V"]:
665
+ current_y = 0
666
+ elif cmd_tag in ["H"]:
667
+ current_x = 0
668
+ elif cmd_tag in commands_upper:
669
+ current_x, current_y = 0, 0
670
+ # else:
671
+ # if path_cmds[idx-1][0] in ["V"]:
672
+ # pass
673
+ # elif path_cmds[idx-1][0] in ["H"]:
674
+ # pass
675
+ # M = moveto
676
+ # L = lineto
677
+ # H = horizontal lineto
678
+ # V = vertical lineto
679
+ # C = curveto
680
+ # S = smooth curveto
681
+ # Q = quadratic Bézier curve
682
+ # T = smooth quadratic Bézier curveto
683
+ # A = elliptical Arc
684
+ # Z = closepath
685
+ if cmd_tag in ['M', 'm', 'L', 'l', 'T', 't']:
686
+ x, y = map(float, cmd[1:].split(','))
687
+ current_x = current_x + x
688
+ current_y = current_y + y # "{}{:.2f},{:.2f}".format(cmd_tag.upper(), current_x, current_y) == "L,0.67,250.38"
689
+ new_path_cmds.append("{}{:.2f},{:.2f}".format(cmd_tag.upper(), current_x, current_y))
690
+ elif cmd_tag in ['Q', 'q', 'S', 's']:
691
+ (x1, y1), (x, y) = [list(map(float, s.split(","))) for s in cmd[1:].split(" ") if s != '']
692
+ x1 = current_x + x1
693
+ y1 = current_y + y1
694
+ current_x = current_x + x
695
+ current_y = current_y + y
696
+ new_path_cmds.append(
697
+ "{}{:.2f},{:.2f} {:.2f},{:.2f}".format(cmd_tag.upper(), x1, y1, current_x, current_y))
698
+ elif cmd_tag in ['C', 'c']:
699
+ try:
700
+ (x1, y1), (x2, y2), (x, y) = [list(map(float, s.split(","))) for s in cmd[1:].split(" ") if s != '']
701
+ except Exception as e:
702
+ pass
703
+ x1 = current_x + x1
704
+ y1 = current_y + y1
705
+ x2 = current_x + x2
706
+ y2 = current_y + y2
707
+ current_x = current_x + x
708
+ current_y = current_y + y
709
+ new_path_cmds.append(
710
+ "{}{:.2f},{:.2f} {:.2f},{:.2f} {:.2f},{:.2f}".format(cmd_tag.upper(), x1, y1, x2, y2, current_x,
711
+ current_y))
712
+
713
+ elif cmd_tag in ['H', 'h']:
714
+ x = float(str(cmd[1:]).strip(" ,"))
715
+ current_x = current_x + x
716
+ new_path_cmds.append("{}{:.2f}".format(cmd_tag.upper(), current_x))
717
+ elif cmd_tag in ['V', 'v']:
718
+ y = float(str(cmd[1:]).rstrip(" ,"))
719
+ current_y = current_y + y
720
+ new_path_cmds.append("{}{:.2f}".format(cmd_tag.upper(), current_y))
721
+ elif cmd_tag in ['Z', 'z']:
722
+ new_path_cmds.append(cmd)
723
+ elif cmd_tag in ['A', 'a']:
724
+ # a 40,40 0 1,0 80,0
725
+ # rx ry x-axis-rotation large-arc-flag sweep-flag x y)
726
+ (rx, ry), (x_axis_rotation, large_arc_flag), (sweep_flag, x), y = [list(map(float, s.split(","))) for s
727
+ in cmd[1:].strip(" ,").split(" ") if
728
+ s != '']
729
+ x_axis_rotation = int(x_axis_rotation)
730
+ large_arc_flag = int(large_arc_flag)
731
+ sweep_flag = int(sweep_flag)
732
+ y = y[0]
733
+ # rx = current_x + rx
734
+ # ry = current_y + ry
735
+ current_x = current_x + x
736
+ current_y = current_y + y
737
+ new_path_cmds.append(
738
+ "{}{:.2f},{:.2f} {} {},{} {:.2f},{:.2f}".format(cmd_tag.upper(), rx, ry, x_axis_rotation,
739
+ large_arc_flag, sweep_flag, current_x, current_y))
740
+
741
+ return new_path_cmds
742
+
743
+ @staticmethod
744
+ def _get_ellipse_bbox(ellipse):
745
+ cx, cy, rx, ry = ellipse.attribs["cx"], ellipse.attribs["cy"], ellipse.attribs["rx"], ellipse.attribs["ry"]
746
+ # {'fill': 'url(#_右纽扣渐变)', 'alignment-baseline': 'auto', 'stroke-width': 1.0, 'stroke': 'none', 'opacity': 1.0, 'i
747
+ # d': 'march3_pycr_el_00007', 'cx': 430.28, 'cy': 522.04, 'rx': 33.28, 'ry': 33.45}
748
+ min_x = round(cx - rx, 2)
749
+ max_x = round(cx + rx, 2)
750
+ min_y = round(cy - rx, 2)
751
+ max_y = round(cy + rx, 2)
752
+ return (min_x, min_y), (max_x, max_y)
753
+
754
+ @staticmethod
755
+ def _get_circle_bbox(circle):
756
+ cx, cy, r = circle.attribs["cx"], circle.attribs["cy"], circle.attribs["r"]
757
+ min_x = round(cx - r, 2)
758
+ max_x = round(cx + r, 2)
759
+ min_y = round(cy - r, 2)
760
+ max_y = round(cy + r, 2)
761
+ return (min_x, min_y), (max_x, max_y)
762
+
763
+ @staticmethod
764
+ def _get_text_bbox(text):
765
+ if 为空(text.text):
766
+ return (None, None), (None, None)
767
+ # 'font-family': '小篆体'
768
+ # 'text-anchor': 'middle'
769
+ # 'font-size': 40.0
770
+ # 'alignment-baseline': 'middle'
771
+ if "font-family" in text.attribs:
772
+ font_family = text.attribs["font-family"]
773
+ else:
774
+ font_family = ""
775
+
776
+ if "text-anchor" in text.attribs:
777
+ text_anchor = text.attribs["text-anchor"]
778
+ else:
779
+ text_anchor = ""
780
+
781
+ if "font-size" in text.attribs:
782
+ font_size = text.attribs["font-size"]
783
+ else:
784
+ font_size = ""
785
+
786
+ if "alignment-baseline" in text.attribs:
787
+ alignment_baseline = text.attribs["alignment-baseline"]
788
+ else:
789
+ alignment_baseline = ""
790
+
791
+ x, y = text.attribs["x"], text.attribs["y"]
792
+ x, y = float(x), float(y)
793
+ 宽, 高 = 获取文字的宽高(font_family, font_size, text.text)
794
+ w, h = 宽, 高
795
+ if text_anchor == 文字水平基线对齐.起始点对齐:
796
+ min_x = round(x, 2)
797
+ max_x = round(x + w, 2)
798
+ elif text_anchor == 文字水平基线对齐.结束点对齐:
799
+ min_x = round(x - w, 2)
800
+ max_x = round(x, 2)
801
+ else:
802
+ min_x = round(x - w / 2, 2)
803
+ max_x = round(x + w / 2, 2)
804
+
805
+ if alignment_baseline == 文字垂直基线对齐.顶线对齐:
806
+ min_y = round(y, 2)
807
+ max_y = round(y + h, 2)
808
+ elif alignment_baseline == 文字垂直基线对齐.底线对齐:
809
+ min_y = round(y - h, 2)
810
+ max_y = round(y, 2)
811
+ else:
812
+ min_y = round(y - h / 2, 2)
813
+ max_y = round(y + h / 2, 2)
814
+
815
+ # min_x = round(x - w, 2)
816
+ # max_x = round(x + w, 2)
817
+ # min_y = round(y - h, 2)
818
+ # max_y = round(y + h, 2)
819
+ return (min_x, min_y), (max_x, max_y)
820
+
821
+ @staticmethod
822
+ def _get_path_bbox(path):
823
+ min_x = float('inf')
824
+ max_x = float('-inf')
825
+ min_y = float('inf')
826
+ max_y = float('-inf')
827
+
828
+ commands = ['M', 'm', 'L', 'l', 'H', 'h', 'V', 'v', 'C', 'c', 'S', 's', 'Q', 'q', 'T', 't', 'A', 'a', 'Z', 'z']
829
+
830
+ current_x = 0
831
+ current_y = 0
832
+
833
+ for idx, command in enumerate(path.commands):
834
+ cmd_tag = command[0]
835
+
836
+ if idx > 0:
837
+ if cmd_tag in ["V"]:
838
+ current_y = 0
839
+ elif cmd_tag in ["H"]:
840
+ current_x = 0
841
+ elif cmd_tag in ["M", "L", "T", "Q", "A", "S", "Z", "C"]:
842
+ current_x, current_y = 0, 0
843
+
844
+ # if idx > 0 and cmd_tag in ["M", "L", "T", "Q", "H", "V", "A", "S", "Z", "C"]:
845
+ # current_x, current_y = 0, 0
846
+
847
+ if cmd_tag in commands:
848
+ if cmd_tag in ['M', 'm', 'L', 'l', 'T', 't']:
849
+ x, y = map(float, command[1:].split(','))
850
+ # current_x = x if cmd_tag in ['M', 'm', 'L', 'l'] else current_x + x
851
+ # current_y = y if cmd_tag in ['M', 'm', 'L', 'l'] else current_y + y
852
+ current_x = current_x + x
853
+ current_y = current_y + y
854
+ min_x = min(min_x, current_x)
855
+ max_x = max(max_x, current_x)
856
+ min_y = min(min_y, current_y)
857
+ max_y = max(max_y, current_y)
858
+ elif cmd_tag in ['Q', 'q', 'S', 's']:
859
+ (x2, y2), (x, y) = [list(map(float, s.split(","))) for s in command[1:].split(" ") if s != '']
860
+ x2 = current_x + x2
861
+ y2 = current_y + y2
862
+ min_x = min(min_x, x2)
863
+ max_x = max(max_x, x2)
864
+ min_y = min(min_y, y2)
865
+ max_y = max(max_y, y2)
866
+
867
+ current_x = current_x + x
868
+ current_y = current_y + y
869
+ min_x = min(min_x, current_x)
870
+ max_x = max(max_x, current_x)
871
+ min_y = min(min_y, current_y)
872
+ max_y = max(max_y, current_y)
873
+ elif cmd_tag in ['C', 'c']:
874
+ (x1, y1), (x2, y2), (x, y) = \
875
+ [list(map(float, s.split(","))) for s in command[1:].split(" ") if s != '']
876
+ x1 = current_x + x1
877
+ y1 = current_y + y1
878
+ min_x = min(min_x, x1)
879
+ max_x = max(max_x, x1)
880
+ min_y = min(min_y, y1)
881
+ max_y = max(max_y, y1)
882
+
883
+ x2 = current_x + x2
884
+ y2 = current_y + y2
885
+ min_x = min(min_x, x2)
886
+ max_x = max(max_x, x2)
887
+ min_y = min(min_y, y2)
888
+ max_y = max(max_y, y2)
889
+
890
+ current_x = current_x + x
891
+ current_y = current_y + y
892
+ min_x = min(min_x, current_x)
893
+ max_x = max(max_x, current_x)
894
+ min_y = min(min_y, current_y)
895
+ max_y = max(max_y, current_y)
896
+ elif cmd_tag in ['H', 'h']:
897
+ x = float(command[1:])
898
+ current_x = current_x + x
899
+ min_x = min(min_x, current_x)
900
+ max_x = max(max_x, current_x)
901
+ elif cmd_tag in ['V', 'v']:
902
+ y = float(command[1:])
903
+ current_y = current_y + y
904
+ min_y = min(min_y, current_y)
905
+ max_y = max(max_y, current_y)
906
+ elif cmd_tag in ['a', 'A']:
907
+
908
+ (rx, ry), x_axis_rotation, (large_arc_flag, sweep_flag), (x, y) = [list(map(float, s.split(",")))
909
+ for s
910
+ in command[1:].split(" ") if
911
+ s != '']
912
+ # rx = current_x + rx
913
+ # ry = current_y + ry
914
+ current_x = current_x + x
915
+ current_y = current_y + y
916
+ min_x = min(min_x, current_x)
917
+ max_x = max(max_x, current_x)
918
+ min_y = min(min_y, current_y)
919
+ max_y = max(max_y, current_y)
920
+
921
+ else:
922
+ print("未处理 cmd_tag", cmd_tag)
923
+ pass
924
+
925
+ width = max_x - min_x
926
+ height = max_y - min_y
927
+
928
+ return (min_x, min_y), (max_x, max_y)
929
+
930
+ @staticmethod
931
+ def _get_group_bbox(group):
932
+ min_x = float('inf')
933
+ max_x = float('-inf')
934
+ min_y = float('inf')
935
+ max_y = float('-inf')
936
+
937
+ for element in group.elements:
938
+ (_min_x, _min_y), (_max_x, _max_y) = 神笔绘图板工具.获取元素的坐标信息(element)
939
+ if _min_x is not None:
940
+ min_x = min(min_x, _min_x)
941
+ if _max_x is not None:
942
+ max_x = max(max_x, _max_x)
943
+ if _min_y is not None:
944
+ min_y = min(min_y, _min_y)
945
+ if _max_y is not None:
946
+ max_y = max(max_y, _max_y)
947
+
948
+ # width = max_x - min_x
949
+ # height = max_y - min_y
950
+
951
+ return (min_x, min_y), (max_x, max_y)
952
+
953
+ # @staticmethod
954
+ # def _scale_path_d(d_attr, scale_factor):
955
+ # # 分割 d 属性中的命令和坐标
956
+ # commands = re.split(r'([A-Za-z])', d_attr)
957
+ # scaled_commands = []
958
+ # for i in range(len(commands)):
959
+ # if i % 2 == 0: # 如果是命令(大写或小写字母)
960
+ # scaled_commands.append(commands[i])
961
+ # else: # 如果是坐标值
962
+ # # 分割坐标值并用缩放因子进行缩放
963
+ # coords = re.findall(r'-?\d+(\.\d+)?', commands[i])
964
+ # scaled_coords = [str(float(c) * scale_factor) for c in coords]
965
+ # scaled_commands.append(' '.join(scaled_coords))
966
+ # # 合并回一个字符串
967
+ # scaled_d = ''.join(scaled_commands)
968
+ # return scaled_d
969
+
970
+ @staticmethod
971
+ def _is_number(s):
972
+ if s.isdigit():
973
+ return True
974
+ elif re.match(r'^\d+\.\d+$', s) or re.match(r'^\d+\.$', s):
975
+ return True
976
+ else:
977
+ return False
978
+
979
+ @staticmethod
980
+ def _conv_transform(t, scale_factor):
981
+ if t.strip().startswith("rotate"):
982
+ return 神笔绘图板工具._conv_transform_rotate(t, scale_factor)
983
+ elif t.strip().startswith("scale"):
984
+ return t
985
+
986
+ return t
987
+
988
+ @staticmethod
989
+ def _conv_transform(t, scale_factor):
990
+ if "rotate" in t:
991
+ return 神笔绘图板工具._conv_transform_rotate(t, scale_factor)
992
+ elif t.strip().startswith("scale"):
993
+ return t
994
+
995
+ return t
996
+
997
+ @staticmethod
998
+ def _conv_transform_rotate(transform, scale_factor):
999
+ # 匹配 rotate 中的参数
1000
+ pattern = r'rotate\((.*?),\s*(.*?),\s*(.*?)\)'
1001
+ match = re.search(pattern, transform)
1002
+ x, y = match.group(2), match.group(3)
1003
+ x = 神笔绘图板工具._conv_num(str(x).strip(), scale_factor)
1004
+ y = 神笔绘图板工具._conv_num(str(y).strip(), scale_factor)
1005
+ if match:
1006
+ # 将参数替换为新的值
1007
+ new_transform = re.sub(pattern, f'rotate({match.group(1)}, {x}, {y})', transform)
1008
+ return new_transform
1009
+ else:
1010
+ return transform
1011
+
1012
+ @staticmethod
1013
+ def _conv_stroke_dasharray(std, scale_factor):
1014
+ std_lis = std.split(",")
1015
+ new_std_lis = []
1016
+ for i in std_lis:
1017
+ new_std_lis.append(神笔绘图板工具._conv_num(i.strip(), scale_factor))
1018
+ return ",".join(new_std_lis)
1019
+
1020
+ @staticmethod
1021
+ def _conv_path_d_2(d, scale_factor):
1022
+ if d == "":
1023
+ return ""
1024
+ perfix = ""
1025
+ if not 神笔绘图板工具._is_number(d[0]):
1026
+ perfix = d[0]
1027
+ d = d[1:]
1028
+ d_lis = d.split(",")
1029
+ val = [神笔绘图板工具._conv_num(i, scale_factor) if 神笔绘图板工具._is_number(i) else i for i in d_lis]
1030
+ val = ",".join(val)
1031
+ return perfix + val
1032
+
1033
+ @staticmethod
1034
+ def _conv_path_d(d, scale_factor):
1035
+ d_lis = d.split(" ")
1036
+ val = [神笔绘图板工具._conv_num(i, scale_factor)
1037
+ if 神笔绘图板工具._is_number(i) else 神笔绘图板工具._conv_path_d_2(i, scale_factor)
1038
+ for i in d_lis]
1039
+ val = " ".join(val)
1040
+ return val
1041
+
1042
+ @staticmethod
1043
+ def _conv_num(num, scale_factor):
1044
+ str_num = str(num)
1045
+ if str_num.endswith("%"):
1046
+ return str_num
1047
+ units = ["px", "em"]
1048
+ for u in units:
1049
+ if str_num.endswith(u):
1050
+ n = str(str_num).replace(u, "")
1051
+ if "." in str_num:
1052
+ return str(round(float(n) * scale_factor, 2)) + u
1053
+ else:
1054
+ return str(int(int(n) * scale_factor)) + u
1055
+ if "." in str_num:
1056
+ return str(round(float(num) * scale_factor, 2))
1057
+ else:
1058
+ try:
1059
+ return str(int(int(num) * scale_factor))
1060
+ except Exception as e:
1061
+ print(str(e))
1062
+ return num
1063
+
1064
+ @staticmethod
1065
+ def _scale_svg(SVG文件, 缩放, 缩放后SVG文件=None):
1066
+ tree = ET.parse(SVG文件)
1067
+ root = tree.getroot()
1068
+ svg_width, svg_height = None, None
1069
+
1070
+ # 定义一个函数来递归地缩放所有元素的尺寸属性和字体大小
1071
+ def scale_element(elem):
1072
+ nonlocal svg_width, svg_height
1073
+ attribs = ["width", "height", "x", "y", "font-size", "rx", "ry", "stroke-width",
1074
+ "cx", "cy", "r",
1075
+ "x1", "y1", "x2", "y2", "x3", "y3", "x4", "y4", "x5", "y5",
1076
+ ] # , "dy"
1077
+
1078
+ for attr in attribs:
1079
+ if elem.tag.endswith("svg"):
1080
+ if attr == "width":
1081
+ attr_val = elem.attrib[attr]
1082
+ if attr_val.endswith("%"):
1083
+ svg_width = attr_val
1084
+ else:
1085
+ svg_width = int(round(float(神笔绘图板工具._conv_num(attr_val, 缩放).replace("px", "")), 0))
1086
+ elif attr == "height":
1087
+ attr_val = elem.attrib[attr]
1088
+ if attr_val.endswith("%"):
1089
+ svg_width = attr_val
1090
+ else:
1091
+ svg_height = int(
1092
+ round(float(神笔绘图板工具._conv_num(attr_val, 缩放).replace("px", "")), 0))
1093
+
1094
+ if ":" in attr:
1095
+ attr_n, attr_tag = attr.split(":")
1096
+ else:
1097
+ attr_n, attr_tag = attr, None
1098
+ # print(elem.tag)
1099
+ if attr_n in elem.attrib and (attr_tag is None or elem.tag.endswith(attr_tag)):
1100
+ elem.attrib[attr_n] = str(神笔绘图板工具._conv_num(elem.attrib[attr_n], 缩放))
1101
+
1102
+ if 'd' in elem.attrib:
1103
+ if elem.tag.endswith("path"):
1104
+ elem.attrib['d'] = 神笔绘图板工具._conv_path_d(elem.attrib['d'], 缩放)
1105
+ else:
1106
+ pass
1107
+
1108
+ if "transform" in elem.attrib:
1109
+ elem.attrib['transform'] = 神笔绘图板工具._conv_transform(elem.attrib['transform'], 缩放)
1110
+
1111
+ if "stroke-dasharray" in elem.attrib:
1112
+ elem.attrib['stroke-dasharray'] = 神笔绘图板工具._conv_stroke_dasharray(elem.attrib['stroke-dasharray'],
1113
+ 缩放)
1114
+
1115
+ if "points" in elem.attrib:
1116
+ elem.attrib['points'] = 神笔绘图板工具._conv_path_d(elem.attrib['points'], 缩放)
1117
+
1118
+ if 'style' in elem.attrib:
1119
+ # 尝试从 style 属性中提取并缩放字体大小
1120
+ style = elem.attrib['style']
1121
+ matches = re.findall(r'font-size:(\d+(\.\d+)?)', style)
1122
+ for match in matches:
1123
+ new_size = str(float(match) * 缩放)
1124
+ style = style.replace(match, new_size)
1125
+ elem.attrib['style'] = style
1126
+
1127
+ # 递归地处理子元素
1128
+ for child in elem:
1129
+ scale_element(child)
1130
+
1131
+ # 检查并缩放根 SVG 元素的 width 和 height
1132
+
1133
+ # 对所有元素进行缩放
1134
+ scale_element(root)
1135
+
1136
+ # 保存修改后的SVG文件
1137
+ tree.write(缩放后SVG文件)
1138
+
1139
+ return 缩放后SVG文件, (svg_width, svg_height)
1140
+
1141
+
1142
+ if __name__ == '__main1__':
1143
+ from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
1144
+
1145
+ svg = 神笔绘图板(作品文件路径="test.svg", 宽=800, 高=500)
1146
+ svg.显示图框()
1147
+ g = svg.创建组合()
1148
+ svg.连线([(10, 10), (100, 20), (30, 50), (10, 20)], 所属分组=g)
1149
+ (min_x, min_y), (max_x, max_y) = 神笔绘图板工具.获取元素的坐标信息(g)
1150
+ svg.完成()
1151
+ print((min_x, min_y), (max_x, max_y))
1152
+
1153
+ if __name__ == '__main1__':
1154
+ d = ["M10,10", "l2,2", "q1,12 13,24", "L30,30", "l20,20"]
1155
+ d = 神笔绘图板工具.点列表转SVG路径([(10, 10), ("L", 20, 20)])
1156
+ print(d)
1157
+ d1 = 神笔绘图板工具.相对坐标转绝对坐标(d)
1158
+ print(d1)
1159
+ d2 = 神笔绘图板工具.绝对坐标转相对坐标(d1)
1160
+ print(d2)
1161
+ d3 = 神笔绘图板工具.相对坐标转绝对坐标(d2)
1162
+ print(d3)
1163
+
1164
+
1165
+ def 代码生成_原始(d):
1166
+ code = """
1167
+ import svgwrite
1168
+ dwg = svgwrite.Drawing('generated_code.svg', profile='tiny')
1169
+
1170
+ """
1171
+ for i, cmd in enumerate(神笔绘图板工具.path_d_split(d)):
1172
+ if i == 0:
1173
+ code += f'path = dwg.path(d="{cmd}")\n'
1174
+ else:
1175
+ code += f'path.push("{cmd}")\n'
1176
+ code += """
1177
+ dwg.add(path)
1178
+ dwg.save()"""
1179
+
1180
+ print(code)
1181
+
1182
+
1183
+ def 代码生成_转绝对坐标(d):
1184
+ # d="m28.55,281.13c-3.28-48.54-7.4-109.55,34.47-159.32,48.87-58.09,125.5-59.36,148.6-59.74,26.68-.44,91.7-1.52,134.81,43.66,39.7,41.61,37.35,97.86,34.47,166.98-2.01,48.1-5.78,116.71-52.85,180-20.05,26.96-47.47,63.82-92.68,71.23-69.33,11.37-127-55.29-144.77-75.83-53.96-62.38-59.82-134.11-62.04-166.98Z"
1185
+ code = """
1186
+ import svgwrite
1187
+ dwg = svgwrite.Drawing('generated_code.svg', profile='tiny')
1188
+
1189
+ """
1190
+ commands = 神笔绘图板工具.path_d_split(d)
1191
+ commands = 神笔绘图板工具.相对坐标转绝对坐标(commands)
1192
+ for i, cmd in enumerate(commands):
1193
+ if i == 0:
1194
+ code += f'path = dwg.path(d="{cmd}")\n'
1195
+ else:
1196
+ code += f'path.push("{cmd}")\n'
1197
+ code += """
1198
+ dwg.add(path)
1199
+ dwg.save()"""
1200
+
1201
+ print(code)
1202
+
1203
+
1204
+ def 代码生成_转框架代码(d):
1205
+ code = """
1206
+ from svg_to_pdf.SVG制作 import SVG制作
1207
+ from svg_to_pdf.常量 import 颜色
1208
+
1209
+ svg = SVG制作(SVG文件="代码生成框架代码.svg", 宽=500, 高=589)
1210
+ svg.贴图(x=0, y=0, 图片文件="./images/女儿国王.jpg", 缩放=1, 旋转角度=0)
1211
+ svg.图框(网格线距=20, 网格颜色=颜色.红色, 网格透明度=1, 网格字体大小=9)
1212
+ 路径 = []
1213
+ """
1214
+ commands = 神笔绘图板工具.path_d_split(d)
1215
+ commands = 神笔绘图板工具.相对坐标转绝对坐标(commands)
1216
+ for i, cmd in enumerate(commands):
1217
+ _cmd_tag = cmd[0]
1218
+ _cmd_vals = cmd[1:].replace(",", " ")
1219
+ code += f'路径.append(("{_cmd_tag}",'
1220
+ for c in _cmd_vals.split(" "):
1221
+ code += f'{c},'
1222
+ code = code[:-1] + ")"
1223
+ code += ')\n'
1224
+ code += """
1225
+ svg.连线(路径, 描边颜色="#ff0000", 填充颜色="none", 点定位=False, 点定位坐标=False)
1226
+ svg.保存()"""
1227
+
1228
+ print(code)
1229
+
1230
+
1231
+ def get_style_values(style_str):
1232
+ style_dict = {}
1233
+ style_list = style_str.split(';')
1234
+ for style in style_list:
1235
+ if ':' in style:
1236
+ key, value = style.split(':')
1237
+ style_dict[key.strip()] = value.strip()
1238
+ return style_dict
1239
+
1240
+
1241
+ # def SVG_path_____(group_name, id_index, item, pycode, TAB, style_names):
1242
+ # if group_name is None:
1243
+ # group_name = ""
1244
+ #
1245
+ # if "id" not in item.attrib:
1246
+ # item_var_name = f'{group_name.replace("-", "_")}_{id_index}'
1247
+ # id_index += 1
1248
+ # else:
1249
+ # item_var_name = item.attrib["id"].replace("-", "_")
1250
+ # # print(item)
1251
+ # # item_name = item.attrib["data-name"]
1252
+ # if "style" in item.attrib:
1253
+ # item_style = item.attrib["style"]
1254
+ # else:
1255
+ # item_style = ""
1256
+ #
1257
+ # if "title" in item.attrib:
1258
+ # title = item.attrib["title"]
1259
+ # elif "id" in item.attrib:
1260
+ # title = item.attrib["id"]
1261
+ # else:
1262
+ # title = ""
1263
+ #
1264
+ # styles = get_style_values(item_style)
1265
+ # fill = styles["fill"] if "fill" in styles else "none"
1266
+ #
1267
+ # fill, item_var_name, style_names = style_rename(fill, item_var_name, style_names)
1268
+ #
1269
+ # item_var_name = title.replace(" ", "").replace("(", "_").replace(")", "_") + "_" + item_var_name.replace("CN_", "")
1270
+ #
1271
+ # stroke = styles["stroke"] if "stroke" in styles else "black"
1272
+ # # 'style': 'fill: url(#_未命名的渐变_575); stroke: #000; stroke-miterlimit: 10;'
1273
+ # path_d = item.attrib["d"]
1274
+ # pycode += f"{TAB}{item_var_name}_路径点 = [\n"
1275
+ # commands = 神笔绘图板工具.path_d_split(path_d)
1276
+ # commands = 神笔绘图板工具.相对坐标转绝对坐标(commands)
1277
+ # for i, cmd in enumerate(commands):
1278
+ # _cmd_tag = cmd[0]
1279
+ # _cmd_vals = cmd[1:].replace(",", " ")
1280
+ # # pycode += f'{TAB}{item_var_name}.append(("{_cmd_tag}",'
1281
+ # pycode += f'{TAB}{TAB}("{_cmd_tag}",'
1282
+ # for c in _cmd_vals.split(" "):
1283
+ # pycode += f'{c},'
1284
+ # pycode = pycode[:-1] + ")"
1285
+ # pycode += ',\n'
1286
+ # pycode = pycode[:-1] + f']\n'
1287
+ # pycode += f'{TAB}self.连线({item_var_name}_路径点, 描边颜色="{stroke}", 填充颜色="{fill}")\n\n'
1288
+ # return id_index, pycode, style_names
1289
+
1290
+
1291
+ def SVG_path(group_name, id_index, item, pycode, TAB, style_names):
1292
+ if group_name is None:
1293
+ group_name = ""
1294
+
1295
+ if "id" not in item.attrib:
1296
+ item_var_name = f'{group_name.replace("-", "_")}_{id_index}'
1297
+ id_index += 1
1298
+ else:
1299
+ item_var_name = item.attrib["id"].replace("-", "_")
1300
+ # print(item)
1301
+ # item_name = item.attrib["data-name"]
1302
+ if "style" in item.attrib:
1303
+ item_style = item.attrib["style"]
1304
+ else:
1305
+ item_style = ""
1306
+
1307
+ if "title" in item.attrib:
1308
+ title = item.attrib["title"]
1309
+ elif "id" in item.attrib:
1310
+ title = item.attrib["id"]
1311
+ else:
1312
+ title = ""
1313
+
1314
+ styles = get_style_values(item_style)
1315
+ fill = styles["fill"] if "fill" in styles else "none"
1316
+
1317
+ fill, item_var_name, style_names = style_rename(fill, item_var_name, style_names)
1318
+
1319
+ item_var_name = title.replace(" ", "").replace("(", "_").replace(")", "_") # + "_" +item_var_name.replace("CN_","")
1320
+
1321
+ stroke = styles["stroke"] if "stroke" in styles else "black"
1322
+ # 'style': 'fill: url(#_未命名的渐变_575); stroke: #000; stroke-miterlimit: 10;'
1323
+ path_d = item.attrib["d"]
1324
+ pycode += f"{TAB}\"{item_var_name}\" : [\n"
1325
+ commands = 神笔绘图板工具.path_d_split(path_d)
1326
+ commands = 神笔绘图板工具.相对坐标转绝对坐标(commands)
1327
+ for i, cmd in enumerate(commands):
1328
+ _cmd_tag = cmd[0]
1329
+ _cmd_vals = cmd[1:].replace(",", " ")
1330
+ # pycode += f'{TAB}{item_var_name}.append(("{_cmd_tag}",'
1331
+ pycode += f'{TAB}{TAB}("{_cmd_tag}",' # 'V954.06' -6.18 V954.061l-6.185,-3.053
1332
+ for c in _cmd_vals.split(" "):
1333
+ pycode += f'{c},'
1334
+ pycode = pycode[:-1] + ")"
1335
+ pycode += ',\n'
1336
+ pycode = pycode[:-1] + f'],\n'
1337
+
1338
+ return id_index, pycode, style_names
1339
+
1340
+
1341
+ def style_rename(fill, item_var_name, style_names):
1342
+ if "url(#" in fill:
1343
+ old_style_name = fill[5:-1]
1344
+ if "渐变" in fill:
1345
+ suffix = "渐变"
1346
+ else:
1347
+ suffix = "样式"
1348
+ new_style_name = item_var_name + suffix
1349
+ style_names[old_style_name] = new_style_name
1350
+ fill = f"url(#{new_style_name})"
1351
+ return fill, item_var_name, style_names
1352
+
1353
+
1354
+ def SVG_circle(group_name, id_index, item, pycode, TAB, style_names):
1355
+ if "id" not in item.attrib:
1356
+ item_var_name = f'{group_name.replace("-", "_")}_{id_index}'
1357
+ id_index += 1
1358
+ else:
1359
+ item_var_name = item.attrib["id"].replace("-", "_")
1360
+
1361
+ cx, cy = item.attrib["cx"], item.attrib["cy"]
1362
+ r = item.attrib["r"]
1363
+ cx, cy = float(cx), float(cy)
1364
+ r = float(r)
1365
+
1366
+ if "transform" in item.attrib:
1367
+ transform = item.attrib["transform"]
1368
+ else:
1369
+ transform = None
1370
+
1371
+ item_style = item.attrib["style"]
1372
+ styles = get_style_values(item_style)
1373
+ fill = styles["fill"] if "fill" in styles else "none"
1374
+
1375
+ fill, item_var_name, style_names = style_rename(fill, item_var_name, style_names)
1376
+
1377
+ stroke = styles["stroke"] if "stroke" in styles else "black"
1378
+ # svg.画椭圆(x=520, y=180, 半径=(10, 20), 描边颜色=颜色.浅宝石蓝色, 填充颜色=渐变色1.颜色引用, 描边样式="5,5")
1379
+ pycode += f'{TAB}{item_var_name} = self.画圆(x={cx}, y={cy}, 半径={r}, 描边颜色="{stroke}", 填充颜色="{fill}")\n'
1380
+
1381
+ if transform is not None:
1382
+ pycode += f'{TAB}{item_var_name}["transform"] = "{transform}"\n\n'
1383
+ else:
1384
+ pycode += "\n"
1385
+
1386
+ return id_index, pycode, style_names
1387
+
1388
+
1389
+ def SVG_ellipse(group_name, id_index, item, pycode, TAB, style_names):
1390
+ if "id" not in item.attrib:
1391
+ item_var_name = f'{group_name.replace("-", "_")}_{id_index}'
1392
+ id_index += 1
1393
+ else:
1394
+ item_var_name = item.attrib["id"].replace("-", "_")
1395
+
1396
+ cx, cy = item.attrib["cx"], item.attrib["cy"]
1397
+ rx, ry = item.attrib["rx"], item.attrib["ry"]
1398
+ cx, cy = float(cx), float(cy)
1399
+ rx, ry = float(rx), float(ry)
1400
+
1401
+ # cx="420.61" cy="236.9" rx="18.93" ry="32.57" transform="translate(-44.82 108.79) rotate(-14)" style="fill: #50dce9; stroke-width: 0px;"
1402
+
1403
+ if "transform" in item.attrib:
1404
+ transform = item.attrib["transform"]
1405
+ else:
1406
+ transform = None
1407
+
1408
+ item_style = item.attrib["style"]
1409
+ styles = get_style_values(item_style)
1410
+ fill = styles["fill"] if "fill" in styles else "none"
1411
+
1412
+ fill, item_var_name, style_names = style_rename(fill, item_var_name, style_names)
1413
+
1414
+ stroke = styles["stroke"] if "stroke" in styles else "black"
1415
+ # svg.画椭圆(x=520, y=180, 半径=(10, 20), 描边颜色=颜色.浅宝石蓝色, 填充颜色=渐变色1.颜色引用, 描边样式="5,5")
1416
+ pycode += f'{TAB}{item_var_name} = self.画椭圆(x={cx}, y={cy}, 半径=({rx}, {ry}), 描边颜色="{stroke}", 填充颜色="{fill}")\n'
1417
+
1418
+ if transform is not None:
1419
+ pycode += f'{TAB}{item_var_name}["transform"] = "{transform}"\n\n'
1420
+ else:
1421
+ pycode += "\n"
1422
+
1423
+ return id_index, pycode, style_names
1424
+
1425
+
1426
+ def SVG_group(elm, pycode, fun_names, TAB, style_names):
1427
+ print("SVG_group", elm)
1428
+
1429
+ if "data-name" in elm.attrib:
1430
+ group_name = elm.attrib["data-name"].replace("-", "_") # elm.attrib["id"]
1431
+
1432
+ if f"def {group_name}(self):\n" in pycode:
1433
+ return pycode, fun_names, style_names
1434
+
1435
+ if group_name in fun_names:
1436
+ # print("重复方法名称", group_name)
1437
+ return pycode, fun_names, style_names
1438
+
1439
+ pycode += f"def {group_name}(self):\n"
1440
+ fun_names += f"{TAB}{group_name}(高清图)\n"
1441
+ else:
1442
+ group_name = None
1443
+ # print(elm.attrib["id"], elm.attrib["data-name"])
1444
+ id_index = 0
1445
+ elm_list = list(elm.iter())
1446
+ for item in elm_list:
1447
+ if item is not elm:
1448
+ if item.tag.endswith("}path"):
1449
+ id_index, pycode, style_names = SVG_path(group_name, id_index, item, pycode, TAB, style_names)
1450
+ elif item.tag.endswith("}ellipse"):
1451
+ id_index, pycode, style_names = SVG_ellipse(group_name, id_index, item, pycode, TAB, style_names)
1452
+ elif item.tag.endswith("}circle"):
1453
+ id_index, pycode, style_names = SVG_circle(group_name, id_index, item, pycode, TAB, style_names)
1454
+ elif item.tag.endswith("}image") or item.tag.endswith("}g"):
1455
+ pass
1456
+ else:
1457
+ raise Exception("未处理 item.tag = ", item.tag)
1458
+ # elif item.tag.endswith("}g"):
1459
+ # pycode, fun_names = SVG_group(item, pycode, fun_names, TAB)
1460
+ if id_index == 0:
1461
+ pycode += f"{TAB}pass\n\n"
1462
+
1463
+ return pycode, fun_names, style_names
1464
+
1465
+
1466
+ def SVG_defs(elm, defs, TAB, style_names):
1467
+ code = ""
1468
+ for item in elm.iter():
1469
+ if item is elm:
1470
+ continue
1471
+
1472
+ if item.tag.endswith("}linearGradient"):
1473
+ id = item.attrib["id"]
1474
+ if id in style_names:
1475
+ id = style_names[id]
1476
+ x1, y1 = item.attrib["x1"], item.attrib["y1"]
1477
+ x2, y2 = item.attrib["x2"], item.attrib["y2"]
1478
+ x1, y1 = float(x1), float(y1)
1479
+ x2, y2 = float(x2), float(y2)
1480
+ stop_infos = []
1481
+ stop_list = list(item.iter())[1:]
1482
+ if len(stop_list) == 0:
1483
+ continue
1484
+
1485
+ for stop_idx, stop in enumerate(stop_list):
1486
+ # {'offset': '.01', 'stop-color': '#666767'}
1487
+ if "offset" in stop.attrib:
1488
+ offset = stop.attrib["offset"]
1489
+ else:
1490
+ offset = "0.5"
1491
+ if "stop-color" in stop.attrib:
1492
+ stop_color = stop.attrib["stop-color"]
1493
+ else:
1494
+ stop_color = "none"
1495
+
1496
+ if "opacity" in stop.attrib:
1497
+ opacity = stop.attrib["opacity"]
1498
+ else:
1499
+ opacity = 1.0
1500
+
1501
+ stop_info = {"偏移": offset, "颜色": stop_color, "透明度": opacity}
1502
+ stop_infos.append(stop_info)
1503
+
1504
+ start_color = stop_infos[0]["颜色"]
1505
+ start_offset = stop_infos[0]["偏移"]
1506
+ start_alpha = stop_infos[0]["透明度"]
1507
+ end_color = stop_infos[-1]["颜色"]
1508
+ end_offset = stop_infos[-1]["偏移"]
1509
+ end_alpha = stop_infos[-1]["透明度"]
1510
+
1511
+ if len(stop_list) == 2:
1512
+ add_stop_color = "[]"
1513
+ else:
1514
+ code += f'{TAB}{id}中间点 = [\n'
1515
+ for stop_info in stop_infos[1:-2]:
1516
+ if stop_info["透明度"] == 1:
1517
+ code += f'{TAB}{TAB}{{"偏移": "{stop_info["偏移"]}", "颜色": "{stop_info["颜色"]}"}},\n'
1518
+ else:
1519
+ code += f'{TAB}{TAB}{{"偏移": "{stop_info["偏移"]}", "颜色": "{stop_info["颜色"]}", "透明度": {stop_info["透明度"]}}},\n'
1520
+ code += f'{TAB}]\n'
1521
+ add_stop_color = f"{id}中间点"
1522
+ # add_stop_color = "[]"
1523
+
1524
+ code += f'{TAB}self.创建线性渐变色(开始位置=({x1}, {y1}), 结束位置=({x2}, {y2}), 开始颜色="{start_color}", 结束颜色="{end_color}", \n' \
1525
+ f'{TAB}{TAB}{TAB}开始偏移="{start_offset}", 结束偏移="{end_offset}",开始透明度={start_alpha}, 结束透明度={end_alpha}, \n' \
1526
+ f'{TAB}{TAB}{TAB}增加渐变中间点={add_stop_color},id="{id}")\n'
1527
+ elif item.tag.endswith("}stop"):
1528
+ pass
1529
+ elif item.tag.endswith("}radialGradient"):
1530
+ id = item.attrib["id"]
1531
+ if id in style_names:
1532
+ id = style_names[id]
1533
+
1534
+ cx, cy = item.attrib["cx"], item.attrib["cy"]
1535
+ fx, fy = item.attrib["fx"], item.attrib["fy"]
1536
+ r = item.attrib["r"]
1537
+ cx, cy = float(cx), float(cy)
1538
+ fx, fy = float(fx), float(fy)
1539
+ 渐变的焦点 = f"({fx}, {fy})"
1540
+ r = float(r)
1541
+ if "gradientTransform" in item.attrib:
1542
+ gradientTransform = item.attrib["gradientTransform"]
1543
+ else:
1544
+ gradientTransform = None
1545
+
1546
+ stop_infos = []
1547
+ stop_list = list(item.iter())[1:]
1548
+ if len(stop_list) == 0:
1549
+ continue
1550
+
1551
+ for stop_idx, stop in enumerate(stop_list):
1552
+ # {'offset': '.01', 'stop-color': '#666767'}
1553
+ if "offset" in stop.attrib:
1554
+ offset = stop.attrib["offset"]
1555
+ else:
1556
+ offset = "0.5"
1557
+ if "stop-color" in stop.attrib:
1558
+ stop_color = stop.attrib["stop-color"]
1559
+ else:
1560
+ stop_color = "none"
1561
+
1562
+ if "opacity" in stop.attrib:
1563
+ opacity = stop.attrib["opacity"]
1564
+ else:
1565
+ opacity = 1.0
1566
+
1567
+ stop_info = {"偏移": offset, "颜色": stop_color, "透明度": opacity}
1568
+ stop_infos.append(stop_info)
1569
+
1570
+ start_color = stop_infos[0]["颜色"]
1571
+ start_offset = stop_infos[0]["偏移"]
1572
+ start_alpha = stop_infos[0]["透明度"]
1573
+ end_color = stop_infos[-1]["颜色"]
1574
+ end_offset = stop_infos[-1]["偏移"]
1575
+ end_alpha = stop_infos[-1]["透明度"]
1576
+
1577
+ if len(stop_list) == 2:
1578
+ add_stop_color = "[]"
1579
+ else:
1580
+ code += f'{TAB}{id}中间点 = [\n'
1581
+ for stop_info in stop_infos[1:-2]:
1582
+ if stop_info["透明度"] == 1:
1583
+ code += f'{TAB}{TAB}{{"偏移": "{stop_info["偏移"]}", "颜色": "{stop_info["颜色"]}"}},\n'
1584
+ else:
1585
+ code += f'{TAB}{TAB}{{"偏移": "{stop_info["偏移"]}", "颜色": "{stop_info["颜色"]}", "透明度": {stop_info["透明度"]}}},\n'
1586
+
1587
+ code += f'{TAB}]\n'
1588
+ add_stop_color = f"{id}中间点"
1589
+ # add_stop_color = "[]"
1590
+
1591
+ if gradientTransform is None:
1592
+ code += f'{TAB}'
1593
+ else:
1594
+ code += f'{TAB}{id} = '
1595
+
1596
+ code += f'self.创建径向渐变色(渐变开始中心点=({cx},{cy}), 渐变半径={r}, 开始颜色="{start_color}", 结束颜色="{end_color}", \n' \
1597
+ f'{TAB}{TAB}{TAB}开始偏移="{start_offset}", 结束偏移="{end_offset}",开始透明度={start_alpha}, 结束透明度={end_alpha}, \n' \
1598
+ f'{TAB}{TAB}{TAB}增加渐变中间点={add_stop_color},渐变的焦点={渐变的焦点},id="{id}")\n'
1599
+
1600
+ if gradientTransform is not None:
1601
+ code += f'{TAB}{id}["gradientTransform"]="{gradientTransform}"\n\n'
1602
+ else:
1603
+ print("未处理", item.tag)
1604
+ pass
1605
+
1606
+ defs += code
1607
+
1608
+ return defs
1609
+
1610
+
1611
+ def 读取SVG生成代码(SVG文件, py文件):
1612
+ tree = ET.parse(SVG文件)
1613
+ root = tree.getroot()
1614
+ pycode = """# -*- coding:utf-8 -*-
1615
+ # title :
1616
+ # description :
1617
+ # author :Python超人/三月三提供
1618
+ # date :2024-05-01
1619
+ # link :https://gitee.com/march3
1620
+ # python_version :3.9
1621
+ # ==============================================================================
1622
+ import os
1623
+
1624
+ from svg_to_pdf.神笔绘图板 import 神笔绘图板
1625
+ from svg_to_pdf.神笔绘图板工具 import 神笔绘图板工具
1626
+ from svg_to_pdf.常量 import *
1627
+ from svg_to_pdf.渐变色元素 import *
1628
+
1629
+
1630
+ 点定位 = False
1631
+ 点定位坐标 = False
1632
+ """
1633
+ fun_names = ""
1634
+ defs = ""
1635
+ _pycode = ""
1636
+ TAB = " "
1637
+ style_names = {}
1638
+
1639
+ for elm in root:
1640
+ if elm.tag.endswith("}g"):
1641
+ _pycode, fun_names, style_names = SVG_group(elm, _pycode, fun_names, TAB, style_names)
1642
+
1643
+ for elm in root:
1644
+ if elm.tag.endswith("}defs"):
1645
+ defs = SVG_defs(elm, defs, TAB, style_names)
1646
+ #
1647
+ fun_names = f"{TAB}创建渐变色样式(高清图)\n" + fun_names
1648
+ if defs == "":
1649
+ defs = f"{TAB}pass\n"
1650
+ pycode += "def 创建渐变色样式(self):\n" + defs
1651
+ pycode += _pycode
1652
+ pycode += """
1653
+ if __name__ == '__main__':
1654
+ 高清图 = 神笔绘图板(作品文件路径="#{SVG文件}.svg", 宽=800, 高=800)
1655
+ # 高清图.贴图(x=-100, y=0, 图片文件="./images/超级玛丽_AI.svg", 缩放=1, 旋转角度=0)
1656
+ 高清图.图框(网格线距=20, 网格颜色=颜色.红色, 网格透明度=1, 网格字体大小=9)
1657
+ #{方法}
1658
+ 高清图.保存()
1659
+ """.replace("#{方法}", fun_names).replace("#{SVG文件}", py文件[:-3])
1660
+
1661
+ with open(py文件, mode='w', encoding="utf-8") as f:
1662
+ f.write(pycode)
1663
+ # print(pycode)
1664
+
1665
+
1666
+ def 下载html(url):
1667
+ import requests
1668
+
1669
+ response = requests.get(url)
1670
+ filename = os.path.basename(url).replace("-", "_")
1671
+
1672
+ if not filename.endswith(".html"):
1673
+ filename = filename + ".html"
1674
+
1675
+ with open(filename, 'w', encoding="utf-8") as file:
1676
+ file.write(response.text)
1677
+
1678
+ return filename
1679
+
1680
+
1681
+ def 分析SVG(文件, tmp_dir_name=None):
1682
+ if tmp_dir_name is None:
1683
+ tmp_dir_name = os.path.basename(文件).replace(".html", "")
1684
+ import re
1685
+ from bs4 import BeautifulSoup
1686
+
1687
+ # 读取HTML文件
1688
+ with open(文件, 'r', encoding="utf-8") as file:
1689
+ html_content = file.read()
1690
+
1691
+ # 解析HTML内容
1692
+ soup = BeautifulSoup(html_content, 'html.parser')
1693
+ # tmp_dir_name = "flag"
1694
+ if not os.path.exists(tmp_dir_name):
1695
+ os.makedirs(tmp_dir_name)
1696
+
1697
+ # 查找所有的SVG标签
1698
+ svg_tags = soup.find_all('svg')
1699
+ c = 0
1700
+ # 遍历每个SVG标签并将其保存为SVG文件
1701
+ for i, svg_tag in enumerate(svg_tags):
1702
+ if "data-tip" not in svg_tag.parent.attrs:
1703
+ continue
1704
+ data_tip = svg_tag.parent.attrs["data-tip"].replace(":", "-")
1705
+ viewbox = svg_tag.attrs["viewbox"]
1706
+ viewboxs = viewbox.split(" ")
1707
+ width = int(viewboxs[2])
1708
+ svg_tag.attrs["width"] = viewboxs[2]
1709
+ svg_tag.attrs["height"] = viewboxs[3]
1710
+ svg_content = str(svg_tag)
1711
+
1712
+ if width < 20:
1713
+ scale = 15
1714
+ elif width < 50:
1715
+ scale = 5
1716
+ elif width < 100:
1717
+ scale = 3
1718
+ elif width < 150:
1719
+ scale = 2
1720
+ else:
1721
+ scale = 0
1722
+
1723
+ filename_ = f'{tmp_dir_name}/{tmp_dir_name}_{data_tip}.svg'
1724
+
1725
+ if scale > 0:
1726
+ filename1 = f'{tmp_dir_name}/{tmp_dir_name}_{data_tip}_tmp.svg'
1727
+ with open(filename1, 'w', encoding="utf-8") as file:
1728
+ file.write(svg_content)
1729
+ from 神笔码靓.神笔库.cairosvg工具集 import CairoSvg工具集
1730
+ CairoSvg工具集.放大SVG(url=filename1, save_as=filename_, scale=scale)
1731
+ if os.path.exists(filename1):
1732
+ os.remove(filename1)
1733
+ else:
1734
+ with open(filename_, 'w', encoding="utf-8") as file:
1735
+ file.write(svg_content)
1736
+
1737
+ c += 1
1738
+
1739
+ # if c > 10:
1740
+ # break
1741
+
1742
+
1743
+ def svg_index_html(root_dir):
1744
+ import os
1745
+ import re
1746
+
1747
+ # 获取当前目录下所有的 SVG 文件名
1748
+ svg_files = [f for f in os.listdir(root_dir) if re.match(r'.*\.svg$', f)]
1749
+
1750
+ # 生成 HTML 页面
1751
+ html = '<!DOCTYPE html><html><head><style>img { width: 64px; padding:6px; }</style></head><body>'
1752
+ for svg_file in svg_files:
1753
+ html += f'<a target="_blank" href="{svg_file}"><img title="{svg_file}" src="{svg_file}"></a>'
1754
+ html += '</body></html>'
1755
+
1756
+ # 将 HTML 页面保存为 index.html
1757
+ with open(os.path.join(root_dir, '_图片索引.html'), 'w') as f:
1758
+ f.write(html)
1759
+
1760
+
1761
+ # if __name__ == '__main__':
1762
+ # from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
1763
+ #
1764
+ # 宽, 高 = 纸张大小.A4_横向(1)
1765
+ # 神笔 = 神笔绘图板(作品文件路径="神笔绘图板倒角.svg", 宽=宽, 高=高)
1766
+ # 神笔.连线(路径点列表=[("移动", 130, 100),
1767
+ # ("直线", 200, 130),
1768
+ # ("水平线", 200),
1769
+ # # ("倒圆角", 40),
1770
+ # ("倒角", 50),
1771
+ # ("直线", 200, 240)])
1772
+ # 神笔.完成()
1773
+
1774
+ if __name__ == '__main__':
1775
+ # filename = 下载html(url="https://yesicon.app/")
1776
+ # 分析SVG(filename)
1777
+ # 分析SVG("SVG解析.html", "boy")
1778
+
1779
+ # svg_index_html(资源库目录("图标\目录"))
1780
+
1781
+ # svg = 资源库目录("素材/三原色/红黄蓝三原色.svg")
1782
+ # 读取SVG生成代码(svg, "./三原色_.py")
1783
+ # exit(0)
1784
+ path_d = """
1785
+ m84.26,180.74c-7.82-6.33-7.96-2.65-19.4-4.6-22.98-3.91-22.68-16.14-22.98-18.04-.51-3.3,1.95-5.09,3.93-9.97,1.47-3.64,2.03-7.47,1.94-18.71-.02-3.2,4.09-2.43,6.26-13.74.69-3.6.26-7.97,1.96-10.43,1.74-2.52-.14-5.97,1.06-6.85,3.06-2.26,8.68-.72,9.87-10.6,1.02-8.45-4.94-5.76-4.77-10.55.55-14.9-2.29-33.6-.85-46.55.36-3.27,2.95-3.6,3.23-7.23.79-10.01.37-22.46-.33-22.78-1.44-.65-1.78.58-2.22.73-1.31.46-4.6,6.38-6.21,14.55-1.55,7.84.3,11.21-1.19,17.96-2.13,9.62-5.79,28-6.89,28.17-4.21.65-16.04-1.72-21.02,2.55-3.83,3.29,1.08,3.3-4.26,9.02-1.19,1.28-6.14-.14-6.89,1.19-.72,1.27,1.43,3.23.68,4.09-.38.43-1.22-.27-2.04.17-1.26.68-.45,2.92-1.53,5.53-.95,2.3-2.24,2.15-2.55,3.49-.78,3.32,6.99,5.13,10.55,11.91,3.3,6.28,1.28,13.52.68,15.66-1.17,4.21-3.31,6.95-3.74,7.83-1.53,3.06-14.48,8.22-16.34,14.13-2.89,9.19,4.09,12.6,4.77,16.85.72,4.53,6.3,27.57,21.79,45.11,8.13,9.2,27.65,25.12,39.49,23.83,9.36-1.02,20.08-4.32,22.98-16.85,2.38-10.28,1.19-20.09-5.96-25.87Zm-47.45-66.43c-.26-.68-.33-6.05.09-8.34.52-2.85,1.46-4.51,2.6-5.83.19-.22,1.87-2.61,2.98-2.09.84.4.74,2.24.68,3.28-.14,2.57-.93,4.66-1.36,6.09-1.83,6.04-4.63,7.81-4.98,6.89Z
1786
+ """
1787
+ commands = 神笔绘图板工具.path_d_split(path_d)
1788
+ commands = 神笔绘图板工具.相对坐标转绝对坐标(commands)
1789
+ list_code = "["
1790
+ for i, cmd in enumerate(commands):
1791
+ list_code += f'("{cmd[0]}",{cmd[1:].replace(" ", ",")}), \n'
1792
+ list_code += "]"
1793
+ print(list_code)