2ephyrh commited on
Commit
f27bf44
·
verified ·
1 Parent(s): 3f574b1

Upload 818 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +14 -0
  2. .gradio/certificate.pem +31 -0
  3. .gradio/flagged/dataset1.csv +2 -0
  4. .idea/.gitignore +8 -0
  5. .idea/deployment.xml +847 -0
  6. .idea/inspectionProfiles/profiles_settings.xml +6 -0
  7. .idea/misc.xml +7 -0
  8. .idea/modules.xml +8 -0
  9. .idea/pythonProject.iml +10 -0
  10. .idea/workspace.xml +118 -0
  11. .venv/.gitignore +2 -0
  12. .venv/Lib/site-packages/__pycache__/_virtualenv.cpython-311.pyc +0 -0
  13. .venv/Lib/site-packages/_distutils_hack/__init__.py +227 -0
  14. .venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc +0 -0
  15. .venv/Lib/site-packages/_distutils_hack/override.py +1 -0
  16. .venv/Lib/site-packages/_virtualenv.pth +3 -0
  17. .venv/Lib/site-packages/_virtualenv.py +102 -0
  18. .venv/Lib/site-packages/distutils-precedence.pth +3 -0
  19. .venv/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt +738 -0
  20. .venv/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER +1 -0
  21. .venv/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt +20 -0
  22. .venv/Lib/site-packages/pip-23.2.1.dist-info/METADATA +90 -0
  23. .venv/Lib/site-packages/pip-23.2.1.dist-info/RECORD +1063 -0
  24. .venv/Lib/site-packages/pip-23.2.1.dist-info/WHEEL +5 -0
  25. .venv/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt +4 -0
  26. .venv/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt +1 -0
  27. .venv/Lib/site-packages/pip-23.2.1.virtualenv +0 -0
  28. .venv/Lib/site-packages/pip/__init__.py +13 -0
  29. .venv/Lib/site-packages/pip/__main__.py +24 -0
  30. .venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  31. .venv/Lib/site-packages/pip/_internal/__init__.py +19 -0
  32. .venv/Lib/site-packages/pip/_internal/build_env.py +311 -0
  33. .venv/Lib/site-packages/pip/_internal/cache.py +292 -0
  34. .venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
  35. .venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +171 -0
  36. .venv/Lib/site-packages/pip/_internal/cli/base_command.py +236 -0
  37. .venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1074 -0
  38. .venv/Lib/site-packages/pip/_internal/cli/command_context.py +27 -0
  39. .venv/Lib/site-packages/pip/_internal/cli/main.py +79 -0
  40. .venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
  41. .venv/Lib/site-packages/pip/_internal/cli/parser.py +294 -0
  42. .venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +68 -0
  43. .venv/Lib/site-packages/pip/_internal/cli/req_command.py +508 -0
  44. .venv/Lib/site-packages/pip/_internal/cli/spinners.py +159 -0
  45. .venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
  46. .venv/Lib/site-packages/pip/_internal/commands/__init__.py +132 -0
  47. .venv/Lib/site-packages/pip/_internal/commands/cache.py +222 -0
  48. .venv/Lib/site-packages/pip/_internal/commands/check.py +54 -0
  49. .venv/Lib/site-packages/pip/_internal/commands/completion.py +121 -0
  50. .venv/Lib/site-packages/pip/_internal/commands/configuration.py +282 -0
.gitattributes CHANGED
@@ -35,3 +35,17 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  examples/cls_1.jpg filter=lfs diff=lfs merge=lfs -text
37
  logo/logo.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  examples/cls_1.jpg filter=lfs diff=lfs merge=lfs -text
37
  logo/logo.png filter=lfs diff=lfs merge=lfs -text
38
+ .venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe filter=lfs diff=lfs merge=lfs -text
39
+ .venv/Lib/site-packages/pip/_vendor/distlib/t64.exe filter=lfs diff=lfs merge=lfs -text
40
+ .venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe filter=lfs diff=lfs merge=lfs -text
41
+ .venv/Lib/site-packages/pip/_vendor/distlib/w64.exe filter=lfs diff=lfs merge=lfs -text
42
+ .venv/Scripts/pip-3.11.exe filter=lfs diff=lfs merge=lfs -text
43
+ .venv/Scripts/pip.exe filter=lfs diff=lfs merge=lfs -text
44
+ .venv/Scripts/pip3.11.exe filter=lfs diff=lfs merge=lfs -text
45
+ .venv/Scripts/pip3.exe filter=lfs diff=lfs merge=lfs -text
46
+ .venv/Scripts/python.exe filter=lfs diff=lfs merge=lfs -text
47
+ .venv/Scripts/pythonw.exe filter=lfs diff=lfs merge=lfs -text
48
+ .venv/Scripts/wheel-3.11.exe filter=lfs diff=lfs merge=lfs -text
49
+ .venv/Scripts/wheel.exe filter=lfs diff=lfs merge=lfs -text
50
+ .venv/Scripts/wheel3.11.exe filter=lfs diff=lfs merge=lfs -text
51
+ .venv/Scripts/wheel3.exe filter=lfs diff=lfs merge=lfs -text
.gradio/certificate.pem ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
3
+ TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
4
+ cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
5
+ WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
6
+ ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
7
+ MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
8
+ h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
9
+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
10
+ A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
11
+ T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
12
+ B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
13
+ B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
14
+ KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
15
+ OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
16
+ jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
17
+ qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
18
+ rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
19
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
20
+ hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
21
+ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
22
+ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
23
+ NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
24
+ ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
25
+ TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
26
+ jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
27
+ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
28
+ 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
29
+ mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
30
+ emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
31
+ -----END CERTIFICATE-----
.gradio/flagged/dataset1.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ name,intensity,output,timestamp
2
+ 111,0,"Hello, 111",2025-12-01 22:00:59.780331
.idea/.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
.idea/deployment.xml ADDED
@@ -0,0 +1,847 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
4
+ <serverData>
5
+ <paths name="root@122.191.109.151:1027 password">
6
+ <serverdata>
7
+ <mappings>
8
+ <mapping local="$PROJECT_DIR$" web="/" />
9
+ </mappings>
10
+ </serverdata>
11
+ </paths>
12
+ <paths name="root@122.191.109.151:1027 password (10)">
13
+ <serverdata>
14
+ <mappings>
15
+ <mapping local="$PROJECT_DIR$" web="/" />
16
+ </mappings>
17
+ </serverdata>
18
+ </paths>
19
+ <paths name="root@122.191.109.151:1027 password (11)">
20
+ <serverdata>
21
+ <mappings>
22
+ <mapping local="$PROJECT_DIR$" web="/" />
23
+ </mappings>
24
+ </serverdata>
25
+ </paths>
26
+ <paths name="root@122.191.109.151:1027 password (12)">
27
+ <serverdata>
28
+ <mappings>
29
+ <mapping local="$PROJECT_DIR$" web="/" />
30
+ </mappings>
31
+ </serverdata>
32
+ </paths>
33
+ <paths name="root@122.191.109.151:1027 password (13)">
34
+ <serverdata>
35
+ <mappings>
36
+ <mapping local="$PROJECT_DIR$" web="/" />
37
+ </mappings>
38
+ </serverdata>
39
+ </paths>
40
+ <paths name="root@122.191.109.151:1027 password (14)">
41
+ <serverdata>
42
+ <mappings>
43
+ <mapping local="$PROJECT_DIR$" web="/" />
44
+ </mappings>
45
+ </serverdata>
46
+ </paths>
47
+ <paths name="root@122.191.109.151:1027 password (15)">
48
+ <serverdata>
49
+ <mappings>
50
+ <mapping local="$PROJECT_DIR$" web="/" />
51
+ </mappings>
52
+ </serverdata>
53
+ </paths>
54
+ <paths name="root@122.191.109.151:1027 password (2)">
55
+ <serverdata>
56
+ <mappings>
57
+ <mapping local="$PROJECT_DIR$" web="/" />
58
+ </mappings>
59
+ </serverdata>
60
+ </paths>
61
+ <paths name="root@122.191.109.151:1027 password (3)">
62
+ <serverdata>
63
+ <mappings>
64
+ <mapping local="$PROJECT_DIR$" web="/" />
65
+ </mappings>
66
+ </serverdata>
67
+ </paths>
68
+ <paths name="root@122.191.109.151:1027 password (4)">
69
+ <serverdata>
70
+ <mappings>
71
+ <mapping local="$PROJECT_DIR$" web="/" />
72
+ </mappings>
73
+ </serverdata>
74
+ </paths>
75
+ <paths name="root@122.191.109.151:1027 password (5)">
76
+ <serverdata>
77
+ <mappings>
78
+ <mapping local="$PROJECT_DIR$" web="/" />
79
+ </mappings>
80
+ </serverdata>
81
+ </paths>
82
+ <paths name="root@122.191.109.151:1027 password (6)">
83
+ <serverdata>
84
+ <mappings>
85
+ <mapping local="$PROJECT_DIR$" web="/" />
86
+ </mappings>
87
+ </serverdata>
88
+ </paths>
89
+ <paths name="root@122.191.109.151:1027 password (7)">
90
+ <serverdata>
91
+ <mappings>
92
+ <mapping local="$PROJECT_DIR$" web="/" />
93
+ </mappings>
94
+ </serverdata>
95
+ </paths>
96
+ <paths name="root@122.191.109.151:1027 password (8)">
97
+ <serverdata>
98
+ <mappings>
99
+ <mapping local="$PROJECT_DIR$" web="/" />
100
+ </mappings>
101
+ </serverdata>
102
+ </paths>
103
+ <paths name="root@122.191.109.151:1027 password (9)">
104
+ <serverdata>
105
+ <mappings>
106
+ <mapping local="$PROJECT_DIR$" web="/" />
107
+ </mappings>
108
+ </serverdata>
109
+ </paths>
110
+ <paths name="root@122.191.109.151:1037 password">
111
+ <serverdata>
112
+ <mappings>
113
+ <mapping local="$PROJECT_DIR$" web="/" />
114
+ </mappings>
115
+ </serverdata>
116
+ </paths>
117
+ <paths name="root@122.191.109.151:1038 password">
118
+ <serverdata>
119
+ <mappings>
120
+ <mapping local="$PROJECT_DIR$" web="/" />
121
+ </mappings>
122
+ </serverdata>
123
+ </paths>
124
+ <paths name="root@122.191.109.151:1038 password (2)">
125
+ <serverdata>
126
+ <mappings>
127
+ <mapping local="$PROJECT_DIR$" web="/" />
128
+ </mappings>
129
+ </serverdata>
130
+ </paths>
131
+ <paths name="root@122.191.109.151:1038 password (3)">
132
+ <serverdata>
133
+ <mappings>
134
+ <mapping local="$PROJECT_DIR$" web="/" />
135
+ </mappings>
136
+ </serverdata>
137
+ </paths>
138
+ <paths name="root@122.191.109.151:1039 password">
139
+ <serverdata>
140
+ <mappings>
141
+ <mapping local="$PROJECT_DIR$" web="/" />
142
+ </mappings>
143
+ </serverdata>
144
+ </paths>
145
+ <paths name="root@122.191.109.151:1044 password">
146
+ <serverdata>
147
+ <mappings>
148
+ <mapping local="$PROJECT_DIR$" web="/" />
149
+ </mappings>
150
+ </serverdata>
151
+ </paths>
152
+ <paths name="root@122.191.109.151:1044 password (2)">
153
+ <serverdata>
154
+ <mappings>
155
+ <mapping local="$PROJECT_DIR$" web="/" />
156
+ </mappings>
157
+ </serverdata>
158
+ </paths>
159
+ <paths name="root@122.191.109.151:1044 password (3)">
160
+ <serverdata>
161
+ <mappings>
162
+ <mapping local="$PROJECT_DIR$" web="/" />
163
+ </mappings>
164
+ </serverdata>
165
+ </paths>
166
+ <paths name="root@122.191.109.151:1044 password (4)">
167
+ <serverdata>
168
+ <mappings>
169
+ <mapping local="$PROJECT_DIR$" web="/" />
170
+ </mappings>
171
+ </serverdata>
172
+ </paths>
173
+ <paths name="root@122.191.109.151:1044 password (5)">
174
+ <serverdata>
175
+ <mappings>
176
+ <mapping local="$PROJECT_DIR$" web="/" />
177
+ </mappings>
178
+ </serverdata>
179
+ </paths>
180
+ <paths name="root@122.191.109.151:1044 password (6)">
181
+ <serverdata>
182
+ <mappings>
183
+ <mapping local="$PROJECT_DIR$" web="/" />
184
+ </mappings>
185
+ </serverdata>
186
+ </paths>
187
+ <paths name="root@122.191.109.151:1044 password (7)">
188
+ <serverdata>
189
+ <mappings>
190
+ <mapping local="$PROJECT_DIR$" web="/" />
191
+ </mappings>
192
+ </serverdata>
193
+ </paths>
194
+ <paths name="root@122.191.109.151:1044 password (8)">
195
+ <serverdata>
196
+ <mappings>
197
+ <mapping local="$PROJECT_DIR$" web="/" />
198
+ </mappings>
199
+ </serverdata>
200
+ </paths>
201
+ <paths name="root@122.191.109.151:1047 password">
202
+ <serverdata>
203
+ <mappings>
204
+ <mapping local="$PROJECT_DIR$" web="/" />
205
+ </mappings>
206
+ </serverdata>
207
+ </paths>
208
+ <paths name="root@122.191.109.151:1058 password">
209
+ <serverdata>
210
+ <mappings>
211
+ <mapping local="$PROJECT_DIR$" web="/" />
212
+ </mappings>
213
+ </serverdata>
214
+ </paths>
215
+ <paths name="root@122.191.109.151:1069 password">
216
+ <serverdata>
217
+ <mappings>
218
+ <mapping local="$PROJECT_DIR$" web="/" />
219
+ </mappings>
220
+ </serverdata>
221
+ </paths>
222
+ <paths name="root@122.191.109.151:1077 password">
223
+ <serverdata>
224
+ <mappings>
225
+ <mapping local="$PROJECT_DIR$" web="/" />
226
+ </mappings>
227
+ </serverdata>
228
+ </paths>
229
+ <paths name="root@122.191.109.151:1077 password (2)">
230
+ <serverdata>
231
+ <mappings>
232
+ <mapping local="$PROJECT_DIR$" web="/" />
233
+ </mappings>
234
+ </serverdata>
235
+ </paths>
236
+ <paths name="root@122.191.109.151:1080 password">
237
+ <serverdata>
238
+ <mappings>
239
+ <mapping local="$PROJECT_DIR$" web="/" />
240
+ </mappings>
241
+ </serverdata>
242
+ </paths>
243
+ <paths name="root@122.191.109.151:1084 password">
244
+ <serverdata>
245
+ <mappings>
246
+ <mapping local="$PROJECT_DIR$" web="/" />
247
+ </mappings>
248
+ </serverdata>
249
+ </paths>
250
+ <paths name="root@122.191.109.151:1084 password (2)">
251
+ <serverdata>
252
+ <mappings>
253
+ <mapping local="$PROJECT_DIR$" web="/" />
254
+ </mappings>
255
+ </serverdata>
256
+ </paths>
257
+ <paths name="root@122.191.109.151:1085 password">
258
+ <serverdata>
259
+ <mappings>
260
+ <mapping local="$PROJECT_DIR$" web="/" />
261
+ </mappings>
262
+ </serverdata>
263
+ </paths>
264
+ <paths name="root@122.191.109.151:1085 password (2)">
265
+ <serverdata>
266
+ <mappings>
267
+ <mapping local="$PROJECT_DIR$" web="/" />
268
+ </mappings>
269
+ </serverdata>
270
+ </paths>
271
+ <paths name="root@122.191.109.151:1103 password">
272
+ <serverdata>
273
+ <mappings>
274
+ <mapping local="$PROJECT_DIR$" web="/" />
275
+ </mappings>
276
+ </serverdata>
277
+ </paths>
278
+ <paths name="root@122.191.109.151:1104 password">
279
+ <serverdata>
280
+ <mappings>
281
+ <mapping local="$PROJECT_DIR$" web="/" />
282
+ </mappings>
283
+ </serverdata>
284
+ </paths>
285
+ <paths name="root@connect.cqa1.seetacloud.com:42115 password">
286
+ <serverdata>
287
+ <mappings>
288
+ <mapping local="$PROJECT_DIR$" web="/" />
289
+ </mappings>
290
+ </serverdata>
291
+ </paths>
292
+ <paths name="root@connect.westb.seetacloud.com:10864 password">
293
+ <serverdata>
294
+ <mappings>
295
+ <mapping local="$PROJECT_DIR$" web="/" />
296
+ </mappings>
297
+ </serverdata>
298
+ </paths>
299
+ <paths name="root@connect.westb.seetacloud.com:11136 password">
300
+ <serverdata>
301
+ <mappings>
302
+ <mapping local="$PROJECT_DIR$" web="/" />
303
+ </mappings>
304
+ </serverdata>
305
+ </paths>
306
+ <paths name="root@connect.westb.seetacloud.com:11260 password">
307
+ <serverdata>
308
+ <mappings>
309
+ <mapping local="$PROJECT_DIR$" web="/" />
310
+ </mappings>
311
+ </serverdata>
312
+ </paths>
313
+ <paths name="root@connect.westb.seetacloud.com:11260 password (2)">
314
+ <serverdata>
315
+ <mappings>
316
+ <mapping local="$PROJECT_DIR$" web="/" />
317
+ </mappings>
318
+ </serverdata>
319
+ </paths>
320
+ <paths name="root@connect.westb.seetacloud.com:12369 password">
321
+ <serverdata>
322
+ <mappings>
323
+ <mapping local="$PROJECT_DIR$" web="/" />
324
+ </mappings>
325
+ </serverdata>
326
+ </paths>
327
+ <paths name="root@connect.westb.seetacloud.com:13666 password">
328
+ <serverdata>
329
+ <mappings>
330
+ <mapping local="$PROJECT_DIR$" web="/" />
331
+ </mappings>
332
+ </serverdata>
333
+ </paths>
334
+ <paths name="root@connect.westb.seetacloud.com:16164 password">
335
+ <serverdata>
336
+ <mappings>
337
+ <mapping local="$PROJECT_DIR$" web="/" />
338
+ </mappings>
339
+ </serverdata>
340
+ </paths>
341
+ <paths name="root@connect.westb.seetacloud.com:17405 password">
342
+ <serverdata>
343
+ <mappings>
344
+ <mapping local="$PROJECT_DIR$" web="/" />
345
+ </mappings>
346
+ </serverdata>
347
+ </paths>
348
+ <paths name="root@connect.westb.seetacloud.com:17722 password">
349
+ <serverdata>
350
+ <mappings>
351
+ <mapping local="$PROJECT_DIR$" web="/" />
352
+ </mappings>
353
+ </serverdata>
354
+ </paths>
355
+ <paths name="root@connect.westb.seetacloud.com:19709 password">
356
+ <serverdata>
357
+ <mappings>
358
+ <mapping local="$PROJECT_DIR$" web="/" />
359
+ </mappings>
360
+ </serverdata>
361
+ </paths>
362
+ <paths name="root@connect.westb.seetacloud.com:20368 password">
363
+ <serverdata>
364
+ <mappings>
365
+ <mapping local="$PROJECT_DIR$" web="/" />
366
+ </mappings>
367
+ </serverdata>
368
+ </paths>
369
+ <paths name="root@connect.westb.seetacloud.com:20798 password">
370
+ <serverdata>
371
+ <mappings>
372
+ <mapping local="$PROJECT_DIR$" web="/" />
373
+ </mappings>
374
+ </serverdata>
375
+ </paths>
376
+ <paths name="root@connect.westb.seetacloud.com:23018 password">
377
+ <serverdata>
378
+ <mappings>
379
+ <mapping local="$PROJECT_DIR$" web="/" />
380
+ </mappings>
381
+ </serverdata>
382
+ </paths>
383
+ <paths name="root@connect.westb.seetacloud.com:23216 password">
384
+ <serverdata>
385
+ <mappings>
386
+ <mapping local="$PROJECT_DIR$" web="/" />
387
+ </mappings>
388
+ </serverdata>
389
+ </paths>
390
+ <paths name="root@connect.westb.seetacloud.com:24537 password">
391
+ <serverdata>
392
+ <mappings>
393
+ <mapping local="$PROJECT_DIR$" web="/" />
394
+ </mappings>
395
+ </serverdata>
396
+ </paths>
397
+ <paths name="root@connect.westb.seetacloud.com:25682 password">
398
+ <serverdata>
399
+ <mappings>
400
+ <mapping local="$PROJECT_DIR$" web="/" />
401
+ </mappings>
402
+ </serverdata>
403
+ </paths>
404
+ <paths name="root@connect.westb.seetacloud.com:27910 password">
405
+ <serverdata>
406
+ <mappings>
407
+ <mapping local="$PROJECT_DIR$" web="/" />
408
+ </mappings>
409
+ </serverdata>
410
+ </paths>
411
+ <paths name="root@connect.westb.seetacloud.com:27912 password">
412
+ <serverdata>
413
+ <mappings>
414
+ <mapping local="$PROJECT_DIR$" web="/" />
415
+ </mappings>
416
+ </serverdata>
417
+ </paths>
418
+ <paths name="root@connect.westb.seetacloud.com:28256 password">
419
+ <serverdata>
420
+ <mappings>
421
+ <mapping local="$PROJECT_DIR$" web="/" />
422
+ </mappings>
423
+ </serverdata>
424
+ </paths>
425
+ <paths name="root@connect.westb.seetacloud.com:28256 password (2)">
426
+ <serverdata>
427
+ <mappings>
428
+ <mapping local="$PROJECT_DIR$" web="/" />
429
+ </mappings>
430
+ </serverdata>
431
+ </paths>
432
+ <paths name="root@connect.westb.seetacloud.com:28256 password (3)">
433
+ <serverdata>
434
+ <mappings>
435
+ <mapping local="$PROJECT_DIR$" web="/" />
436
+ </mappings>
437
+ </serverdata>
438
+ </paths>
439
+ <paths name="root@connect.westb.seetacloud.com:28256 password (4)">
440
+ <serverdata>
441
+ <mappings>
442
+ <mapping local="$PROJECT_DIR$" web="/" />
443
+ </mappings>
444
+ </serverdata>
445
+ </paths>
446
+ <paths name="root@connect.westb.seetacloud.com:28429 password">
447
+ <serverdata>
448
+ <mappings>
449
+ <mapping local="$PROJECT_DIR$" web="/" />
450
+ </mappings>
451
+ </serverdata>
452
+ </paths>
453
+ <paths name="root@connect.westb.seetacloud.com:28573 password">
454
+ <serverdata>
455
+ <mappings>
456
+ <mapping local="$PROJECT_DIR$" web="/" />
457
+ </mappings>
458
+ </serverdata>
459
+ </paths>
460
+ <paths name="root@connect.westb.seetacloud.com:29742 password">
461
+ <serverdata>
462
+ <mappings>
463
+ <mapping local="$PROJECT_DIR$" web="/" />
464
+ </mappings>
465
+ </serverdata>
466
+ </paths>
467
+ <paths name="root@connect.westb.seetacloud.com:29990 password">
468
+ <serverdata>
469
+ <mappings>
470
+ <mapping local="$PROJECT_DIR$" web="/" />
471
+ </mappings>
472
+ </serverdata>
473
+ </paths>
474
+ <paths name="root@connect.westb.seetacloud.com:31469 password">
475
+ <serverdata>
476
+ <mappings>
477
+ <mapping local="$PROJECT_DIR$" web="/" />
478
+ </mappings>
479
+ </serverdata>
480
+ </paths>
481
+ <paths name="root@connect.westb.seetacloud.com:31772 password">
482
+ <serverdata>
483
+ <mappings>
484
+ <mapping local="$PROJECT_DIR$" web="/" />
485
+ </mappings>
486
+ </serverdata>
487
+ </paths>
488
+ <paths name="root@connect.westb.seetacloud.com:33066 password">
489
+ <serverdata>
490
+ <mappings>
491
+ <mapping local="$PROJECT_DIR$" web="/" />
492
+ </mappings>
493
+ </serverdata>
494
+ </paths>
495
+ <paths name="root@connect.westb.seetacloud.com:34418 password">
496
+ <serverdata>
497
+ <mappings>
498
+ <mapping local="$PROJECT_DIR$" web="/" />
499
+ </mappings>
500
+ </serverdata>
501
+ </paths>
502
+ <paths name="root@connect.westb.seetacloud.com:35295 password">
503
+ <serverdata>
504
+ <mappings>
505
+ <mapping local="$PROJECT_DIR$" web="/" />
506
+ </mappings>
507
+ </serverdata>
508
+ </paths>
509
+ <paths name="root@connect.westb.seetacloud.com:36656 password">
510
+ <serverdata>
511
+ <mappings>
512
+ <mapping local="$PROJECT_DIR$" web="/" />
513
+ </mappings>
514
+ </serverdata>
515
+ </paths>
516
+ <paths name="root@connect.westb.seetacloud.com:36938 password">
517
+ <serverdata>
518
+ <mappings>
519
+ <mapping local="$PROJECT_DIR$" web="/" />
520
+ </mappings>
521
+ </serverdata>
522
+ </paths>
523
+ <paths name="root@connect.westb.seetacloud.com:36938 password (2)">
524
+ <serverdata>
525
+ <mappings>
526
+ <mapping local="$PROJECT_DIR$" web="/" />
527
+ </mappings>
528
+ </serverdata>
529
+ </paths>
530
+ <paths name="root@connect.westb.seetacloud.com:38567 password">
531
+ <serverdata>
532
+ <mappings>
533
+ <mapping local="$PROJECT_DIR$" web="/" />
534
+ </mappings>
535
+ </serverdata>
536
+ </paths>
537
+ <paths name="root@connect.westb.seetacloud.com:38567 password (2)">
538
+ <serverdata>
539
+ <mappings>
540
+ <mapping local="$PROJECT_DIR$" web="/" />
541
+ </mappings>
542
+ </serverdata>
543
+ </paths>
544
+ <paths name="root@connect.westb.seetacloud.com:39898 password">
545
+ <serverdata>
546
+ <mappings>
547
+ <mapping local="$PROJECT_DIR$" web="/" />
548
+ </mappings>
549
+ </serverdata>
550
+ </paths>
551
+ <paths name="root@connect.westb.seetacloud.com:40224 password">
552
+ <serverdata>
553
+ <mappings>
554
+ <mapping local="$PROJECT_DIR$" web="/" />
555
+ </mappings>
556
+ </serverdata>
557
+ </paths>
558
+ <paths name="root@connect.westb.seetacloud.com:40678 password">
559
+ <serverdata>
560
+ <mappings>
561
+ <mapping local="$PROJECT_DIR$" web="/" />
562
+ </mappings>
563
+ </serverdata>
564
+ </paths>
565
+ <paths name="root@connect.westb.seetacloud.com:40907 password">
566
+ <serverdata>
567
+ <mappings>
568
+ <mapping local="$PROJECT_DIR$" web="/" />
569
+ </mappings>
570
+ </serverdata>
571
+ </paths>
572
+ <paths name="root@connect.westb.seetacloud.com:45770 password">
573
+ <serverdata>
574
+ <mappings>
575
+ <mapping local="$PROJECT_DIR$" web="/" />
576
+ </mappings>
577
+ </serverdata>
578
+ </paths>
579
+ <paths name="root@connect.westb.seetacloud.com:45784 password">
580
+ <serverdata>
581
+ <mappings>
582
+ <mapping local="$PROJECT_DIR$" web="/" />
583
+ </mappings>
584
+ </serverdata>
585
+ </paths>
586
+ <paths name="root@connect.westb.seetacloud.com:45784 password (2)">
587
+ <serverdata>
588
+ <mappings>
589
+ <mapping local="$PROJECT_DIR$" web="/" />
590
+ </mappings>
591
+ </serverdata>
592
+ </paths>
593
+ <paths name="root@connect.westb.seetacloud.com:46516 password">
594
+ <serverdata>
595
+ <mappings>
596
+ <mapping local="$PROJECT_DIR$" web="/" />
597
+ </mappings>
598
+ </serverdata>
599
+ </paths>
600
+ <paths name="root@connect.westb.seetacloud.com:48700 password">
601
+ <serverdata>
602
+ <mappings>
603
+ <mapping local="$PROJECT_DIR$" web="/" />
604
+ </mappings>
605
+ </serverdata>
606
+ </paths>
607
+ <paths name="root@connect.westb.seetacloud.com:51979 password">
608
+ <serverdata>
609
+ <mappings>
610
+ <mapping local="$PROJECT_DIR$" web="/" />
611
+ </mappings>
612
+ </serverdata>
613
+ </paths>
614
+ <paths name="root@connect.westc.gpuhub.com:10496 password">
615
+ <serverdata>
616
+ <mappings>
617
+ <mapping local="$PROJECT_DIR$" web="/" />
618
+ </mappings>
619
+ </serverdata>
620
+ </paths>
621
+ <paths name="root@connect.westc.gpuhub.com:10496 password (2)">
622
+ <serverdata>
623
+ <mappings>
624
+ <mapping local="$PROJECT_DIR$" web="/" />
625
+ </mappings>
626
+ </serverdata>
627
+ </paths>
628
+ <paths name="root@connect.westc.gpuhub.com:11472 password">
629
+ <serverdata>
630
+ <mappings>
631
+ <mapping local="$PROJECT_DIR$" web="/" />
632
+ </mappings>
633
+ </serverdata>
634
+ </paths>
635
+ <paths name="root@connect.westc.gpuhub.com:12801 password">
636
+ <serverdata>
637
+ <mappings>
638
+ <mapping local="$PROJECT_DIR$" web="/" />
639
+ </mappings>
640
+ </serverdata>
641
+ </paths>
642
+ <paths name="root@connect.westc.gpuhub.com:13422 password">
643
+ <serverdata>
644
+ <mappings>
645
+ <mapping local="$PROJECT_DIR$" web="/" />
646
+ </mappings>
647
+ </serverdata>
648
+ </paths>
649
+ <paths name="root@connect.westc.gpuhub.com:13422 password (2)">
650
+ <serverdata>
651
+ <mappings>
652
+ <mapping local="$PROJECT_DIR$" web="/" />
653
+ </mappings>
654
+ </serverdata>
655
+ </paths>
656
+ <paths name="root@connect.westc.gpuhub.com:14708 password">
657
+ <serverdata>
658
+ <mappings>
659
+ <mapping local="$PROJECT_DIR$" web="/" />
660
+ </mappings>
661
+ </serverdata>
662
+ </paths>
663
+ <paths name="root@connect.westc.gpuhub.com:16160 password">
664
+ <serverdata>
665
+ <mappings>
666
+ <mapping local="$PROJECT_DIR$" web="/" />
667
+ </mappings>
668
+ </serverdata>
669
+ </paths>
670
+ <paths name="root@connect.westc.gpuhub.com:17661 password">
671
+ <serverdata>
672
+ <mappings>
673
+ <mapping local="$PROJECT_DIR$" web="/" />
674
+ </mappings>
675
+ </serverdata>
676
+ </paths>
677
+ <paths name="root@connect.westc.gpuhub.com:22250 password">
678
+ <serverdata>
679
+ <mappings>
680
+ <mapping local="$PROJECT_DIR$" web="/" />
681
+ </mappings>
682
+ </serverdata>
683
+ </paths>
684
+ <paths name="root@connect.westc.gpuhub.com:24401 password">
685
+ <serverdata>
686
+ <mappings>
687
+ <mapping local="$PROJECT_DIR$" web="/" />
688
+ </mappings>
689
+ </serverdata>
690
+ </paths>
691
+ <paths name="root@connect.westc.gpuhub.com:24401 password (2)">
692
+ <serverdata>
693
+ <mappings>
694
+ <mapping local="$PROJECT_DIR$" web="/" />
695
+ </mappings>
696
+ </serverdata>
697
+ </paths>
698
+ <paths name="root@connect.westc.gpuhub.com:24401 password (3)">
699
+ <serverdata>
700
+ <mappings>
701
+ <mapping local="$PROJECT_DIR$" web="/" />
702
+ </mappings>
703
+ </serverdata>
704
+ </paths>
705
+ <paths name="root@connect.westc.gpuhub.com:28199 password">
706
+ <serverdata>
707
+ <mappings>
708
+ <mapping local="$PROJECT_DIR$" web="/" />
709
+ </mappings>
710
+ </serverdata>
711
+ </paths>
712
+ <paths name="root@connect.westc.gpuhub.com:28777 password">
713
+ <serverdata>
714
+ <mappings>
715
+ <mapping local="$PROJECT_DIR$" web="/" />
716
+ </mappings>
717
+ </serverdata>
718
+ </paths>
719
+ <paths name="root@connect.westc.gpuhub.com:29074 password">
720
+ <serverdata>
721
+ <mappings>
722
+ <mapping local="$PROJECT_DIR$" web="/" />
723
+ </mappings>
724
+ </serverdata>
725
+ </paths>
726
+ <paths name="root@connect.westc.gpuhub.com:31442 password">
727
+ <serverdata>
728
+ <mappings>
729
+ <mapping local="$PROJECT_DIR$" web="/" />
730
+ </mappings>
731
+ </serverdata>
732
+ </paths>
733
+ <paths name="root@connect.westc.gpuhub.com:31682 password">
734
+ <serverdata>
735
+ <mappings>
736
+ <mapping local="$PROJECT_DIR$" web="/" />
737
+ </mappings>
738
+ </serverdata>
739
+ </paths>
740
+ <paths name="root@connect.westc.gpuhub.com:32319 password">
741
+ <serverdata>
742
+ <mappings>
743
+ <mapping local="$PROJECT_DIR$" web="/" />
744
+ </mappings>
745
+ </serverdata>
746
+ </paths>
747
+ <paths name="root@connect.westc.gpuhub.com:34078 password">
748
+ <serverdata>
749
+ <mappings>
750
+ <mapping local="$PROJECT_DIR$" web="/" />
751
+ </mappings>
752
+ </serverdata>
753
+ </paths>
754
+ <paths name="root@connect.westc.gpuhub.com:34849 password">
755
+ <serverdata>
756
+ <mappings>
757
+ <mapping local="$PROJECT_DIR$" web="/" />
758
+ </mappings>
759
+ </serverdata>
760
+ </paths>
761
+ <paths name="root@connect.westc.gpuhub.com:37577 password">
762
+ <serverdata>
763
+ <mappings>
764
+ <mapping local="$PROJECT_DIR$" web="/" />
765
+ </mappings>
766
+ </serverdata>
767
+ </paths>
768
+ <paths name="root@connect.westc.gpuhub.com:42417 password">
769
+ <serverdata>
770
+ <mappings>
771
+ <mapping local="$PROJECT_DIR$" web="/" />
772
+ </mappings>
773
+ </serverdata>
774
+ </paths>
775
+ <paths name="root@connect.westc.gpuhub.com:42417 password (2)">
776
+ <serverdata>
777
+ <mappings>
778
+ <mapping local="$PROJECT_DIR$" web="/" />
779
+ </mappings>
780
+ </serverdata>
781
+ </paths>
782
+ <paths name="root@connect.westc.gpuhub.com:43314 password">
783
+ <serverdata>
784
+ <mappings>
785
+ <mapping local="$PROJECT_DIR$" web="/" />
786
+ </mappings>
787
+ </serverdata>
788
+ </paths>
789
+ <paths name="root@connect.westc.gpuhub.com:43314 password (2)">
790
+ <serverdata>
791
+ <mappings>
792
+ <mapping local="$PROJECT_DIR$" web="/" />
793
+ </mappings>
794
+ </serverdata>
795
+ </paths>
796
+ <paths name="root@connect.westc.gpuhub.com:43314 password (3)">
797
+ <serverdata>
798
+ <mappings>
799
+ <mapping local="$PROJECT_DIR$" web="/" />
800
+ </mappings>
801
+ </serverdata>
802
+ </paths>
803
+ <paths name="root@connect.westc.gpuhub.com:43314 password (4)">
804
+ <serverdata>
805
+ <mappings>
806
+ <mapping local="$PROJECT_DIR$" web="/" />
807
+ </mappings>
808
+ </serverdata>
809
+ </paths>
810
+ <paths name="root@connect.westc.gpuhub.com:44010 password">
811
+ <serverdata>
812
+ <mappings>
813
+ <mapping local="$PROJECT_DIR$" web="/" />
814
+ </mappings>
815
+ </serverdata>
816
+ </paths>
817
+ <paths name="root@connect.westc.gpuhub.com:46205 password">
818
+ <serverdata>
819
+ <mappings>
820
+ <mapping local="$PROJECT_DIR$" web="/" />
821
+ </mappings>
822
+ </serverdata>
823
+ </paths>
824
+ <paths name="root@connect.westc.gpuhub.com:48413 password">
825
+ <serverdata>
826
+ <mappings>
827
+ <mapping local="$PROJECT_DIR$" web="/" />
828
+ </mappings>
829
+ </serverdata>
830
+ </paths>
831
+ <paths name="root@connect.westc.gpuhub.com:49335 password">
832
+ <serverdata>
833
+ <mappings>
834
+ <mapping local="$PROJECT_DIR$" web="/" />
835
+ </mappings>
836
+ </serverdata>
837
+ </paths>
838
+ <paths name="root@connect.westc.gpuhub.com:49473 password">
839
+ <serverdata>
840
+ <mappings>
841
+ <mapping local="$PROJECT_DIR$" web="/" />
842
+ </mappings>
843
+ </serverdata>
844
+ </paths>
845
+ </serverData>
846
+ </component>
847
+ </project>
.idea/inspectionProfiles/profiles_settings.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
.idea/misc.xml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.10" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="gradio" project-jdk-type="Python SDK" />
7
+ </project>
.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/pythonProject.iml" filepath="$PROJECT_DIR$/.idea/pythonProject.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
.idea/pythonProject.iml ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.venv" />
6
+ </content>
7
+ <orderEntry type="jdk" jdkName="gradio" jdkType="Python SDK" />
8
+ <orderEntry type="sourceFolder" forTests="false" />
9
+ </component>
10
+ </module>
.idea/workspace.xml ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="7ea6aaaf-0832-425a-868a-507769e764ed" name="Changes" comment="" />
8
+ <option name="SHOW_DIALOG" value="false" />
9
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
10
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11
+ <option name="LAST_RESOLUTION" value="IGNORE" />
12
+ </component>
13
+ <component name="FileTemplateManagerImpl">
14
+ <option name="RECENT_TEMPLATES">
15
+ <list>
16
+ <option value="Python Script" />
17
+ </list>
18
+ </option>
19
+ </component>
20
+ <component name="FlaskConsoleOptions" custom-start-script="import sys&#10;sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])&#10;from flask.cli import ScriptInfo&#10;locals().update(ScriptInfo(create_app=None).load_app().make_shell_context())&#10;print(&quot;Python %s on %s\nApp: %s [%s]\nInstance: %s&quot; % (sys.version, sys.platform, app.import_name, app.env, app.instance_path))">
21
+ <envs>
22
+ <env key="FLASK_APP" value="app" />
23
+ </envs>
24
+ <option name="myCustomStartScript" value="import sys&#10;sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])&#10;from flask.cli import ScriptInfo&#10;locals().update(ScriptInfo(create_app=None).load_app().make_shell_context())&#10;print(&quot;Python %s on %s\nApp: %s [%s]\nInstance: %s&quot; % (sys.version, sys.platform, app.import_name, app.env, app.instance_path))" />
25
+ <option name="myEnvs">
26
+ <map>
27
+ <entry key="FLASK_APP" value="app" />
28
+ </map>
29
+ </option>
30
+ </component>
31
+ <component name="MarkdownSettingsMigration">
32
+ <option name="stateVersion" value="1" />
33
+ </component>
34
+ <component name="ProjectColorInfo">{
35
+ &quot;associatedIndex&quot;: 2
36
+ }</component>
37
+ <component name="ProjectId" id="36ElWiAVVDMBwmxQbOVg9uNK9Qw" />
38
+ <component name="ProjectViewState">
39
+ <option name="hideEmptyMiddlePackages" value="true" />
40
+ <option name="showLibraryContents" value="true" />
41
+ </component>
42
+ <component name="PropertiesComponent">{
43
+ &quot;keyToString&quot;: {
44
+ &quot;Python.app.executor&quot;: &quot;Run&quot;,
45
+ &quot;Python.convert.executor&quot;: &quot;Run&quot;,
46
+ &quot;Python.gradio.executor&quot;: &quot;Run&quot;,
47
+ &quot;Python.model.executor&quot;: &quot;Run&quot;,
48
+ &quot;Python.unpack_mnist.executor&quot;: &quot;Run&quot;,
49
+ &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
50
+ &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
51
+ &quot;last_opened_file_path&quot;: &quot;E:/基于gradio网页开发/demo/logo&quot;,
52
+ &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
53
+ &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
54
+ &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
55
+ &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
56
+ &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
57
+ &quot;settings.editor.selected.configurable&quot;: &quot;com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable&quot;,
58
+ &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
59
+ }
60
+ }</component>
61
+ <component name="RecentsManager">
62
+ <key name="CopyFile.RECENT_KEYS">
63
+ <recent name="E:\基于gradio网页开发\demo\logo" />
64
+ <recent name="E:\基于gradio网页开发\demo\models\segformer_b1" />
65
+ <recent name="E:\基于gradio网页开发\demo\models\vit_base" />
66
+ <recent name="C:\Users\Lenovo\Desktop\demo\pythonProject\examples" />
67
+ <recent name="C:\Users\Lenovo\Desktop\demo\pythonProject" />
68
+ </key>
69
+ <key name="MoveFile.RECENT_KEYS">
70
+ <recent name="E:\基于gradio网页开发\demo\models" />
71
+ <recent name="C:\Users\Lenovo\Desktop\demo\pythonProject\checkpoints\checkpoints" />
72
+ <recent name="C:\Users\Lenovo\Desktop\demo\pythonProject\mnist" />
73
+ <recent name="C:\Users\Lenovo\Desktop\demo\pythonProject" />
74
+ </key>
75
+ </component>
76
+ <component name="SharedIndexes">
77
+ <attachedChunks>
78
+ <set>
79
+ <option value="bundled-python-sdk-5a2391486177-2887949eec09-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-233.13763.11" />
80
+ </set>
81
+ </attachedChunks>
82
+ </component>
83
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
84
+ <component name="TaskManager">
85
+ <task active="true" id="Default" summary="Default task">
86
+ <changelist id="7ea6aaaf-0832-425a-868a-507769e764ed" name="Changes" comment="" />
87
+ <created>1764579645277</created>
88
+ <option name="number" value="Default" />
89
+ <option name="presentableId" value="Default" />
90
+ <updated>1764579645277</updated>
91
+ <workItem from="1764579648191" duration="8977000" />
92
+ <workItem from="1764600277627" duration="324000" />
93
+ <workItem from="1764600689932" duration="126000" />
94
+ <workItem from="1764602167109" duration="2439000" />
95
+ <workItem from="1764605201585" duration="1173000" />
96
+ <workItem from="1764653202726" duration="15352000" />
97
+ <workItem from="1764676527605" duration="7177000" />
98
+ <workItem from="1764684108511" duration="2396000" />
99
+ <workItem from="1764746379039" duration="2572000" />
100
+ <workItem from="1764749421655" duration="117000" />
101
+ <workItem from="1764749548086" duration="280000" />
102
+ <workItem from="1764749846066" duration="13110000" />
103
+ <workItem from="1764767223263" duration="346000" />
104
+ </task>
105
+ <servers />
106
+ </component>
107
+ <component name="TypeScriptGeneratedFilesManager">
108
+ <option name="version" value="3" />
109
+ </component>
110
+ <component name="com.intellij.coverage.CoverageDataManagerImpl">
111
+ <SUITE FILE_PATH="coverage/pythonProject$gradio.coverage" NAME="gradio Coverage Results" MODIFIED="1764597448141" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
112
+ <SUITE FILE_PATH="coverage/demo$app.coverage" NAME="app Coverage Results" MODIFIED="1764763191244" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
113
+ <SUITE FILE_PATH="coverage/pythonProject$unpack_mnist.coverage" NAME="unpack_mnist Coverage Results" MODIFIED="1764588167156" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
114
+ <SUITE FILE_PATH="coverage/pythonProject$app.coverage" NAME="app Coverage Results" MODIFIED="1764746750209" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
115
+ <SUITE FILE_PATH="coverage/pythonProject$model.coverage" NAME="model Coverage Results" MODIFIED="1764673742280" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
116
+ <SUITE FILE_PATH="coverage/pythonProject$convert.coverage" NAME="convert Coverage Results" MODIFIED="1764587925692" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
117
+ </component>
118
+ </project>
.venv/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # created by virtualenv automatically
2
+ *
.venv/Lib/site-packages/__pycache__/_virtualenv.cpython-311.pyc ADDED
Binary file (4.79 kB). View file
 
.venv/Lib/site-packages/_distutils_hack/__init__.py ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # don't import any costly modules
2
+ import sys
3
+ import os
4
+
5
+
6
+ is_pypy = '__pypy__' in sys.builtin_module_names
7
+
8
+
9
+ def warn_distutils_present():
10
+ if 'distutils' not in sys.modules:
11
+ return
12
+ if is_pypy and sys.version_info < (3, 7):
13
+ # PyPy for 3.6 unconditionally imports distutils, so bypass the warning
14
+ # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
15
+ return
16
+ import warnings
17
+
18
+ warnings.warn(
19
+ "Distutils was imported before Setuptools, but importing Setuptools "
20
+ "also replaces the `distutils` module in `sys.modules`. This may lead "
21
+ "to undesirable behaviors or errors. To avoid these issues, avoid "
22
+ "using distutils directly, ensure that setuptools is installed in the "
23
+ "traditional way (e.g. not an editable install), and/or make sure "
24
+ "that setuptools is always imported before distutils."
25
+ )
26
+
27
+
28
+ def clear_distutils():
29
+ if 'distutils' not in sys.modules:
30
+ return
31
+ import warnings
32
+
33
+ warnings.warn("Setuptools is replacing distutils.")
34
+ mods = [
35
+ name
36
+ for name in sys.modules
37
+ if name == "distutils" or name.startswith("distutils.")
38
+ ]
39
+ for name in mods:
40
+ del sys.modules[name]
41
+
42
+
43
+ def enabled():
44
+ """
45
+ Allow selection of distutils by environment variable.
46
+ """
47
+ which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
48
+ return which == 'local'
49
+
50
+
51
+ def ensure_local_distutils():
52
+ import importlib
53
+
54
+ clear_distutils()
55
+
56
+ # With the DistutilsMetaFinder in place,
57
+ # perform an import to cause distutils to be
58
+ # loaded from setuptools._distutils. Ref #2906.
59
+ with shim():
60
+ importlib.import_module('distutils')
61
+
62
+ # check that submodules load as expected
63
+ core = importlib.import_module('distutils.core')
64
+ assert '_distutils' in core.__file__, core.__file__
65
+ assert 'setuptools._distutils.log' not in sys.modules
66
+
67
+
68
+ def do_override():
69
+ """
70
+ Ensure that the local copy of distutils is preferred over stdlib.
71
+
72
+ See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
73
+ for more motivation.
74
+ """
75
+ if enabled():
76
+ warn_distutils_present()
77
+ ensure_local_distutils()
78
+
79
+
80
+ class _TrivialRe:
81
+ def __init__(self, *patterns):
82
+ self._patterns = patterns
83
+
84
+ def match(self, string):
85
+ return all(pat in string for pat in self._patterns)
86
+
87
+
88
+ class DistutilsMetaFinder:
89
+ def find_spec(self, fullname, path, target=None):
90
+ # optimization: only consider top level modules and those
91
+ # found in the CPython test suite.
92
+ if path is not None and not fullname.startswith('test.'):
93
+ return
94
+
95
+ method_name = 'spec_for_{fullname}'.format(**locals())
96
+ method = getattr(self, method_name, lambda: None)
97
+ return method()
98
+
99
+ def spec_for_distutils(self):
100
+ if self.is_cpython():
101
+ return
102
+
103
+ import importlib
104
+ import importlib.abc
105
+ import importlib.util
106
+
107
+ try:
108
+ mod = importlib.import_module('setuptools._distutils')
109
+ except Exception:
110
+ # There are a couple of cases where setuptools._distutils
111
+ # may not be present:
112
+ # - An older Setuptools without a local distutils is
113
+ # taking precedence. Ref #2957.
114
+ # - Path manipulation during sitecustomize removes
115
+ # setuptools from the path but only after the hook
116
+ # has been loaded. Ref #2980.
117
+ # In either case, fall back to stdlib behavior.
118
+ return
119
+
120
+ class DistutilsLoader(importlib.abc.Loader):
121
+ def create_module(self, spec):
122
+ mod.__name__ = 'distutils'
123
+ return mod
124
+
125
+ def exec_module(self, module):
126
+ pass
127
+
128
+ return importlib.util.spec_from_loader(
129
+ 'distutils', DistutilsLoader(), origin=mod.__file__
130
+ )
131
+
132
+ @staticmethod
133
+ def is_cpython():
134
+ """
135
+ Suppress supplying distutils for CPython (build and tests).
136
+ Ref #2965 and #3007.
137
+ """
138
+ return os.path.isfile('pybuilddir.txt')
139
+
140
+ def spec_for_pip(self):
141
+ """
142
+ Ensure stdlib distutils when running under pip.
143
+ See pypa/pip#8761 for rationale.
144
+ """
145
+ if sys.version_info >= (3, 12) or self.pip_imported_during_build():
146
+ return
147
+ clear_distutils()
148
+ self.spec_for_distutils = lambda: None
149
+
150
+ @classmethod
151
+ def pip_imported_during_build(cls):
152
+ """
153
+ Detect if pip is being imported in a build script. Ref #2355.
154
+ """
155
+ import traceback
156
+
157
+ return any(
158
+ cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None)
159
+ )
160
+
161
+ @staticmethod
162
+ def frame_file_is_setup(frame):
163
+ """
164
+ Return True if the indicated frame suggests a setup.py file.
165
+ """
166
+ # some frames may not have __file__ (#2940)
167
+ return frame.f_globals.get('__file__', '').endswith('setup.py')
168
+
169
+ def spec_for_sensitive_tests(self):
170
+ """
171
+ Ensure stdlib distutils when running select tests under CPython.
172
+
173
+ python/cpython#91169
174
+ """
175
+ clear_distutils()
176
+ self.spec_for_distutils = lambda: None
177
+
178
+ sensitive_tests = (
179
+ [
180
+ 'test.test_distutils',
181
+ 'test.test_peg_generator',
182
+ 'test.test_importlib',
183
+ ]
184
+ if sys.version_info < (3, 10)
185
+ else [
186
+ 'test.test_distutils',
187
+ ]
188
+ )
189
+
190
+
191
+ for name in DistutilsMetaFinder.sensitive_tests:
192
+ setattr(
193
+ DistutilsMetaFinder,
194
+ f'spec_for_{name}',
195
+ DistutilsMetaFinder.spec_for_sensitive_tests,
196
+ )
197
+
198
+
199
+ DISTUTILS_FINDER = DistutilsMetaFinder()
200
+
201
+
202
+ def add_shim():
203
+ DISTUTILS_FINDER in sys.meta_path or insert_shim()
204
+
205
+
206
+ class shim:
207
+ def __enter__(self):
208
+ insert_shim()
209
+
210
+ def __exit__(self, exc, value, tb):
211
+ _remove_shim()
212
+
213
+
214
+ def insert_shim():
215
+ sys.meta_path.insert(0, DISTUTILS_FINDER)
216
+
217
+
218
+ def _remove_shim():
219
+ try:
220
+ sys.meta_path.remove(DISTUTILS_FINDER)
221
+ except ValueError:
222
+ pass
223
+
224
+
225
+ if sys.version_info < (3, 12):
226
+ # DistutilsMetaFinder can only be disabled in Python < 3.12 (PEP 632)
227
+ remove_shim = _remove_shim
.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (11.3 kB). View file
 
.venv/Lib/site-packages/_distutils_hack/override.py ADDED
@@ -0,0 +1 @@
 
 
1
+ __import__('_distutils_hack').do_override()
.venv/Lib/site-packages/_virtualenv.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:69ac3d8f27e679c81b94ab30b3b56e9cd138219b1ba94a1fa3606d5a76a1433d
3
+ size 18
.venv/Lib/site-packages/_virtualenv.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Patches that are applied at runtime to the virtual environment."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import sys
7
+ from contextlib import suppress
8
+
9
+ VIRTUALENV_PATCH_FILE = os.path.join(__file__)
10
+
11
+
12
+ def patch_dist(dist):
13
+ """
14
+ Distutils allows user to configure some arguments via a configuration file:
15
+ https://docs.python.org/3/install/index.html#distutils-configuration-files.
16
+
17
+ Some of this arguments though don't make sense in context of the virtual environment files, let's fix them up.
18
+ """ # noqa: D205
19
+ # we cannot allow some install config as that would get packages installed outside of the virtual environment
20
+ old_parse_config_files = dist.Distribution.parse_config_files
21
+
22
+ def parse_config_files(self, *args, **kwargs):
23
+ result = old_parse_config_files(self, *args, **kwargs)
24
+ install = self.get_option_dict("install")
25
+
26
+ if "prefix" in install: # the prefix governs where to install the libraries
27
+ install["prefix"] = VIRTUALENV_PATCH_FILE, os.path.abspath(sys.prefix)
28
+ for base in ("purelib", "platlib", "headers", "scripts", "data"):
29
+ key = f"install_{base}"
30
+ if key in install: # do not allow global configs to hijack venv paths
31
+ install.pop(key, None)
32
+ return result
33
+
34
+ dist.Distribution.parse_config_files = parse_config_files
35
+
36
+
37
+ # Import hook that patches some modules to ignore configuration values that break package installation in case
38
+ # of virtual environments.
39
+ _DISTUTILS_PATCH = "distutils.dist", "setuptools.dist"
40
+ # https://docs.python.org/3/library/importlib.html#setting-up-an-importer
41
+
42
+
43
+ class _Finder:
44
+ """A meta path finder that allows patching the imported distutils modules."""
45
+
46
+ fullname = None
47
+
48
+ # lock[0] is threading.Lock(), but initialized lazily to avoid importing threading very early at startup,
49
+ # because there are gevent-based applications that need to be first to import threading by themselves.
50
+ # See https://github.com/pypa/virtualenv/issues/1895 for details.
51
+ lock = [] # noqa: RUF012
52
+
53
+ def find_spec(self, fullname, path, target=None): # noqa: ARG002
54
+ if fullname in _DISTUTILS_PATCH and self.fullname is None:
55
+ # initialize lock[0] lazily
56
+ if len(self.lock) == 0:
57
+ import threading
58
+
59
+ lock = threading.Lock()
60
+ # there is possibility that two threads T1 and T2 are simultaneously running into find_spec,
61
+ # observing .lock as empty, and further going into hereby initialization. However due to the GIL,
62
+ # list.append() operation is atomic and this way only one of the threads will "win" to put the lock
63
+ # - that every thread will use - into .lock[0].
64
+ # https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe
65
+ self.lock.append(lock)
66
+
67
+ from functools import partial
68
+ from importlib.util import find_spec
69
+
70
+ with self.lock[0]:
71
+ self.fullname = fullname
72
+ try:
73
+ spec = find_spec(fullname, path)
74
+ if spec is not None:
75
+ # https://www.python.org/dev/peps/pep-0451/#how-loading-will-work
76
+ is_new_api = hasattr(spec.loader, "exec_module")
77
+ func_name = "exec_module" if is_new_api else "load_module"
78
+ old = getattr(spec.loader, func_name)
79
+ func = self.exec_module if is_new_api else self.load_module
80
+ if old is not func:
81
+ with suppress(AttributeError): # C-Extension loaders are r/o such as zipimporter with <3.7
82
+ setattr(spec.loader, func_name, partial(func, old))
83
+ return spec
84
+ finally:
85
+ self.fullname = None
86
+ return None
87
+
88
+ @staticmethod
89
+ def exec_module(old, module):
90
+ old(module)
91
+ if module.__name__ in _DISTUTILS_PATCH:
92
+ patch_dist(module)
93
+
94
+ @staticmethod
95
+ def load_module(old, name):
96
+ module = old(name)
97
+ if module.__name__ in _DISTUTILS_PATCH:
98
+ patch_dist(module)
99
+ return module
100
+
101
+
102
+ sys.meta_path.insert(0, _Finder())
.venv/Lib/site-packages/distutils-precedence.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224
3
+ size 151
.venv/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt ADDED
@@ -0,0 +1,738 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @Switch01
2
+ A_Rog
3
+ Aakanksha Agrawal
4
+ Abhinav Sagar
5
+ ABHYUDAY PRATAP SINGH
6
+ abs51295
7
+ AceGentile
8
+ Adam Chainz
9
+ Adam Tse
10
+ Adam Wentz
11
+ admin
12
+ Adrien Morison
13
+ ahayrapetyan
14
+ Ahilya
15
+ AinsworthK
16
+ Akash Srivastava
17
+ Alan Yee
18
+ Albert Tugushev
19
+ Albert-Guan
20
+ albertg
21
+ Alberto Sottile
22
+ Aleks Bunin
23
+ Alethea Flowers
24
+ Alex Gaynor
25
+ Alex Grönholm
26
+ Alex Hedges
27
+ Alex Loosley
28
+ Alex Morega
29
+ Alex Stachowiak
30
+ Alexander Shtyrov
31
+ Alexandre Conrad
32
+ Alexey Popravka
33
+ Alli
34
+ Ami Fischman
35
+ Ananya Maiti
36
+ Anatoly Techtonik
37
+ Anders Kaseorg
38
+ Andre Aguiar
39
+ Andreas Lutro
40
+ Andrei Geacar
41
+ Andrew Gaul
42
+ Andrew Shymanel
43
+ Andrey Bienkowski
44
+ Andrey Bulgakov
45
+ Andrés Delfino
46
+ Andy Freeland
47
+ Andy Kluger
48
+ Ani Hayrapetyan
49
+ Aniruddha Basak
50
+ Anish Tambe
51
+ Anrs Hu
52
+ Anthony Sottile
53
+ Antoine Musso
54
+ Anton Ovchinnikov
55
+ Anton Patrushev
56
+ Antonio Alvarado Hernandez
57
+ Antony Lee
58
+ Antti Kaihola
59
+ Anubhav Patel
60
+ Anudit Nagar
61
+ Anuj Godase
62
+ AQNOUCH Mohammed
63
+ AraHaan
64
+ Arindam Choudhury
65
+ Armin Ronacher
66
+ Artem
67
+ Arun Babu Neelicattu
68
+ Ashley Manton
69
+ Ashwin Ramaswami
70
+ atse
71
+ Atsushi Odagiri
72
+ Avinash Karhana
73
+ Avner Cohen
74
+ Awit (Ah-Wit) Ghirmai
75
+ Baptiste Mispelon
76
+ Barney Gale
77
+ barneygale
78
+ Bartek Ogryczak
79
+ Bastian Venthur
80
+ Ben Bodenmiller
81
+ Ben Darnell
82
+ Ben Hoyt
83
+ Ben Mares
84
+ Ben Rosser
85
+ Bence Nagy
86
+ Benjamin Peterson
87
+ Benjamin VanEvery
88
+ Benoit Pierre
89
+ Berker Peksag
90
+ Bernard
91
+ Bernard Tyers
92
+ Bernardo B. Marques
93
+ Bernhard M. Wiedemann
94
+ Bertil Hatt
95
+ Bhavam Vidyarthi
96
+ Blazej Michalik
97
+ Bogdan Opanchuk
98
+ BorisZZZ
99
+ Brad Erickson
100
+ Bradley Ayers
101
+ Brandon L. Reiss
102
+ Brandt Bucher
103
+ Brett Randall
104
+ Brett Rosen
105
+ Brian Cristante
106
+ Brian Rosner
107
+ briantracy
108
+ BrownTruck
109
+ Bruno Oliveira
110
+ Bruno Renié
111
+ Bruno S
112
+ Bstrdsmkr
113
+ Buck Golemon
114
+ burrows
115
+ Bussonnier Matthias
116
+ bwoodsend
117
+ c22
118
+ Caleb Martinez
119
+ Calvin Smith
120
+ Carl Meyer
121
+ Carlos Liam
122
+ Carol Willing
123
+ Carter Thayer
124
+ Cass
125
+ Chandrasekhar Atina
126
+ Chih-Hsuan Yen
127
+ Chris Brinker
128
+ Chris Hunt
129
+ Chris Jerdonek
130
+ Chris Kuehl
131
+ Chris McDonough
132
+ Chris Pawley
133
+ Chris Pryer
134
+ Chris Wolfe
135
+ Christian Clauss
136
+ Christian Heimes
137
+ Christian Oudard
138
+ Christoph Reiter
139
+ Christopher Hunt
140
+ Christopher Snyder
141
+ cjc7373
142
+ Clark Boylan
143
+ Claudio Jolowicz
144
+ Clay McClure
145
+ Cody
146
+ Cody Soyland
147
+ Colin Watson
148
+ Collin Anderson
149
+ Connor Osborn
150
+ Cooper Lees
151
+ Cooper Ry Lees
152
+ Cory Benfield
153
+ Cory Wright
154
+ Craig Kerstiens
155
+ Cristian Sorinel
156
+ Cristina
157
+ Cristina Muñoz
158
+ Curtis Doty
159
+ cytolentino
160
+ Daan De Meyer
161
+ Damian
162
+ Damian Quiroga
163
+ Damian Shaw
164
+ Dan Black
165
+ Dan Savilonis
166
+ Dan Sully
167
+ Dane Hillard
168
+ daniel
169
+ Daniel Collins
170
+ Daniel Hahler
171
+ Daniel Holth
172
+ Daniel Jost
173
+ Daniel Katz
174
+ Daniel Shaulov
175
+ Daniele Esposti
176
+ Daniele Nicolodi
177
+ Daniele Procida
178
+ Daniil Konovalenko
179
+ Danny Hermes
180
+ Danny McClanahan
181
+ Darren Kavanagh
182
+ Dav Clark
183
+ Dave Abrahams
184
+ Dave Jones
185
+ David Aguilar
186
+ David Black
187
+ David Bordeynik
188
+ David Caro
189
+ David D Lowe
190
+ David Evans
191
+ David Hewitt
192
+ David Linke
193
+ David Poggi
194
+ David Pursehouse
195
+ David Runge
196
+ David Tucker
197
+ David Wales
198
+ Davidovich
199
+ Deepak Sharma
200
+ Deepyaman Datta
201
+ Denise Yu
202
+ derwolfe
203
+ Desetude
204
+ Devesh Kumar Singh
205
+ Diego Caraballo
206
+ Diego Ramirez
207
+ DiegoCaraballo
208
+ Dimitri Merejkowsky
209
+ Dimitri Papadopoulos
210
+ Dirk Stolle
211
+ Dmitry Gladkov
212
+ Dmitry Volodin
213
+ Domen Kožar
214
+ Dominic Davis-Foster
215
+ Donald Stufft
216
+ Dongweiming
217
+ doron zarhi
218
+ Dos Moonen
219
+ Douglas Thor
220
+ DrFeathers
221
+ Dustin Ingram
222
+ Dwayne Bailey
223
+ Ed Morley
224
+ Edgar Ramírez
225
+ Ee Durbin
226
+ Eitan Adler
227
+ ekristina
228
+ elainechan
229
+ Eli Schwartz
230
+ Elisha Hollander
231
+ Ellen Marie Dash
232
+ Emil Burzo
233
+ Emil Styrke
234
+ Emmanuel Arias
235
+ Endoh Takanao
236
+ enoch
237
+ Erdinc Mutlu
238
+ Eric Cousineau
239
+ Eric Gillingham
240
+ Eric Hanchrow
241
+ Eric Hopper
242
+ Erik M. Bray
243
+ Erik Rose
244
+ Erwin Janssen
245
+ Eugene Vereshchagin
246
+ everdimension
247
+ Federico
248
+ Felipe Peter
249
+ Felix Yan
250
+ fiber-space
251
+ Filip Kokosiński
252
+ Filipe Laíns
253
+ Finn Womack
254
+ finnagin
255
+ Florian Briand
256
+ Florian Rathgeber
257
+ Francesco
258
+ Francesco Montesano
259
+ Frost Ming
260
+ Gabriel Curio
261
+ Gabriel de Perthuis
262
+ Garry Polley
263
+ gavin
264
+ gdanielson
265
+ Geoffrey Sneddon
266
+ George Song
267
+ Georgi Valkov
268
+ Georgy Pchelkin
269
+ ghost
270
+ Giftlin Rajaiah
271
+ gizmoguy1
272
+ gkdoc
273
+ Godefroid Chapelle
274
+ Gopinath M
275
+ GOTO Hayato
276
+ gousaiyang
277
+ gpiks
278
+ Greg Roodt
279
+ Greg Ward
280
+ Guilherme Espada
281
+ Guillaume Seguin
282
+ gutsytechster
283
+ Guy Rozendorn
284
+ Guy Tuval
285
+ gzpan123
286
+ Hanjun Kim
287
+ Hari Charan
288
+ Harsh Vardhan
289
+ harupy
290
+ Harutaka Kawamura
291
+ hauntsaninja
292
+ Henrich Hartzer
293
+ Henry Schreiner
294
+ Herbert Pfennig
295
+ Holly Stotelmyer
296
+ Honnix
297
+ Hsiaoming Yang
298
+ Hugo Lopes Tavares
299
+ Hugo van Kemenade
300
+ Hugues Bruant
301
+ Hynek Schlawack
302
+ Ian Bicking
303
+ Ian Cordasco
304
+ Ian Lee
305
+ Ian Stapleton Cordasco
306
+ Ian Wienand
307
+ Igor Kuzmitshov
308
+ Igor Sobreira
309
+ Ilan Schnell
310
+ Illia Volochii
311
+ Ilya Baryshev
312
+ Inada Naoki
313
+ Ionel Cristian Mărieș
314
+ Ionel Maries Cristian
315
+ Ivan Pozdeev
316
+ Jacob Kim
317
+ Jacob Walls
318
+ Jaime Sanz
319
+ jakirkham
320
+ Jakub Kuczys
321
+ Jakub Stasiak
322
+ Jakub Vysoky
323
+ Jakub Wilk
324
+ James Cleveland
325
+ James Curtin
326
+ James Firth
327
+ James Gerity
328
+ James Polley
329
+ Jan Pokorný
330
+ Jannis Leidel
331
+ Jarek Potiuk
332
+ jarondl
333
+ Jason Curtis
334
+ Jason R. Coombs
335
+ JasonMo
336
+ JasonMo1
337
+ Jay Graves
338
+ Jean-Christophe Fillion-Robin
339
+ Jeff Barber
340
+ Jeff Dairiki
341
+ Jelmer Vernooij
342
+ jenix21
343
+ Jeremy Stanley
344
+ Jeremy Zafran
345
+ Jesse Rittner
346
+ Jiashuo Li
347
+ Jim Fisher
348
+ Jim Garrison
349
+ Jiun Bae
350
+ Jivan Amara
351
+ Joe Bylund
352
+ Joe Michelini
353
+ John Paton
354
+ John T. Wodder II
355
+ John-Scott Atlakson
356
+ johnthagen
357
+ Jon Banafato
358
+ Jon Dufresne
359
+ Jon Parise
360
+ Jonas Nockert
361
+ Jonathan Herbert
362
+ Joonatan Partanen
363
+ Joost Molenaar
364
+ Jorge Niedbalski
365
+ Joseph Bylund
366
+ Joseph Long
367
+ Josh Bronson
368
+ Josh Hansen
369
+ Josh Schneier
370
+ Juan Luis Cano Rodríguez
371
+ Juanjo Bazán
372
+ Judah Rand
373
+ Julian Berman
374
+ Julian Gethmann
375
+ Julien Demoor
376
+ Jussi Kukkonen
377
+ jwg4
378
+ Jyrki Pulliainen
379
+ Kai Chen
380
+ Kai Mueller
381
+ Kamal Bin Mustafa
382
+ kasium
383
+ kaustav haldar
384
+ keanemind
385
+ Keith Maxwell
386
+ Kelsey Hightower
387
+ Kenneth Belitzky
388
+ Kenneth Reitz
389
+ Kevin Burke
390
+ Kevin Carter
391
+ Kevin Frommelt
392
+ Kevin R Patterson
393
+ Kexuan Sun
394
+ Kit Randel
395
+ Klaas van Schelven
396
+ KOLANICH
397
+ kpinc
398
+ Krishna Oza
399
+ Kumar McMillan
400
+ Kyle Persohn
401
+ lakshmanaram
402
+ Laszlo Kiss-Kollar
403
+ Laurent Bristiel
404
+ Laurent LAPORTE
405
+ Laurie O
406
+ Laurie Opperman
407
+ layday
408
+ Leon Sasson
409
+ Lev Givon
410
+ Lincoln de Sousa
411
+ Lipis
412
+ lorddavidiii
413
+ Loren Carvalho
414
+ Lucas Cimon
415
+ Ludovic Gasc
416
+ Lukas Juhrich
417
+ Luke Macken
418
+ Luo Jiebin
419
+ luojiebin
420
+ luz.paz
421
+ László Kiss Kollár
422
+ M00nL1ght
423
+ Marc Abramowitz
424
+ Marc Tamlyn
425
+ Marcus Smith
426
+ Mariatta
427
+ Mark Kohler
428
+ Mark Williams
429
+ Markus Hametner
430
+ Martey Dodoo
431
+ Martin Fischer
432
+ Martin Häcker
433
+ Martin Pavlasek
434
+ Masaki
435
+ Masklinn
436
+ Matej Stuchlik
437
+ Mathew Jennings
438
+ Mathieu Bridon
439
+ Mathieu Kniewallner
440
+ Matt Bacchi
441
+ Matt Good
442
+ Matt Maker
443
+ Matt Robenolt
444
+ matthew
445
+ Matthew Einhorn
446
+ Matthew Feickert
447
+ Matthew Gilliard
448
+ Matthew Iversen
449
+ Matthew Treinish
450
+ Matthew Trumbell
451
+ Matthew Willson
452
+ Matthias Bussonnier
453
+ mattip
454
+ Maurits van Rees
455
+ Max W Chase
456
+ Maxim Kurnikov
457
+ Maxime Rouyrre
458
+ mayeut
459
+ mbaluna
460
+ mdebi
461
+ memoselyk
462
+ meowmeowcat
463
+ Michael
464
+ Michael Aquilina
465
+ Michael E. Karpeles
466
+ Michael Klich
467
+ Michael Mintz
468
+ Michael Williamson
469
+ michaelpacer
470
+ Michał Górny
471
+ Mickaël Schoentgen
472
+ Miguel Araujo Perez
473
+ Mihir Singh
474
+ Mike
475
+ Mike Hendricks
476
+ Min RK
477
+ MinRK
478
+ Miro Hrončok
479
+ Monica Baluna
480
+ montefra
481
+ Monty Taylor
482
+ Muha Ajjan‮
483
+ Nadav Wexler
484
+ Nahuel Ambrosini
485
+ Nate Coraor
486
+ Nate Prewitt
487
+ Nathan Houghton
488
+ Nathaniel J. Smith
489
+ Nehal J Wani
490
+ Neil Botelho
491
+ Nguyễn Gia Phong
492
+ Nicholas Serra
493
+ Nick Coghlan
494
+ Nick Stenning
495
+ Nick Timkovich
496
+ Nicolas Bock
497
+ Nicole Harris
498
+ Nikhil Benesch
499
+ Nikhil Ladha
500
+ Nikita Chepanov
501
+ Nikolay Korolev
502
+ Nipunn Koorapati
503
+ Nitesh Sharma
504
+ Niyas Sait
505
+ Noah
506
+ Noah Gorny
507
+ Nowell Strite
508
+ NtaleGrey
509
+ nvdv
510
+ OBITORASU
511
+ Ofek Lev
512
+ ofrinevo
513
+ Oliver Freund
514
+ Oliver Jeeves
515
+ Oliver Mannion
516
+ Oliver Tonnhofer
517
+ Olivier Girardot
518
+ Olivier Grisel
519
+ Ollie Rutherfurd
520
+ OMOTO Kenji
521
+ Omry Yadan
522
+ onlinejudge95
523
+ Oren Held
524
+ Oscar Benjamin
525
+ Oz N Tiram
526
+ Pachwenko
527
+ Patrick Dubroy
528
+ Patrick Jenkins
529
+ Patrick Lawson
530
+ patricktokeeffe
531
+ Patrik Kopkan
532
+ Paul Kehrer
533
+ Paul Moore
534
+ Paul Nasrat
535
+ Paul Oswald
536
+ Paul van der Linden
537
+ Paulus Schoutsen
538
+ Pavel Safronov
539
+ Pavithra Eswaramoorthy
540
+ Pawel Jasinski
541
+ Paweł Szramowski
542
+ Pekka Klärck
543
+ Peter Gessler
544
+ Peter Lisák
545
+ Peter Waller
546
+ petr-tik
547
+ Phaneendra Chiruvella
548
+ Phil Elson
549
+ Phil Freo
550
+ Phil Pennock
551
+ Phil Whelan
552
+ Philip Jägenstedt
553
+ Philip Molloy
554
+ Philippe Ombredanne
555
+ Pi Delport
556
+ Pierre-Yves Rofes
557
+ Pieter Degroote
558
+ pip
559
+ Prabakaran Kumaresshan
560
+ Prabhjyotsing Surjit Singh Sodhi
561
+ Prabhu Marappan
562
+ Pradyun Gedam
563
+ Prashant Sharma
564
+ Pratik Mallya
565
+ pre-commit-ci[bot]
566
+ Preet Thakkar
567
+ Preston Holmes
568
+ Przemek Wrzos
569
+ Pulkit Goyal
570
+ q0w
571
+ Qiangning Hong
572
+ Quentin Lee
573
+ Quentin Pradet
574
+ R. David Murray
575
+ Rafael Caricio
576
+ Ralf Schmitt
577
+ Razzi Abuissa
578
+ rdb
579
+ Reece Dunham
580
+ Remi Rampin
581
+ Rene Dudfield
582
+ Riccardo Magliocchetti
583
+ Riccardo Schirone
584
+ Richard Jones
585
+ Richard Si
586
+ Ricky Ng-Adam
587
+ Rishi
588
+ RobberPhex
589
+ Robert Collins
590
+ Robert McGibbon
591
+ Robert Pollak
592
+ Robert T. McGibbon
593
+ robin elisha robinson
594
+ Roey Berman
595
+ Rohan Jain
596
+ Roman Bogorodskiy
597
+ Roman Donchenko
598
+ Romuald Brunet
599
+ ronaudinho
600
+ Ronny Pfannschmidt
601
+ Rory McCann
602
+ Ross Brattain
603
+ Roy Wellington Ⅳ
604
+ Ruairidh MacLeod
605
+ Russell Keith-Magee
606
+ Ryan Shepherd
607
+ Ryan Wooden
608
+ ryneeverett
609
+ Sachi King
610
+ Salvatore Rinchiera
611
+ sandeepkiran-js
612
+ Savio Jomton
613
+ schlamar
614
+ Scott Kitterman
615
+ Sean
616
+ seanj
617
+ Sebastian Jordan
618
+ Sebastian Schaetz
619
+ Segev Finer
620
+ SeongSoo Cho
621
+ Sergey Vasilyev
622
+ Seth Michael Larson
623
+ Seth Woodworth
624
+ Shantanu
625
+ shireenrao
626
+ Shivansh-007
627
+ Shlomi Fish
628
+ Shovan Maity
629
+ Simeon Visser
630
+ Simon Cross
631
+ Simon Pichugin
632
+ sinoroc
633
+ sinscary
634
+ snook92
635
+ socketubs
636
+ Sorin Sbarnea
637
+ Srinivas Nyayapati
638
+ Stavros Korokithakis
639
+ Stefan Scherfke
640
+ Stefano Rivera
641
+ Stephan Erb
642
+ Stephen Rosen
643
+ stepshal
644
+ Steve (Gadget) Barnes
645
+ Steve Barnes
646
+ Steve Dower
647
+ Steve Kowalik
648
+ Steven Myint
649
+ Steven Silvester
650
+ stonebig
651
+ Stéphane Bidoul
652
+ Stéphane Bidoul (ACSONE)
653
+ Stéphane Klein
654
+ Sumana Harihareswara
655
+ Surbhi Sharma
656
+ Sviatoslav Sydorenko
657
+ Swat009
658
+ Sylvain
659
+ Takayuki SHIMIZUKAWA
660
+ Taneli Hukkinen
661
+ tbeswick
662
+ Thiago
663
+ Thijs Triemstra
664
+ Thomas Fenzl
665
+ Thomas Grainger
666
+ Thomas Guettler
667
+ Thomas Johansson
668
+ Thomas Kluyver
669
+ Thomas Smith
670
+ Thomas VINCENT
671
+ Tim D. Smith
672
+ Tim Gates
673
+ Tim Harder
674
+ Tim Heap
675
+ tim smith
676
+ tinruufu
677
+ Tobias Hermann
678
+ Tom Forbes
679
+ Tom Freudenheim
680
+ Tom V
681
+ Tomas Hrnciar
682
+ Tomas Orsava
683
+ Tomer Chachamu
684
+ Tommi Enenkel | AnB
685
+ Tomáš Hrnčiar
686
+ Tony Beswick
687
+ Tony Narlock
688
+ Tony Zhaocheng Tan
689
+ TonyBeswick
690
+ toonarmycaptain
691
+ Toshio Kuratomi
692
+ toxinu
693
+ Travis Swicegood
694
+ Tushar Sadhwani
695
+ Tzu-ping Chung
696
+ Valentin Haenel
697
+ Victor Stinner
698
+ victorvpaulo
699
+ Vikram - Google
700
+ Viktor Szépe
701
+ Ville Skyttä
702
+ Vinay Sajip
703
+ Vincent Philippon
704
+ Vinicyus Macedo
705
+ Vipul Kumar
706
+ Vitaly Babiy
707
+ Vladimir Rutsky
708
+ W. Trevor King
709
+ Wil Tan
710
+ Wilfred Hughes
711
+ William Edwards
712
+ William ML Leslie
713
+ William T Olson
714
+ William Woodruff
715
+ Wilson Mo
716
+ wim glenn
717
+ Winson Luk
718
+ Wolfgang Maier
719
+ Wu Zhenyu
720
+ XAMES3
721
+ Xavier Fernandez
722
+ xoviat
723
+ xtreak
724
+ YAMAMOTO Takashi
725
+ Yen Chi Hsuan
726
+ Yeray Diaz Diaz
727
+ Yoval P
728
+ Yu Jian
729
+ Yuan Jing Vincent Yan
730
+ Yusuke Hayashi
731
+ Zearin
732
+ Zhiping Deng
733
+ ziebam
734
+ Zvezdan Petkovic
735
+ Łukasz Langa
736
+ Роман Донченко
737
+ Семён Марьясин
738
+ ‮rekcäH nitraM‮
.venv/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.venv/Lib/site-packages/pip-23.2.1.dist-info/METADATA ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: pip
3
+ Version: 23.2.1
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Home-page: https://pip.pypa.io/
6
+ Author: The pip developers
7
+ Author-email: distutils-sig@python.org
8
+ License: MIT
9
+ Project-URL: Documentation, https://pip.pypa.io
10
+ Project-URL: Source, https://github.com/pypa/pip
11
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Topic :: Software Development :: Build Tools
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.7
20
+ Classifier: Programming Language :: Python :: 3.8
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: Implementation :: CPython
26
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
27
+ Requires-Python: >=3.7
28
+ License-File: LICENSE.txt
29
+ License-File: AUTHORS.txt
30
+
31
+ pip - The Python Package Installer
32
+ ==================================
33
+
34
+ .. image:: https://img.shields.io/pypi/v/pip.svg
35
+ :target: https://pypi.org/project/pip/
36
+
37
+ .. image:: https://readthedocs.org/projects/pip/badge/?version=latest
38
+ :target: https://pip.pypa.io/en/latest
39
+
40
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
41
+
42
+ Please take a look at our documentation for how to install and use pip:
43
+
44
+ * `Installation`_
45
+ * `Usage`_
46
+
47
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
48
+
49
+ * `Release notes`_
50
+ * `Release process`_
51
+
52
+ In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right.
53
+
54
+ **Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3.
55
+
56
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
57
+
58
+ * `Issue tracking`_
59
+ * `Discourse channel`_
60
+ * `User IRC`_
61
+
62
+ If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
63
+
64
+ * `GitHub page`_
65
+ * `Development documentation`_
66
+ * `Development IRC`_
67
+
68
+ Code of Conduct
69
+ ---------------
70
+
71
+ Everyone interacting in the pip project's codebases, issue trackers, chat
72
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
73
+
74
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
75
+ .. _Python Package Index: https://pypi.org
76
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
77
+ .. _Usage: https://pip.pypa.io/en/stable/
78
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
79
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
80
+ .. _GitHub page: https://github.com/pypa/pip
81
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
82
+ .. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
83
+ .. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020
84
+ .. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
85
+ .. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
86
+ .. _Issue tracking: https://github.com/pypa/pip/issues
87
+ .. _Discourse channel: https://discuss.python.org/c/packaging
88
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
89
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
90
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
.venv/Lib/site-packages/pip-23.2.1.dist-info/RECORD ADDED
@@ -0,0 +1,1063 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ pip/__init__.py,sha256=hELWH3UN2ilBntczbn1BJOIzJEoiE8w9H-gsR5TeuEk,357
2
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
3
+ pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444
4
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
5
+ pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573
6
+ pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243
7
+ pip/_internal/cache.py,sha256=pMyi1n2nfdo7xzLVhmdOvIy1INt27HbqhJNj7vMcWlI,10429
8
+ pip/_internal/configuration.py,sha256=i_dePJKndPAy7hf48Sl6ZuPyl3tFPCE67z0SNatwuwE,13839
9
+ pip/_internal/exceptions.py,sha256=LyTVY2dANx-i_TEk5Yr9YcwUtiy0HOEFCAQq1F_46co,23737
10
+ pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
11
+ pip/_internal/pyproject.py,sha256=ltmrXWaMXjiJHbYyzWplTdBvPYPdKk99GjKuQVypGZU,7161
12
+ pip/_internal/self_outdated_check.py,sha256=pnqBuKKZQ8OxKP0MaUUiDHl3AtyoMJHHG4rMQ7YcYXY,8167
13
+ pip/_internal/wheel_builder.py,sha256=3UlHfxQi7_AAXI7ur8aPpPbmqHhecCsubmkHEl-00KU,11842
14
+ pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
15
+ pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676
16
+ pip/_internal/cli/base_command.py,sha256=ACUUqWkZMU2O1pmUSpfBV3fwb36JzzTHGrbKXyb5f74,8726
17
+ pip/_internal/cli/cmdoptions.py,sha256=0bXhKutppZLBgAL54iK3tTrj-JRVbUB5M_2pHv_wnKk,30030
18
+ pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
19
+ pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816
20
+ pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
21
+ pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817
22
+ pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968
23
+ pip/_internal/cli/req_command.py,sha256=GqS9jkeHktOy6zRzC6uhcRY7SelnAV1LZ6OfS_gNcEk,18440
24
+ pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
25
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
26
+ pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
27
+ pip/_internal/commands/cache.py,sha256=aDR3pKRRX9dHobQ2HzKryf02jgOZnGcnfEmX_288Vcg,7581
28
+ pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782
29
+ pip/_internal/commands/completion.py,sha256=2frgchce-GE5Gh9SjEJV-MTcpxy3G9-Es8mpe66nHts,3986
30
+ pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815
31
+ pip/_internal/commands/debug.py,sha256=AesEID-4gPFDWTwPiPaGZuD4twdT-imaGuMR5ZfSn8s,6591
32
+ pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335
33
+ pip/_internal/commands/freeze.py,sha256=2qjQrH9KWi5Roav0CuR7vc7hWm4uOi_0l6tp3ESKDHM,3172
34
+ pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
35
+ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
36
+ pip/_internal/commands/index.py,sha256=cGQVSA5dAs7caQ9sz4kllYvaI4ZpGiq1WhCgaImXNSA,4793
37
+ pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188
38
+ pip/_internal/commands/install.py,sha256=sdi44xeJlENfU-ziPl1TbUC3no2-ZGDpwBigmX1JuM0,28934
39
+ pip/_internal/commands/list.py,sha256=LNL6016BPvFpAZVzNoo_DWDzvRFpfw__m9Rp5kw-yUM,12457
40
+ pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
41
+ pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419
42
+ pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886
43
+ pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476
44
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
45
+ pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221
46
+ pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729
47
+ pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494
48
+ pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164
49
+ pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
50
+ pip/_internal/index/collector.py,sha256=3OmYZ3tCoRPGOrELSgQWG-03M-bQHa2-VCA3R_nJAaU,16504
51
+ pip/_internal/index/package_finder.py,sha256=rrUw4vj7QE_eMt022jw--wQiKznMaUgVBkJ1UCrVUxo,37873
52
+ pip/_internal/index/sources.py,sha256=7jw9XSeeQA5K-H4I5a5034Ks2gkQqm4zPXjrhwnP1S4,6556
53
+ pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365
54
+ pip/_internal/locations/_distutils.py,sha256=cmi6h63xYNXhQe7KEWEMaANjHFy5yQOPt_1_RCWyXMY,6100
55
+ pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680
56
+ pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
57
+ pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280
58
+ pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595
59
+ pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277
60
+ pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773
61
+ pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107
62
+ pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882
63
+ pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181
64
+ pip/_internal/metadata/importlib/_envs.py,sha256=I1DHMyAgZb8jT8CYndWl2aw2dN675p-BKPCuJhvdhrY,7435
65
+ pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
66
+ pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990
67
+ pip/_internal/models/direct_url.py,sha256=EepBxI97j7wSZ3AmRETYyVTmR9NoTas15vc8popxVTg,6931
68
+ pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520
69
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
70
+ pip/_internal/models/installation_report.py,sha256=ueXv1RiMLAucaTuEvXACXX5R64_Wcm8b1Ztqx4Rd5xI,2609
71
+ pip/_internal/models/link.py,sha256=6OEk3bt41WU7QZoiyuoVPGsKOU-J_BbDDhouKbIXm0Y,20819
72
+ pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738
73
+ pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643
74
+ pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
75
+ pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858
76
+ pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600
77
+ pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
78
+ pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541
79
+ pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145
80
+ pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096
81
+ pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638
82
+ pip/_internal/network/session.py,sha256=uhovd4J7abd0Yr2g426yC4aC6Uw1VKrQfpzalsEBEMw,18607
83
+ pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
84
+ pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791
85
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ pip/_internal/operations/check.py,sha256=LD5BisEdT9vgzS7rLYUuk01z0l4oMj2Q7SsAxVu-pEk,6806
87
+ pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816
88
+ pip/_internal/operations/prepare.py,sha256=nxjIiGRSiUUSRFpwN-Qro7N6BE9jqV4mudJ7CIv9qwY,28868
89
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
+ pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133
91
+ pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
92
+ pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
93
+ pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198
94
+ pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
95
+ pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
96
+ pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064
97
+ pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
98
+ pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282
99
+ pip/_internal/operations/install/wheel.py,sha256=8lsVMt_FAuiGNsf_e7C7_cCSOEO7pHyjgVmRNx-WXrw,27475
100
+ pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738
101
+ pip/_internal/req/constructors.py,sha256=8YE-eNXMSZ1lgsJZg-HnIo8EdaGfiOM2t3EaLlLD5Og,16610
102
+ pip/_internal/req/req_file.py,sha256=5PCO4GnDEnUENiFj4vD_1QmAMjHNtvN6HXbETZ9UGok,17872
103
+ pip/_internal/req/req_install.py,sha256=hpG29Bm2PAq7G-ogTatZcNUgjwt0zpdTXtxGw4M_MtU,33084
104
+ pip/_internal/req/req_set.py,sha256=pSCcIKURDkGb6JAKsc-cdvnvnAJlYPk-p3vvON9M3DY,4704
105
+ pip/_internal/req/req_uninstall.py,sha256=sGwa_yZ6X2NcRSUJWzUlYkf8bDEjRySAE3aQ5OewIWA,24678
106
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
108
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
+ pip/_internal/resolution/legacy/resolver.py,sha256=th-eTPIvbecfJaUsdrbH1aHQvDV2yCE-RhrrpsJhKbE,24128
110
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
+ pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220
112
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=u5mU96o2lnUy-ODRJv7Wevee0xCYI6IKIXNamSBQnso,18969
113
+ pip/_internal/resolution/resolvelib/factory.py,sha256=y1Q2fsV1GKDKPitoapOLLEs75WNzEpd4l_RezCt927c,27845
114
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705
115
+ pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824
116
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100
117
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=zHnERhfubmvKyM3kgdAOs0dYFiqUfzKR-DAt4y0NWOI,5454
118
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=n2Vn9EC5-7JmcRY5erIPQ4hUWnEUngG0oYS3JW3xXZo,11642
119
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
+ pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351
121
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
122
+ pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
123
+ pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
124
+ pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
125
+ pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
126
+ pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627
127
+ pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
128
+ pip/_internal/utils/egg_link.py,sha256=ZryCchR_yQSCsdsMkCpxQjjLbQxObA5GDtLG0RR5mGc,2118
129
+ pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
130
+ pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
131
+ pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
132
+ pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
133
+ pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113
134
+ pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118
135
+ pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795
136
+ pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632
137
+ pip/_internal/utils/misc.py,sha256=Ds3rSQU7HbdAywwmEBcPnVoLB1Tp_2gL6IbaWcpe8i0,22343
138
+ pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
139
+ pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108
140
+ pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
141
+ pip/_internal/utils/subprocess.py,sha256=0EMhgfPGFk8FZn6Qq7Hp9PN6YHuQNWiVby4DXcTCON4,9200
142
+ pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702
143
+ pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821
144
+ pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759
145
+ pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
146
+ pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549
147
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
148
+ pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519
149
+ pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116
150
+ pip/_internal/vcs/mercurial.py,sha256=1FG5Zh2ltJZKryO40d2l2Q91FYNazuS16kkpoAVOh0Y,5244
151
+ pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729
152
+ pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811
153
+ pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966
154
+ pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
155
+ pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130
156
+ pip/_vendor/vendor.txt,sha256=EyWEHCgXKFKiE8Mku6LONUDLF6UwDwjX1NP2ccKLrLo,475
157
+ pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465
158
+ pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379
159
+ pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033
160
+ pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535
161
+ pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778
162
+ pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416
163
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946
164
+ pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154
165
+ pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105
166
+ pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774
167
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242
168
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271
169
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033
170
+ pip/_vendor/certifi/__init__.py,sha256=q5ePznlfOw-XYIOV6RTnh45yS9haN-Nb1d__4QXc3g0,94
171
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
172
+ pip/_vendor/certifi/cacert.pem,sha256=swFTXcpJHZgU6ij6oyCsehnQ9dlCN5lvoKO1qTZDJRQ,278952
173
+ pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279
174
+ pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797
175
+ pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274
176
+ pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763
177
+ pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032
178
+ pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915
179
+ pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420
180
+ pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732
181
+ pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542
182
+ pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860
183
+ pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683
184
+ pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006
185
+ pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176
186
+ pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934
187
+ pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566
188
+ pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753
189
+ pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913
190
+ pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753
191
+ pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735
192
+ pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759
193
+ pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537
194
+ pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796
195
+ pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498
196
+ pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752
197
+ pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055
198
+ pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562
199
+ pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484
200
+ pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196
201
+ pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363
202
+ pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035
203
+ pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774
204
+ pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372
205
+ pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380
206
+ pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077
207
+ pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715
208
+ pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131
209
+ pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391
210
+ pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402
211
+ pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400
212
+ pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137
213
+ pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007
214
+ pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848
215
+ pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505
216
+ pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812
217
+ pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244
218
+ pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
219
+ pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242
220
+ pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
+ pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560
222
+ pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266
223
+ pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522
224
+ pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128
225
+ pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325
226
+ pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181
227
+ pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134
228
+ pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75
229
+ pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839
230
+ pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678
231
+ pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741
232
+ pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866
233
+ pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079
234
+ pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709
235
+ pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581
236
+ pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259
237
+ pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697
238
+ pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834
239
+ pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991
240
+ pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811
241
+ pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058
242
+ pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801
243
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
244
+ pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102
245
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
246
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
247
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
248
+ pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262
249
+ pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513
250
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
251
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
252
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
253
+ pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898
254
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
255
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
256
+ pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330
257
+ pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
258
+ pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
259
+ pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
260
+ pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950
261
+ pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375
262
+ pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
263
+ pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21
264
+ pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539
265
+ pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132
266
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
267
+ pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079
268
+ pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544
269
+ pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661
270
+ pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
271
+ pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
272
+ pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378
273
+ pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
274
+ pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487
275
+ pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676
276
+ pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110
277
+ pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
278
+ pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
279
+ pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
280
+ pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364
281
+ pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155
282
+ pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476
283
+ pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211
284
+ pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132
285
+ pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678
286
+ pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809
287
+ pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160
288
+ pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573
289
+ pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983
290
+ pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353
291
+ pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685
292
+ pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697
293
+ pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938
294
+ pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178
295
+ pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618
296
+ pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986
297
+ pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591
298
+ pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072
299
+ pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092
300
+ pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882
301
+ pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257
302
+ pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184
303
+ pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223
304
+ pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230
305
+ pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386
306
+ pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424
307
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
308
+ pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314
309
+ pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094
310
+ pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610
311
+ pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938
312
+ pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981
313
+ pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351
314
+ pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073
315
+ pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212
316
+ pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014
317
+ pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335
318
+ pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674
319
+ pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753
320
+ pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130
321
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281
322
+ pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424
323
+ pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700
324
+ pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116
325
+ pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567
326
+ pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387
327
+ pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445
328
+ pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523
329
+ pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646
330
+ pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692
331
+ pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488
332
+ pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646
333
+ pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670
334
+ pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215
335
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
336
+ pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
337
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
338
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
339
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
340
+ pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169
341
+ pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435
342
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
343
+ pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697
344
+ pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449
345
+ pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187
346
+ pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
347
+ pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
348
+ pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
349
+ pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823
350
+ pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879
351
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
352
+ pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288
353
+ pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
354
+ pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373
355
+ pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235
356
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
357
+ pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460
358
+ pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
359
+ pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
360
+ pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
361
+ pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
362
+ pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
363
+ pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
364
+ pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
365
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
366
+ pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478
367
+ pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096
368
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
369
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
370
+ pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100
371
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
372
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
373
+ pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
374
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
375
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
376
+ pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
377
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
378
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
379
+ pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472
380
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
381
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
382
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
383
+ pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
384
+ pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926
385
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
386
+ pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840
387
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
388
+ pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368
389
+ pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
390
+ pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264
391
+ pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842
392
+ pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509
393
+ pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224
394
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
395
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
396
+ pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218
397
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
398
+ pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497
399
+ pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
400
+ pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
401
+ pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
402
+ pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
403
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
404
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
405
+ pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
406
+ pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584
407
+ pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032
408
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
409
+ pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007
410
+ pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273
411
+ pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667
412
+ pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
413
+ pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198
414
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
415
+ pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
416
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
417
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
418
+ pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574
419
+ pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852
420
+ pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706
421
+ pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165
422
+ pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303
423
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
424
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
425
+ pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431
426
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
427
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
428
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
429
+ pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247
430
+ pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
431
+ pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425
432
+ pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
433
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
434
+ pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173
435
+ pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684
436
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
437
+ pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525
438
+ pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
439
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
440
+ pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604
441
+ pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
442
+ pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493
443
+ pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551
444
+ pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179
445
+ pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682
446
+ pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562
447
+ pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372
448
+ pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383
449
+ pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746
450
+ pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086
451
+ pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142
452
+ pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024
453
+ pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
454
+ pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
455
+ pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
456
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
457
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
458
+ pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
459
+ pip/_vendor/urllib3/_version.py,sha256=6zoYnDykPLfe92fHqXalH8SxhWVl31yYLCP0lDri_SA,64
460
+ pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300
461
+ pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990
462
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
463
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
464
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
465
+ pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752
466
+ pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985
467
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
468
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
469
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
470
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
471
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
472
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
473
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
474
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
475
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
476
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
477
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
478
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
479
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
480
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
481
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
482
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
483
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
484
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
485
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
486
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
487
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
488
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
489
+ pip/_vendor/urllib3/util/retry.py,sha256=4laWh0HpwGijLiBmdBIYtbhYekQnNzzhx2W9uys0RHA,22003
490
+ pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177
491
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
492
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
493
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
494
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
495
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
496
+ pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
497
+ pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979
498
+ pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305
499
+ pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563
500
+ pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307
501
+ pip-23.2.1.dist-info/AUTHORS.txt,sha256=Pd_qYtjluu4WDft2A179dPtIvwYVBNtDfccCitVRMQM,10082
502
+ pip-23.2.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
503
+ pip-23.2.1.dist-info/METADATA,sha256=yHPLQvsD1b6f-zdCQWMibZXbsAjs886JMSh3C0oxRhQ,4239
504
+ pip-23.2.1.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
505
+ pip-23.2.1.dist-info/entry_points.txt,sha256=xg35gOct0aY8S3ftLtweJ0uw3KBAIVyW4k-0Jx1rkNE,125
506
+ pip-23.2.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
507
+ pip-23.2.1.dist-info/RECORD,,
508
+ pip\_internal\operations\build\metadata_editable.cpython-311.pyc,,
509
+ pip\_vendor\urllib3\contrib\_securetransport\__init__.cpython-311.pyc,,
510
+ pip\_internal\commands\help.cpython-311.pyc,,
511
+ pip\_internal\commands\uninstall.cpython-311.pyc,,
512
+ pip\_vendor\chardet\sbcsgroupprober.cpython-311.pyc,,
513
+ pip\_vendor\rich\traceback.cpython-311.pyc,,
514
+ pip\_vendor\distlib\wheel.cpython-311.pyc,,
515
+ pip\_vendor\pygments\styles\__init__.cpython-311.pyc,,
516
+ pip\_vendor\chardet\gb2312prober.cpython-311.pyc,,
517
+ pip\_vendor\urllib3\fields.cpython-311.pyc,,
518
+ pip\_internal\models\link.cpython-311.pyc,,
519
+ pip\_vendor\cachecontrol\_cmd.cpython-311.pyc,,
520
+ pip\_vendor\requests\__pycache__,,
521
+ pip\_vendor\colorama\__init__.cpython-311.pyc,,
522
+ pip\_vendor\rich\pager.cpython-311.pyc,,
523
+ pip\_vendor\distlib\index.cpython-311.pyc,,
524
+ pip\_internal\utils\appdirs.cpython-311.pyc,,
525
+ pip\_vendor\tenacity\before_sleep.cpython-311.pyc,,
526
+ pip\_vendor\distro\__main__.cpython-311.pyc,,
527
+ pip\_vendor\platformdirs\api.cpython-311.pyc,,
528
+ pip\_vendor\pygments\token.cpython-311.pyc,,
529
+ pip\_vendor\rich\_loop.cpython-311.pyc,,
530
+ pip\_vendor\colorama\ansitowin32.cpython-311.pyc,,
531
+ pip\_internal\operations\__pycache__,,
532
+ pip\_vendor\distlib\util.cpython-311.pyc,,
533
+ pip\_internal\models\__pycache__,,
534
+ pip\_vendor\urllib3\packages\__pycache__,,
535
+ pip\_vendor\pygments\lexers\_mapping.cpython-311.pyc,,
536
+ pip\_vendor\pyproject_hooks\__pycache__,,
537
+ pip\_vendor\requests\help.cpython-311.pyc,,
538
+ pip\_vendor\distlib\database.cpython-311.pyc,,
539
+ pip\_vendor\platformdirs\unix.cpython-311.pyc,,
540
+ pip\_internal\operations\install\editable_legacy.cpython-311.pyc,,
541
+ pip\_vendor\certifi\core.cpython-311.pyc,,
542
+ pip\_vendor\urllib3\util\wait.cpython-311.pyc,,
543
+ pip\_vendor\urllib3\__init__.cpython-311.pyc,,
544
+ pip\_vendor\msgpack\__init__.cpython-311.pyc,,
545
+ pip\_vendor\urllib3\util\ssl_.cpython-311.pyc,,
546
+ pip\_vendor\chardet\cli\__init__.cpython-311.pyc,,
547
+ pip\_internal\models\direct_url.cpython-311.pyc,,
548
+ pip\_vendor\chardet\johabprober.cpython-311.pyc,,
549
+ pip-23.2.1.virtualenv,,
550
+ pip\_internal\network\download.cpython-311.pyc,,
551
+ pip\_internal\metadata\_json.cpython-311.pyc,,
552
+ pip\_internal\utils\packaging.cpython-311.pyc,,
553
+ pip\_vendor\chardet\langbulgarianmodel.cpython-311.pyc,,
554
+ pip\_vendor\resolvelib\reporters.cpython-311.pyc,,
555
+ pip\_vendor\rich\segment.cpython-311.pyc,,
556
+ pip\_internal\distributions\base.cpython-311.pyc,,
557
+ pip\_internal\network\session.cpython-311.pyc,,
558
+ pip\_internal\vcs\versioncontrol.cpython-311.pyc,,
559
+ pip\_vendor\resolvelib\compat\__init__.cpython-311.pyc,,
560
+ pip\_vendor\rich\repr.cpython-311.pyc,,
561
+ pip\_vendor\chardet\metadata\languages.cpython-311.pyc,,
562
+ pip\_vendor\webencodings\tests.cpython-311.pyc,,
563
+ pip\_vendor\urllib3\connectionpool.cpython-311.pyc,,
564
+ pip\_vendor\msgpack\__pycache__,,
565
+ pip\_vendor\certifi\__pycache__,,
566
+ pip\_internal\operations\check.cpython-311.pyc,,
567
+ pip\_vendor\rich\styled.cpython-311.pyc,,
568
+ pip\_vendor\urllib3\response.cpython-311.pyc,,
569
+ pip\_vendor\pyparsing\diagram\__init__.cpython-311.pyc,,
570
+ pip\_vendor\tomli\_parser.cpython-311.pyc,,
571
+ pip\_internal\utils\logging.cpython-311.pyc,,
572
+ pip\_internal\self_outdated_check.cpython-311.pyc,,
573
+ pip\_internal\cli\command_context.cpython-311.pyc,,
574
+ pip\_vendor\pygments\formatters\bbcode.cpython-311.pyc,,
575
+ pip\_vendor\resolvelib\compat\__pycache__,,
576
+ pip\_vendor\urllib3\util\queue.cpython-311.pyc,,
577
+ pip\_vendor\urllib3\contrib\appengine.cpython-311.pyc,,
578
+ pip\_vendor\urllib3\contrib\pyopenssl.cpython-311.pyc,,
579
+ pip\_vendor\chardet\codingstatemachinedict.cpython-311.pyc,,
580
+ pip\_vendor\rich\box.cpython-311.pyc,,
581
+ pip\_vendor\rich\_wrap.cpython-311.pyc,,
582
+ pip\_vendor\urllib3\poolmanager.cpython-311.pyc,,
583
+ pip\_vendor\tenacity\wait.cpython-311.pyc,,
584
+ pip\_vendor\colorama\initialise.cpython-311.pyc,,
585
+ pip\_vendor\pygments\cmdline.cpython-311.pyc,,
586
+ pip\_vendor\rich\json.cpython-311.pyc,,
587
+ pip\_vendor\distlib\scripts.cpython-311.pyc,,
588
+ pip\_vendor\chardet\jpcntx.cpython-311.pyc,,
589
+ pip\_internal\utils\unpacking.cpython-311.pyc,,
590
+ pip\_vendor\chardet\euctwprober.cpython-311.pyc,,
591
+ pip\_vendor\rich\progress.cpython-311.pyc,,
592
+ pip\_internal\commands\hash.cpython-311.pyc,,
593
+ pip\_internal\utils\__pycache__,,
594
+ pip\_internal\index\__pycache__,,
595
+ pip\_vendor\pygments\style.cpython-311.pyc,,
596
+ pip\_internal\metadata\__init__.cpython-311.pyc,,
597
+ pip\_internal\operations\build\__init__.cpython-311.pyc,,
598
+ pip\_internal\metadata\importlib\_envs.cpython-311.pyc,,
599
+ pip\_vendor\pyparsing\__pycache__,,
600
+ pip\_internal\cli\parser.cpython-311.pyc,,
601
+ pip\_vendor\cachecontrol\cache.cpython-311.pyc,,
602
+ pip\_vendor\pyproject_hooks\_in_process\_in_process.cpython-311.pyc,,
603
+ pip\_vendor\pygments\lexers\__init__.cpython-311.pyc,,
604
+ pip\_vendor\chardet\johabfreq.cpython-311.pyc,,
605
+ pip\_vendor\requests\sessions.cpython-311.pyc,,
606
+ pip\_vendor\pygments\sphinxext.cpython-311.pyc,,
607
+ pip\_vendor\idna\package_data.cpython-311.pyc,,
608
+ pip\_internal\resolution\resolvelib\__init__.cpython-311.pyc,,
609
+ pip\_vendor\chardet\macromanprober.cpython-311.pyc,,
610
+ pip\_internal\req\req_install.cpython-311.pyc,,
611
+ pip\_internal\cache.cpython-311.pyc,,
612
+ pip\_internal\utils\virtualenv.cpython-311.pyc,,
613
+ pip\_vendor\chardet\cli\chardetect.cpython-311.pyc,,
614
+ pip\_vendor\rich\__main__.cpython-311.pyc,,
615
+ pip\_internal\resolution\resolvelib\requirements.cpython-311.pyc,,
616
+ pip\_vendor\packaging\markers.cpython-311.pyc,,
617
+ pip\_internal\req\req_file.cpython-311.pyc,,
618
+ pip\_internal\metadata\__pycache__,,
619
+ pip\_vendor\pygments\formatters\svg.cpython-311.pyc,,
620
+ pip\_vendor\rich\markup.cpython-311.pyc,,
621
+ pip\_vendor\platformdirs\macos.cpython-311.pyc,,
622
+ ..\..\Scripts\pip.exe,,
623
+ pip\_vendor\pygments\lexers\__pycache__,,
624
+ pip\_vendor\rich\scope.cpython-311.pyc,,
625
+ pip\_vendor\webencodings\__init__.cpython-311.pyc,,
626
+ pip\_internal\commands\completion.cpython-311.pyc,,
627
+ pip\_internal\commands\__init__.cpython-311.pyc,,
628
+ pip\_vendor\chardet\mbcsgroupprober.cpython-311.pyc,,
629
+ pip\_vendor\pygments\formatters\groff.cpython-311.pyc,,
630
+ pip\_vendor\rich\cells.cpython-311.pyc,,
631
+ pip\_vendor\pkg_resources\__init__.cpython-311.pyc,,
632
+ pip\_vendor\pyproject_hooks\_compat.cpython-311.pyc,,
633
+ pip\_vendor\urllib3\packages\backports\weakref_finalize.cpython-311.pyc,,
634
+ pip\_vendor\packaging\utils.cpython-311.pyc,,
635
+ pip\_vendor\pyproject_hooks\_in_process\__pycache__,,
636
+ pip\_internal\vcs\subversion.cpython-311.pyc,,
637
+ pip\_vendor\chardet\version.cpython-311.pyc,,
638
+ pip\_vendor\requests\certs.cpython-311.pyc,,
639
+ pip\_vendor\rich\default_styles.cpython-311.pyc,,
640
+ pip\_vendor\chardet\cp949prober.cpython-311.pyc,,
641
+ pip\_vendor\tenacity\nap.cpython-311.pyc,,
642
+ pip\_vendor\certifi\__main__.cpython-311.pyc,,
643
+ pip\_internal\operations\build\wheel.cpython-311.pyc,,
644
+ pip\_vendor\urllib3\util\__pycache__,,
645
+ pip\_internal\locations\_sysconfig.cpython-311.pyc,,
646
+ pip\_internal\operations\install\__init__.cpython-311.pyc,,
647
+ pip\_vendor\distlib\markers.cpython-311.pyc,,
648
+ pip\_internal\models\format_control.cpython-311.pyc,,
649
+ pip\_internal\operations\freeze.cpython-311.pyc,,
650
+ pip\_internal\commands\search.cpython-311.pyc,,
651
+ pip\_vendor\webencodings\__pycache__,,
652
+ pip\_vendor\rich\_palettes.cpython-311.pyc,,
653
+ pip\_vendor\chardet\big5freq.cpython-311.pyc,,
654
+ pip\__main__.cpython-311.pyc,,
655
+ pip\_vendor\urllib3\request.cpython-311.pyc,,
656
+ pip\_vendor\rich\_emoji_replace.cpython-311.pyc,,
657
+ pip\_vendor\rich\_windows.cpython-311.pyc,,
658
+ pip\_vendor\rich\file_proxy.cpython-311.pyc,,
659
+ pip\_vendor\urllib3\packages\six.cpython-311.pyc,,
660
+ pip\_internal\models\__init__.cpython-311.pyc,,
661
+ pip\_internal\utils\filetypes.cpython-311.pyc,,
662
+ pip\_internal\vcs\bazaar.cpython-311.pyc,,
663
+ pip\_internal\vcs\__pycache__,,
664
+ pip\_vendor\resolvelib\__pycache__,,
665
+ pip\_vendor\chardet\metadata\__pycache__,,
666
+ pip\_vendor\distlib\locators.cpython-311.pyc,,
667
+ pip\_vendor\pyproject_hooks\__init__.cpython-311.pyc,,
668
+ pip\_vendor\rich\logging.cpython-311.pyc,,
669
+ pip\_vendor\tenacity\tornadoweb.cpython-311.pyc,,
670
+ pip\_internal\req\req_uninstall.cpython-311.pyc,,
671
+ pip\_internal\utils\setuptools_build.cpython-311.pyc,,
672
+ pip\_vendor\chardet\utf8prober.cpython-311.pyc,,
673
+ pip\_vendor\urllib3\packages\backports\__init__.cpython-311.pyc,,
674
+ pip\_vendor\rich\constrain.cpython-311.pyc,,
675
+ pip\_vendor\rich\table.cpython-311.pyc,,
676
+ pip\_vendor\rich\__init__.cpython-311.pyc,,
677
+ pip\_vendor\rich\highlighter.cpython-311.pyc,,
678
+ pip\_vendor\chardet\enums.cpython-311.pyc,,
679
+ pip\_vendor\packaging\_musllinux.cpython-311.pyc,,
680
+ pip\_vendor\pyparsing\common.cpython-311.pyc,,
681
+ pip\_vendor\distlib\__pycache__,,
682
+ pip\_vendor\chardet\langrussianmodel.cpython-311.pyc,,
683
+ pip\_vendor\packaging\_manylinux.cpython-311.pyc,,
684
+ pip\_internal\operations\install\__pycache__,,
685
+ pip\_vendor\requests\adapters.cpython-311.pyc,,
686
+ pip\_vendor\__init__.cpython-311.pyc,,
687
+ pip\_vendor\rich\_export_format.cpython-311.pyc,,
688
+ pip\_vendor\urllib3\util\timeout.cpython-311.pyc,,
689
+ pip\_vendor\pygments\lexer.cpython-311.pyc,,
690
+ pip\_vendor\chardet\utf1632prober.cpython-311.pyc,,
691
+ pip\_vendor\urllib3\util\ssl_match_hostname.cpython-311.pyc,,
692
+ pip\_internal\utils\urls.cpython-311.pyc,,
693
+ pip\_vendor\rich\_ratio.cpython-311.pyc,,
694
+ pip\_internal\resolution\legacy\__pycache__,,
695
+ pip\_vendor\chardet\__init__.cpython-311.pyc,,
696
+ pip\_internal\operations\build\wheel_legacy.cpython-311.pyc,,
697
+ pip\_vendor\requests\api.cpython-311.pyc,,
698
+ pip\_vendor\rich\jupyter.cpython-311.pyc,,
699
+ pip\_vendor\urllib3\packages\backports\__pycache__,,
700
+ pip\_vendor\rich\__pycache__,,
701
+ pip\_vendor\tenacity\after.cpython-311.pyc,,
702
+ pip\_vendor\tenacity\__pycache__,,
703
+ pip\_internal\resolution\__init__.cpython-311.pyc,,
704
+ pip\_internal\commands\check.cpython-311.pyc,,
705
+ pip\_internal\req\constructors.cpython-311.pyc,,
706
+ pip\_vendor\certifi\__init__.cpython-311.pyc,,
707
+ pip\_internal\resolution\legacy\resolver.cpython-311.pyc,,
708
+ pip\_vendor\chardet\charsetprober.cpython-311.pyc,,
709
+ pip\_internal\index\collector.cpython-311.pyc,,
710
+ pip\_vendor\pygments\formatter.cpython-311.pyc,,
711
+ pip\_vendor\__pycache__,,
712
+ pip\_internal\exceptions.cpython-311.pyc,,
713
+ pip\_internal\network\lazy_wheel.cpython-311.pyc,,
714
+ pip\_vendor\pyparsing\exceptions.cpython-311.pyc,,
715
+ pip\_vendor\requests\hooks.cpython-311.pyc,,
716
+ pip\_vendor\rich\text.cpython-311.pyc,,
717
+ pip\_internal\build_env.cpython-311.pyc,,
718
+ pip\_vendor\pygments\filter.cpython-311.pyc,,
719
+ pip\_vendor\rich\color_triplet.cpython-311.pyc,,
720
+ pip\_vendor\urllib3\contrib\_appengine_environ.cpython-311.pyc,,
721
+ pip\__init__.cpython-311.pyc,,
722
+ pip\_vendor\urllib3\connection.cpython-311.pyc,,
723
+ pip\_internal\models\wheel.cpython-311.pyc,,
724
+ pip\_vendor\chardet\__pycache__,,
725
+ pip\_internal\pyproject.cpython-311.pyc,,
726
+ pip\_vendor\rich\_spinners.cpython-311.pyc,,
727
+ pip\_vendor\pygments\unistring.cpython-311.pyc,,
728
+ ..\..\Scripts\pip-3.11.exe,,
729
+ pip\_internal\models\selection_prefs.cpython-311.pyc,,
730
+ pip\_internal\utils\hashes.cpython-311.pyc,,
731
+ pip\_internal\resolution\__pycache__,,
732
+ pip\_internal\commands\install.cpython-311.pyc,,
733
+ pip\_vendor\colorama\tests\ansi_test.cpython-311.pyc,,
734
+ pip\_internal\commands\configuration.cpython-311.pyc,,
735
+ pip\_internal\locations\base.cpython-311.pyc,,
736
+ pip\_vendor\pyproject_hooks\_impl.cpython-311.pyc,,
737
+ pip\_vendor\requests\compat.cpython-311.pyc,,
738
+ pip\_internal\metadata\importlib\__pycache__,,
739
+ pip\_vendor\rich\console.cpython-311.pyc,,
740
+ pip\_vendor\idna\core.cpython-311.pyc,,
741
+ pip\_vendor\pygments\plugin.cpython-311.pyc,,
742
+ pip\_vendor\cachecontrol\__init__.cpython-311.pyc,,
743
+ pip\_vendor\tenacity\before.cpython-311.pyc,,
744
+ pip\_internal\operations\build\build_tracker.cpython-311.pyc,,
745
+ pip\_vendor\chardet\escsm.cpython-311.pyc,,
746
+ pip\_vendor\webencodings\labels.cpython-311.pyc,,
747
+ pip\_internal\utils\__init__.cpython-311.pyc,,
748
+ pip\_internal\commands\download.cpython-311.pyc,,
749
+ pip\_vendor\rich\live.cpython-311.pyc,,
750
+ pip\_internal\index\__init__.cpython-311.pyc,,
751
+ pip\_vendor\pygments\formatters\terminal.cpython-311.pyc,,
752
+ pip\_vendor\chardet\mbcharsetprober.cpython-311.pyc,,
753
+ pip\_vendor\packaging\version.cpython-311.pyc,,
754
+ pip\_internal\operations\prepare.cpython-311.pyc,,
755
+ pip\_internal\req\req_set.cpython-311.pyc,,
756
+ pip\__pycache__,,
757
+ pip\_vendor\platformdirs\windows.cpython-311.pyc,,
758
+ pip\_vendor\pyparsing\core.cpython-311.pyc,,
759
+ pip\_vendor\rich\themes.cpython-311.pyc,,
760
+ pip\_vendor\pygments\formatters\pangomarkup.cpython-311.pyc,,
761
+ pip\_vendor\pyparsing\__init__.cpython-311.pyc,,
762
+ pip\_internal\commands\debug.cpython-311.pyc,,
763
+ pip\_vendor\tenacity\_asyncio.cpython-311.pyc,,
764
+ pip\_vendor\urllib3\contrib\securetransport.cpython-311.pyc,,
765
+ pip\_vendor\pyparsing\helpers.cpython-311.pyc,,
766
+ pip\_vendor\rich\_pick.cpython-311.pyc,,
767
+ pip\_vendor\idna\intranges.cpython-311.pyc,,
768
+ pip\_internal\utils\encoding.cpython-311.pyc,,
769
+ pip\_vendor\colorama\tests\utils.cpython-311.pyc,,
770
+ pip\_vendor\chardet\chardistribution.cpython-311.pyc,,
771
+ pip\_vendor\distlib\resources.cpython-311.pyc,,
772
+ pip\_vendor\colorama\tests\__pycache__,,
773
+ pip\_vendor\urllib3\_version.cpython-311.pyc,,
774
+ pip\_vendor\pygments\formatters\latex.cpython-311.pyc,,
775
+ pip\_vendor\cachecontrol\__pycache__,,
776
+ pip\_vendor\urllib3\util\request.cpython-311.pyc,,
777
+ pip\_internal\resolution\resolvelib\factory.cpython-311.pyc,,
778
+ pip\_vendor\rich\_null_file.cpython-311.pyc,,
779
+ pip\_vendor\resolvelib\resolvers.cpython-311.pyc,,
780
+ pip\_vendor\rich\_win32_console.cpython-311.pyc,,
781
+ pip\_vendor\cachecontrol\adapter.cpython-311.pyc,,
782
+ pip\_vendor\pygments\lexers\python.cpython-311.pyc,,
783
+ pip\_vendor\idna\__pycache__,,
784
+ pip\_vendor\cachecontrol\serialize.cpython-311.pyc,,
785
+ pip\_internal\utils\subprocess.cpython-311.pyc,,
786
+ pip\_internal\cli\status_codes.cpython-311.pyc,,
787
+ pip\_vendor\urllib3\contrib\_securetransport\bindings.cpython-311.pyc,,
788
+ pip\_vendor\rich\terminal_theme.cpython-311.pyc,,
789
+ pip\_vendor\pygments\scanner.cpython-311.pyc,,
790
+ pip\_vendor\rich\status.cpython-311.pyc,,
791
+ pip\_internal\__pycache__,,
792
+ pip\_internal\utils\compatibility_tags.cpython-311.pyc,,
793
+ pip\_vendor\pygments\util.cpython-311.pyc,,
794
+ pip\_vendor\distlib\version.cpython-311.pyc,,
795
+ pip\_vendor\rich\_emoji_codes.cpython-311.pyc,,
796
+ pip\_internal\cli\base_command.cpython-311.pyc,,
797
+ pip\_vendor\rich\theme.cpython-311.pyc,,
798
+ pip\_vendor\tomli\_types.cpython-311.pyc,,
799
+ pip\_vendor\chardet\euctwfreq.cpython-311.pyc,,
800
+ pip\_vendor\colorama\win32.cpython-311.pyc,,
801
+ pip\_internal\resolution\resolvelib\found_candidates.cpython-311.pyc,,
802
+ pip\_vendor\idna\idnadata.cpython-311.pyc,,
803
+ pip\_vendor\chardet\langgreekmodel.cpython-311.pyc,,
804
+ pip\_vendor\rich\emoji.cpython-311.pyc,,
805
+ pip\_vendor\rich\_inspect.cpython-311.pyc,,
806
+ pip\_internal\commands\list.cpython-311.pyc,,
807
+ pip\_internal\models\scheme.cpython-311.pyc,,
808
+ pip\_vendor\pyproject_hooks\_in_process\__init__.cpython-311.pyc,,
809
+ pip\_vendor\packaging\__init__.cpython-311.pyc,,
810
+ pip\_vendor\platformdirs\__main__.cpython-311.pyc,,
811
+ pip\_internal\utils\wheel.cpython-311.pyc,,
812
+ pip\_vendor\chardet\jisfreq.cpython-311.pyc,,
813
+ pip\_vendor\cachecontrol\wrapper.cpython-311.pyc,,
814
+ pip\_vendor\platformdirs\version.cpython-311.pyc,,
815
+ pip\_internal\resolution\resolvelib\reporter.cpython-311.pyc,,
816
+ pip\_vendor\cachecontrol\heuristics.cpython-311.pyc,,
817
+ pip\_vendor\resolvelib\structs.cpython-311.pyc,,
818
+ pip\_vendor\urllib3\util\__init__.cpython-311.pyc,,
819
+ pip\_vendor\distro\distro.cpython-311.pyc,,
820
+ pip\_internal\commands\freeze.cpython-311.pyc,,
821
+ pip\_internal\network\auth.cpython-311.pyc,,
822
+ pip\_vendor\rich\measure.cpython-311.pyc,,
823
+ pip\_vendor\tenacity\stop.cpython-311.pyc,,
824
+ pip\_vendor\distlib\metadata.cpython-311.pyc,,
825
+ pip\_vendor\urllib3\util\url.cpython-311.pyc,,
826
+ pip\_vendor\rich\_cell_widths.cpython-311.pyc,,
827
+ pip\_vendor\rich\align.cpython-311.pyc,,
828
+ pip\_vendor\colorama\ansi.cpython-311.pyc,,
829
+ pip\_vendor\rich\control.cpython-311.pyc,,
830
+ pip\_vendor\rich\rule.cpython-311.pyc,,
831
+ pip\_vendor\rich\pretty.cpython-311.pyc,,
832
+ pip\_internal\distributions\__pycache__,,
833
+ pip\_vendor\rich\padding.cpython-311.pyc,,
834
+ pip\_vendor\resolvelib\__init__.cpython-311.pyc,,
835
+ pip\_internal\vcs\__init__.cpython-311.pyc,,
836
+ pip\_internal\utils\direct_url_helpers.cpython-311.pyc,,
837
+ pip\_internal\utils\compat.cpython-311.pyc,,
838
+ pip\_vendor\chardet\metadata\__init__.cpython-311.pyc,,
839
+ pip\_vendor\idna\uts46data.cpython-311.pyc,,
840
+ pip\_vendor\chardet\sjisprober.cpython-311.pyc,,
841
+ pip\_vendor\tomli\_re.cpython-311.pyc,,
842
+ pip\_internal\network\xmlrpc.cpython-311.pyc,,
843
+ pip\_vendor\packaging\__pycache__,,
844
+ pip\_vendor\colorama\tests\winterm_test.cpython-311.pyc,,
845
+ pip\_internal\main.cpython-311.pyc,,
846
+ pip\_vendor\rich\_extension.cpython-311.pyc,,
847
+ pip\_internal\locations\_distutils.cpython-311.pyc,,
848
+ pip\_vendor\distlib\__init__.cpython-311.pyc,,
849
+ pip\_vendor\chardet\mbcssm.cpython-311.pyc,,
850
+ pip\_vendor\rich\palette.cpython-311.pyc,,
851
+ pip\_vendor\colorama\tests\isatty_test.cpython-311.pyc,,
852
+ pip\_vendor\chardet\hebrewprober.cpython-311.pyc,,
853
+ pip\_internal\network\utils.cpython-311.pyc,,
854
+ pip\_vendor\urllib3\util\response.cpython-311.pyc,,
855
+ ..\..\Scripts\pip3.11.exe,,
856
+ pip\_vendor\rich\errors.cpython-311.pyc,,
857
+ pip\_vendor\msgpack\fallback.cpython-311.pyc,,
858
+ pip\_internal\utils\_jaraco_text.cpython-311.pyc,,
859
+ pip\_vendor\rich\bar.cpython-311.pyc,,
860
+ pip\_vendor\webencodings\mklabels.cpython-311.pyc,,
861
+ pip\_internal\commands\inspect.cpython-311.pyc,,
862
+ pip\_internal\resolution\legacy\__init__.cpython-311.pyc,,
863
+ pip-23.2.1.dist-info\__pycache__,,
864
+ pip\_internal\configuration.cpython-311.pyc,,
865
+ pip\_internal\cli\main_parser.cpython-311.pyc,,
866
+ pip\_vendor\rich\syntax.cpython-311.pyc,,
867
+ pip\_internal\vcs\git.cpython-311.pyc,,
868
+ pip\_vendor\platformdirs\__init__.cpython-311.pyc,,
869
+ pip\_vendor\pygments\modeline.cpython-311.pyc,,
870
+ pip\_vendor\resolvelib\providers.cpython-311.pyc,,
871
+ pip\_vendor\pyparsing\actions.cpython-311.pyc,,
872
+ pip\_vendor\tenacity\__init__.cpython-311.pyc,,
873
+ pip\_internal\network\cache.cpython-311.pyc,,
874
+ pip\_vendor\chardet\universaldetector.cpython-311.pyc,,
875
+ pip\_internal\metadata\importlib\_compat.cpython-311.pyc,,
876
+ pip\_internal\operations\build\wheel_editable.cpython-311.pyc,,
877
+ pip\_vendor\requests\__version__.cpython-311.pyc,,
878
+ pip\_internal\wheel_builder.cpython-311.pyc,,
879
+ pip\_vendor\packaging\__about__.cpython-311.pyc,,
880
+ pip\_vendor\rich\_timer.cpython-311.pyc,,
881
+ pip\_vendor\resolvelib\compat\collections_abc.cpython-311.pyc,,
882
+ pip\_vendor\pygments\__main__.cpython-311.pyc,,
883
+ pip\_internal\metadata\pkg_resources.cpython-311.pyc,,
884
+ pip\_vendor\six.cpython-311.pyc,,
885
+ pip\_internal\req\__init__.cpython-311.pyc,,
886
+ pip\_internal\resolution\resolvelib\provider.cpython-311.pyc,,
887
+ pip\_internal\commands\wheel.cpython-311.pyc,,
888
+ pip\_internal\metadata\importlib\_dists.cpython-311.pyc,,
889
+ pip\_internal\cli\__init__.cpython-311.pyc,,
890
+ pip\_internal\distributions\installed.cpython-311.pyc,,
891
+ pip\_vendor\rich\_windows_renderer.cpython-311.pyc,,
892
+ pip\_internal\commands\index.cpython-311.pyc,,
893
+ pip\_vendor\rich\prompt.cpython-311.pyc,,
894
+ pip\_vendor\chardet\langthaimodel.cpython-311.pyc,,
895
+ ..\..\Scripts\pip3.exe,,
896
+ pip\_vendor\platformdirs\__pycache__,,
897
+ pip\_vendor\urllib3\contrib\__pycache__,,
898
+ pip\_vendor\idna\codec.cpython-311.pyc,,
899
+ pip\_vendor\rich\layout.cpython-311.pyc,,
900
+ pip\_vendor\colorama\tests\ansitowin32_test.cpython-311.pyc,,
901
+ pip\_internal\commands\cache.cpython-311.pyc,,
902
+ pip\_vendor\pygments\formatters\_mapping.cpython-311.pyc,,
903
+ pip\_vendor\tomli\__init__.cpython-311.pyc,,
904
+ pip\_vendor\distlib\manifest.cpython-311.pyc,,
905
+ pip\_internal\metadata\importlib\__init__.cpython-311.pyc,,
906
+ pip-23.2.1.dist-info\INSTALLER,,
907
+ pip\_internal\models\candidate.cpython-311.pyc,,
908
+ pip\_vendor\requests\utils.cpython-311.pyc,,
909
+ pip\_internal\operations\install\wheel.cpython-311.pyc,,
910
+ pip\_vendor\rich\protocol.cpython-311.pyc,,
911
+ pip\_internal\req\__pycache__,,
912
+ pip\_vendor\rich\_fileno.cpython-311.pyc,,
913
+ pip\_internal\models\target_python.cpython-311.pyc,,
914
+ pip\_vendor\requests\cookies.cpython-311.pyc,,
915
+ pip\_internal\cli\__pycache__,,
916
+ pip\_vendor\urllib3\filepost.cpython-311.pyc,,
917
+ pip\_vendor\urllib3\contrib\socks.cpython-311.pyc,,
918
+ pip\_vendor\urllib3\_collections.cpython-311.pyc,,
919
+ pip\_vendor\pygments\formatters\html.cpython-311.pyc,,
920
+ pip\_vendor\packaging\specifiers.cpython-311.pyc,,
921
+ pip\_internal\models\index.cpython-311.pyc,,
922
+ pip\_internal\metadata\base.cpython-311.pyc,,
923
+ pip\_vendor\cachecontrol\caches\__init__.cpython-311.pyc,,
924
+ pip\_vendor\urllib3\contrib\_securetransport\__pycache__,,
925
+ pip\_vendor\requests\structures.cpython-311.pyc,,
926
+ pip\_vendor\distlib\compat.cpython-311.pyc,,
927
+ pip\_vendor\tomli\__pycache__,,
928
+ pip\_vendor\pyparsing\unicode.cpython-311.pyc,,
929
+ pip\_vendor\rich\_stack.cpython-311.pyc,,
930
+ pip\_vendor\tenacity\_utils.cpython-311.pyc,,
931
+ pip\_vendor\pygments\styles\__pycache__,,
932
+ pip\_internal\distributions\sdist.cpython-311.pyc,,
933
+ pip\_vendor\colorama\tests\__init__.cpython-311.pyc,,
934
+ pip\_vendor\rich\style.cpython-311.pyc,,
935
+ pip\_vendor\pygments\__init__.cpython-311.pyc,,
936
+ pip\_vendor\colorama\__pycache__,,
937
+ pip\_vendor\rich\screen.cpython-311.pyc,,
938
+ pip\_internal\cli\cmdoptions.cpython-311.pyc,,
939
+ pip\_vendor\idna\__init__.cpython-311.pyc,,
940
+ pip\_internal\resolution\resolvelib\base.cpython-311.pyc,,
941
+ pip\_vendor\chardet\langturkishmodel.cpython-311.pyc,,
942
+ pip\_internal\__init__.cpython-311.pyc,,
943
+ pip\_vendor\urllib3\util\ssltransport.cpython-311.pyc,,
944
+ pip\_internal\utils\entrypoints.cpython-311.pyc,,
945
+ pip\_internal\utils\_log.cpython-311.pyc,,
946
+ pip\_internal\utils\deprecation.cpython-311.pyc,,
947
+ pip\_vendor\pyparsing\results.cpython-311.pyc,,
948
+ pip\_vendor\cachecontrol\caches\__pycache__,,
949
+ pip\_vendor\urllib3\__pycache__,,
950
+ pip\_vendor\requests\packages.cpython-311.pyc,,
951
+ pip\_vendor\pygments\formatters\img.cpython-311.pyc,,
952
+ pip\_vendor\chardet\cli\__pycache__,,
953
+ pip\_internal\cli\main.cpython-311.pyc,,
954
+ pip\_vendor\pygments\__pycache__,,
955
+ pip\_vendor\requests\status_codes.cpython-311.pyc,,
956
+ pip\_vendor\rich\spinner.cpython-311.pyc,,
957
+ pip\_vendor\rich\abc.cpython-311.pyc,,
958
+ pip\_vendor\distro\__init__.cpython-311.pyc,,
959
+ pip\_vendor\urllib3\util\proxy.cpython-311.pyc,,
960
+ pip\_internal\index\package_finder.cpython-311.pyc,,
961
+ pip\_internal\cli\req_command.cpython-311.pyc,,
962
+ pip\_vendor\rich\_log_render.cpython-311.pyc,,
963
+ pip\_vendor\urllib3\packages\backports\makefile.cpython-311.pyc,,
964
+ pip\_internal\utils\misc.cpython-311.pyc,,
965
+ pip\_vendor\urllib3\contrib\_securetransport\low_level.cpython-311.pyc,,
966
+ pip\_vendor\requests\models.cpython-311.pyc,,
967
+ pip\_vendor\chardet\langhungarianmodel.cpython-311.pyc,,
968
+ pip\_internal\operations\build\metadata.cpython-311.pyc,,
969
+ pip\_internal\index\sources.cpython-311.pyc,,
970
+ pip\_vendor\cachecontrol\caches\redis_cache.cpython-311.pyc,,
971
+ pip\_vendor\chardet\sbcharsetprober.cpython-311.pyc,,
972
+ pip\_internal\distributions\__init__.cpython-311.pyc,,
973
+ pip\_vendor\pygments\formatters\__init__.cpython-311.pyc,,
974
+ pip\_internal\cli\autocompletion.cpython-311.pyc,,
975
+ pip\_vendor\pyparsing\diagram\__pycache__,,
976
+ pip\_vendor\rich\containers.cpython-311.pyc,,
977
+ pip\_internal\vcs\mercurial.cpython-311.pyc,,
978
+ pip\_internal\utils\egg_link.cpython-311.pyc,,
979
+ pip\_vendor\chardet\latin1prober.cpython-311.pyc,,
980
+ pip\_vendor\distro\__pycache__,,
981
+ pip\_vendor\rich\live_render.cpython-311.pyc,,
982
+ pip\_vendor\pygments\console.cpython-311.pyc,,
983
+ pip\_vendor\platformdirs\android.cpython-311.pyc,,
984
+ pip\_internal\cli\spinners.cpython-311.pyc,,
985
+ pip\_vendor\pygments\formatters\irc.cpython-311.pyc,,
986
+ pip\_vendor\packaging\requirements.cpython-311.pyc,,
987
+ pip\_vendor\urllib3\util\retry.cpython-311.pyc,,
988
+ pip\_vendor\rich\ansi.cpython-311.pyc,,
989
+ pip\_internal\locations\__init__.cpython-311.pyc,,
990
+ pip\_internal\models\installation_report.cpython-311.pyc,,
991
+ pip\_vendor\webencodings\x_user_defined.cpython-311.pyc,,
992
+ pip\_internal\utils\temp_dir.cpython-311.pyc,,
993
+ pip\_vendor\pygments\formatters\rtf.cpython-311.pyc,,
994
+ pip\_vendor\rich\columns.cpython-311.pyc,,
995
+ pip\_vendor\chardet\gb2312freq.cpython-311.pyc,,
996
+ pip\_internal\network\__init__.cpython-311.pyc,,
997
+ pip\_vendor\chardet\charsetgroupprober.cpython-311.pyc,,
998
+ pip\_vendor\packaging\tags.cpython-311.pyc,,
999
+ pip\_vendor\cachecontrol\compat.cpython-311.pyc,,
1000
+ pip\_vendor\pygments\formatters\terminal256.cpython-311.pyc,,
1001
+ pip\_vendor\pygments\formatters\__pycache__,,
1002
+ pip\_internal\cli\progress_bars.cpython-311.pyc,,
1003
+ pip\_vendor\colorama\winterm.cpython-311.pyc,,
1004
+ pip\_vendor\idna\compat.cpython-311.pyc,,
1005
+ pip\_vendor\requests\_internal_utils.cpython-311.pyc,,
1006
+ pip\_vendor\urllib3\contrib\ntlmpool.cpython-311.pyc,,
1007
+ pip\_vendor\urllib3\util\connection.cpython-311.pyc,,
1008
+ pip\_vendor\pyparsing\util.cpython-311.pyc,,
1009
+ pip\_internal\utils\glibc.cpython-311.pyc,,
1010
+ pip\_vendor\requests\exceptions.cpython-311.pyc,,
1011
+ pip\_vendor\pygments\filters\__init__.cpython-311.pyc,,
1012
+ pip\_vendor\cachecontrol\filewrapper.cpython-311.pyc,,
1013
+ pip\_vendor\pyparsing\testing.cpython-311.pyc,,
1014
+ pip\_internal\commands\show.cpython-311.pyc,,
1015
+ pip\_vendor\colorama\tests\initialise_test.cpython-311.pyc,,
1016
+ pip\_internal\utils\filesystem.cpython-311.pyc,,
1017
+ pip\_vendor\pygments\regexopt.cpython-311.pyc,,
1018
+ pip\_vendor\rich\tree.cpython-311.pyc,,
1019
+ pip\_internal\operations\build\__pycache__,,
1020
+ pip\_internal\locations\__pycache__,,
1021
+ pip\_vendor\rich\region.cpython-311.pyc,,
1022
+ pip\_internal\resolution\base.cpython-311.pyc,,
1023
+ pip\_vendor\rich\color.cpython-311.pyc,,
1024
+ pip\_vendor\chardet\resultdict.cpython-311.pyc,,
1025
+ pip\_vendor\chardet\big5prober.cpython-311.pyc,,
1026
+ pip\_internal\network\__pycache__,,
1027
+ pip\_vendor\cachecontrol\controller.cpython-311.pyc,,
1028
+ pip\_internal\utils\datetime.cpython-311.pyc,,
1029
+ pip\_vendor\rich\filesize.cpython-311.pyc,,
1030
+ pip\_vendor\cachecontrol\caches\file_cache.cpython-311.pyc,,
1031
+ pip\_internal\distributions\wheel.cpython-311.pyc,,
1032
+ pip\_vendor\chardet\euckrfreq.cpython-311.pyc,,
1033
+ pip\_internal\resolution\resolvelib\__pycache__,,
1034
+ pip\_vendor\chardet\euckrprober.cpython-311.pyc,,
1035
+ pip\_vendor\rich\diagnose.cpython-311.pyc,,
1036
+ pip\_vendor\typing_extensions.cpython-311.pyc,,
1037
+ pip\_vendor\pygments\filters\__pycache__,,
1038
+ pip\_vendor\tenacity\retry.cpython-311.pyc,,
1039
+ pip\_vendor\urllib3\contrib\__init__.cpython-311.pyc,,
1040
+ pip\_internal\models\search_scope.cpython-311.pyc,,
1041
+ pip\_vendor\requests\auth.cpython-311.pyc,,
1042
+ pip\_internal\resolution\resolvelib\resolver.cpython-311.pyc,,
1043
+ pip\_vendor\chardet\langhebrewmodel.cpython-311.pyc,,
1044
+ pip\_internal\operations\build\metadata_legacy.cpython-311.pyc,,
1045
+ pip\_vendor\requests\__init__.cpython-311.pyc,,
1046
+ pip\_vendor\chardet\codingstatemachine.cpython-311.pyc,,
1047
+ pip\_vendor\packaging\_structures.cpython-311.pyc,,
1048
+ pip\_vendor\msgpack\ext.cpython-311.pyc,,
1049
+ pip\_vendor\rich\progress_bar.cpython-311.pyc,,
1050
+ pip\_internal\commands\__pycache__,,
1051
+ pip\_internal\utils\models.cpython-311.pyc,,
1052
+ pip\_vendor\pygments\formatters\other.cpython-311.pyc,,
1053
+ pip\_internal\utils\inject_securetransport.cpython-311.pyc,,
1054
+ pip\_vendor\chardet\escprober.cpython-311.pyc,,
1055
+ pip\_vendor\urllib3\exceptions.cpython-311.pyc,,
1056
+ pip\_vendor\msgpack\exceptions.cpython-311.pyc,,
1057
+ pip\_internal\operations\__init__.cpython-311.pyc,,
1058
+ pip\_vendor\pkg_resources\__pycache__,,
1059
+ pip\_vendor\urllib3\packages\__init__.cpython-311.pyc,,
1060
+ pip\__pip-runner__.cpython-311.pyc,,
1061
+ pip\_vendor\rich\panel.cpython-311.pyc,,
1062
+ pip\_internal\resolution\resolvelib\candidates.cpython-311.pyc,,
1063
+ pip\_vendor\chardet\eucjpprober.cpython-311.pyc,,
.venv/Lib/site-packages/pip-23.2.1.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.40.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
.venv/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [console_scripts]
2
+ pip = pip._internal.cli.main:main
3
+ pip3 = pip._internal.cli.main:main
4
+ pip3.11 = pip._internal.cli.main:main
.venv/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip-23.2.1.virtualenv ADDED
File without changes
.venv/Lib/site-packages/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ __version__ = "23.2.1"
4
+
5
+
6
+ def main(args: Optional[List[str]] = None) -> int:
7
+ """This is an internal API only meant for use by pip's own console scripts.
8
+
9
+ For additional details, see https://github.com/pypa/pip/issues/7498.
10
+ """
11
+ from pip._internal.utils.entrypoints import _wrapper
12
+
13
+ return _wrapper(args)
.venv/Lib/site-packages/pip/__main__.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Remove '' and current working directory from the first entry
5
+ # of sys.path, if present to avoid using current directory
6
+ # in pip commands check, freeze, install, list and show,
7
+ # when invoked as python -m pip <command>
8
+ if sys.path[0] in ("", os.getcwd()):
9
+ sys.path.pop(0)
10
+
11
+ # If we are running from a wheel, add the wheel to sys.path
12
+ # This allows the usage python pip-*.whl/pip install pip-*.whl
13
+ if __package__ == "":
14
+ # __file__ is pip-*.whl/pip/__main__.py
15
+ # first dirname call strips of '/__main__.py', second strips off '/pip'
16
+ # Resulting path is the name of the wheel itself
17
+ # Add that to sys.path so we can import pip
18
+ path = os.path.dirname(os.path.dirname(__file__))
19
+ sys.path.insert(0, path)
20
+
21
+ if __name__ == "__main__":
22
+ from pip._internal.cli.main import main as _main
23
+
24
+ sys.exit(_main())
.venv/Lib/site-packages/pip/__pip-runner__.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Execute exactly this copy of pip, within a different environment.
2
+
3
+ This file is named as it is, to ensure that this module can't be imported via
4
+ an import statement.
5
+ """
6
+
7
+ # /!\ This version compatibility check section must be Python 2 compatible. /!\
8
+
9
+ import sys
10
+
11
+ # Copied from setup.py
12
+ PYTHON_REQUIRES = (3, 7)
13
+
14
+
15
+ def version_str(version): # type: ignore
16
+ return ".".join(str(v) for v in version)
17
+
18
+
19
+ if sys.version_info[:2] < PYTHON_REQUIRES:
20
+ raise SystemExit(
21
+ "This version of pip does not support python {} (requires >={}).".format(
22
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
23
+ )
24
+ )
25
+
26
+ # From here on, we can use Python 3 features, but the syntax must remain
27
+ # Python 2 compatible.
28
+
29
+ import runpy # noqa: E402
30
+ from importlib.machinery import PathFinder # noqa: E402
31
+ from os.path import dirname # noqa: E402
32
+
33
+ PIP_SOURCES_ROOT = dirname(dirname(__file__))
34
+
35
+
36
+ class PipImportRedirectingFinder:
37
+ @classmethod
38
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
39
+ if fullname != "pip":
40
+ return None
41
+
42
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
43
+ assert spec, (PIP_SOURCES_ROOT, fullname)
44
+ return spec
45
+
46
+
47
+ sys.meta_path.insert(0, PipImportRedirectingFinder())
48
+
49
+ assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
50
+ runpy.run_module("pip", run_name="__main__", alter_sys=True)
.venv/Lib/site-packages/pip/_internal/__init__.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ import pip._internal.utils.inject_securetransport # noqa
4
+ from pip._internal.utils import _log
5
+
6
+ # init_logging() must be called before any call to logging.getLogger()
7
+ # which happens at import of most modules.
8
+ _log.init_logging()
9
+
10
+
11
+ def main(args: (Optional[List[str]]) = None) -> int:
12
+ """This is preserved for old console scripts that may still be referencing
13
+ it.
14
+
15
+ For additional details, see https://github.com/pypa/pip/issues/7498.
16
+ """
17
+ from pip._internal.utils.entrypoints import _wrapper
18
+
19
+ return _wrapper(args)
.venv/Lib/site-packages/pip/_internal/build_env.py ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building
2
+ """
3
+
4
+ import logging
5
+ import os
6
+ import pathlib
7
+ import site
8
+ import sys
9
+ import textwrap
10
+ from collections import OrderedDict
11
+ from types import TracebackType
12
+ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
13
+
14
+ from pip._vendor.certifi import where
15
+ from pip._vendor.packaging.requirements import Requirement
16
+ from pip._vendor.packaging.version import Version
17
+
18
+ from pip import __file__ as pip_location
19
+ from pip._internal.cli.spinners import open_spinner
20
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
21
+ from pip._internal.metadata import get_default_environment, get_environment
22
+ from pip._internal.utils.subprocess import call_subprocess
23
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
24
+
25
+ if TYPE_CHECKING:
26
+ from pip._internal.index.package_finder import PackageFinder
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
32
+ return (a, b) if a != b else (a,)
33
+
34
+
35
+ class _Prefix:
36
+ def __init__(self, path: str) -> None:
37
+ self.path = path
38
+ self.setup = False
39
+ scheme = get_scheme("", prefix=path)
40
+ self.bin_dir = scheme.scripts
41
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
42
+
43
+
44
+ def get_runnable_pip() -> str:
45
+ """Get a file to pass to a Python executable, to run the currently-running pip.
46
+
47
+ This is used to run a pip subprocess, for installing requirements into the build
48
+ environment.
49
+ """
50
+ source = pathlib.Path(pip_location).resolve().parent
51
+
52
+ if not source.is_dir():
53
+ # This would happen if someone is using pip from inside a zip file. In that
54
+ # case, we can use that directly.
55
+ return str(source)
56
+
57
+ return os.fsdecode(source / "__pip-runner__.py")
58
+
59
+
60
+ def _get_system_sitepackages() -> Set[str]:
61
+ """Get system site packages
62
+
63
+ Usually from site.getsitepackages,
64
+ but fallback on `get_purelib()/get_platlib()` if unavailable
65
+ (e.g. in a virtualenv created by virtualenv<20)
66
+
67
+ Returns normalized set of strings.
68
+ """
69
+ if hasattr(site, "getsitepackages"):
70
+ system_sites = site.getsitepackages()
71
+ else:
72
+ # virtualenv < 20 overwrites site.py without getsitepackages
73
+ # fallback on get_purelib/get_platlib.
74
+ # this is known to miss things, but shouldn't in the cases
75
+ # where getsitepackages() has been removed (inside a virtualenv)
76
+ system_sites = [get_purelib(), get_platlib()]
77
+ return {os.path.normcase(path) for path in system_sites}
78
+
79
+
80
+ class BuildEnvironment:
81
+ """Creates and manages an isolated environment to install build deps"""
82
+
83
+ def __init__(self) -> None:
84
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
85
+
86
+ self._prefixes = OrderedDict(
87
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
88
+ for name in ("normal", "overlay")
89
+ )
90
+
91
+ self._bin_dirs: List[str] = []
92
+ self._lib_dirs: List[str] = []
93
+ for prefix in reversed(list(self._prefixes.values())):
94
+ self._bin_dirs.append(prefix.bin_dir)
95
+ self._lib_dirs.extend(prefix.lib_dirs)
96
+
97
+ # Customize site to:
98
+ # - ensure .pth files are honored
99
+ # - prevent access to system site packages
100
+ system_sites = _get_system_sitepackages()
101
+
102
+ self._site_dir = os.path.join(temp_dir.path, "site")
103
+ if not os.path.exists(self._site_dir):
104
+ os.mkdir(self._site_dir)
105
+ with open(
106
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
107
+ ) as fp:
108
+ fp.write(
109
+ textwrap.dedent(
110
+ """
111
+ import os, site, sys
112
+
113
+ # First, drop system-sites related paths.
114
+ original_sys_path = sys.path[:]
115
+ known_paths = set()
116
+ for path in {system_sites!r}:
117
+ site.addsitedir(path, known_paths=known_paths)
118
+ system_paths = set(
119
+ os.path.normcase(path)
120
+ for path in sys.path[len(original_sys_path):]
121
+ )
122
+ original_sys_path = [
123
+ path for path in original_sys_path
124
+ if os.path.normcase(path) not in system_paths
125
+ ]
126
+ sys.path = original_sys_path
127
+
128
+ # Second, add lib directories.
129
+ # ensuring .pth file are processed.
130
+ for path in {lib_dirs!r}:
131
+ assert not path in sys.path
132
+ site.addsitedir(path)
133
+ """
134
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
135
+ )
136
+
137
+ def __enter__(self) -> None:
138
+ self._save_env = {
139
+ name: os.environ.get(name, None)
140
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
141
+ }
142
+
143
+ path = self._bin_dirs[:]
144
+ old_path = self._save_env["PATH"]
145
+ if old_path:
146
+ path.extend(old_path.split(os.pathsep))
147
+
148
+ pythonpath = [self._site_dir]
149
+
150
+ os.environ.update(
151
+ {
152
+ "PATH": os.pathsep.join(path),
153
+ "PYTHONNOUSERSITE": "1",
154
+ "PYTHONPATH": os.pathsep.join(pythonpath),
155
+ }
156
+ )
157
+
158
+ def __exit__(
159
+ self,
160
+ exc_type: Optional[Type[BaseException]],
161
+ exc_val: Optional[BaseException],
162
+ exc_tb: Optional[TracebackType],
163
+ ) -> None:
164
+ for varname, old_value in self._save_env.items():
165
+ if old_value is None:
166
+ os.environ.pop(varname, None)
167
+ else:
168
+ os.environ[varname] = old_value
169
+
170
+ def check_requirements(
171
+ self, reqs: Iterable[str]
172
+ ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
173
+ """Return 2 sets:
174
+ - conflicting requirements: set of (installed, wanted) reqs tuples
175
+ - missing requirements: set of reqs
176
+ """
177
+ missing = set()
178
+ conflicting = set()
179
+ if reqs:
180
+ env = (
181
+ get_environment(self._lib_dirs)
182
+ if hasattr(self, "_lib_dirs")
183
+ else get_default_environment()
184
+ )
185
+ for req_str in reqs:
186
+ req = Requirement(req_str)
187
+ # We're explicitly evaluating with an empty extra value, since build
188
+ # environments are not provided any mechanism to select specific extras.
189
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
190
+ continue
191
+ dist = env.get_distribution(req.name)
192
+ if not dist:
193
+ missing.add(req_str)
194
+ continue
195
+ if isinstance(dist.version, Version):
196
+ installed_req_str = f"{req.name}=={dist.version}"
197
+ else:
198
+ installed_req_str = f"{req.name}==={dist.version}"
199
+ if not req.specifier.contains(dist.version, prereleases=True):
200
+ conflicting.add((installed_req_str, req_str))
201
+ # FIXME: Consider direct URL?
202
+ return conflicting, missing
203
+
204
+ def install_requirements(
205
+ self,
206
+ finder: "PackageFinder",
207
+ requirements: Iterable[str],
208
+ prefix_as_string: str,
209
+ *,
210
+ kind: str,
211
+ ) -> None:
212
+ prefix = self._prefixes[prefix_as_string]
213
+ assert not prefix.setup
214
+ prefix.setup = True
215
+ if not requirements:
216
+ return
217
+ self._install_requirements(
218
+ get_runnable_pip(),
219
+ finder,
220
+ requirements,
221
+ prefix,
222
+ kind=kind,
223
+ )
224
+
225
+ @staticmethod
226
+ def _install_requirements(
227
+ pip_runnable: str,
228
+ finder: "PackageFinder",
229
+ requirements: Iterable[str],
230
+ prefix: _Prefix,
231
+ *,
232
+ kind: str,
233
+ ) -> None:
234
+ args: List[str] = [
235
+ sys.executable,
236
+ pip_runnable,
237
+ "install",
238
+ "--ignore-installed",
239
+ "--no-user",
240
+ "--prefix",
241
+ prefix.path,
242
+ "--no-warn-script-location",
243
+ ]
244
+ if logger.getEffectiveLevel() <= logging.DEBUG:
245
+ args.append("-v")
246
+ for format_control in ("no_binary", "only_binary"):
247
+ formats = getattr(finder.format_control, format_control)
248
+ args.extend(
249
+ (
250
+ "--" + format_control.replace("_", "-"),
251
+ ",".join(sorted(formats or {":none:"})),
252
+ )
253
+ )
254
+
255
+ index_urls = finder.index_urls
256
+ if index_urls:
257
+ args.extend(["-i", index_urls[0]])
258
+ for extra_index in index_urls[1:]:
259
+ args.extend(["--extra-index-url", extra_index])
260
+ else:
261
+ args.append("--no-index")
262
+ for link in finder.find_links:
263
+ args.extend(["--find-links", link])
264
+
265
+ for host in finder.trusted_hosts:
266
+ args.extend(["--trusted-host", host])
267
+ if finder.allow_all_prereleases:
268
+ args.append("--pre")
269
+ if finder.prefer_binary:
270
+ args.append("--prefer-binary")
271
+ args.append("--")
272
+ args.extend(requirements)
273
+ extra_environ = {"_PIP_STANDALONE_CERT": where()}
274
+ with open_spinner(f"Installing {kind}") as spinner:
275
+ call_subprocess(
276
+ args,
277
+ command_desc=f"pip subprocess to install {kind}",
278
+ spinner=spinner,
279
+ extra_environ=extra_environ,
280
+ )
281
+
282
+
283
+ class NoOpBuildEnvironment(BuildEnvironment):
284
+ """A no-op drop-in replacement for BuildEnvironment"""
285
+
286
+ def __init__(self) -> None:
287
+ pass
288
+
289
+ def __enter__(self) -> None:
290
+ pass
291
+
292
+ def __exit__(
293
+ self,
294
+ exc_type: Optional[Type[BaseException]],
295
+ exc_val: Optional[BaseException],
296
+ exc_tb: Optional[TracebackType],
297
+ ) -> None:
298
+ pass
299
+
300
+ def cleanup(self) -> None:
301
+ pass
302
+
303
+ def install_requirements(
304
+ self,
305
+ finder: "PackageFinder",
306
+ requirements: Iterable[str],
307
+ prefix_as_string: str,
308
+ *,
309
+ kind: str,
310
+ ) -> None:
311
+ raise NotImplementedError()
.venv/Lib/site-packages/pip/_internal/cache.py ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management
2
+ """
3
+
4
+ import hashlib
5
+ import json
6
+ import logging
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Any, Dict, List, Optional
10
+
11
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
12
+ from pip._vendor.packaging.utils import canonicalize_name
13
+
14
+ from pip._internal.exceptions import InvalidWheelFilename
15
+ from pip._internal.models.direct_url import DirectUrl
16
+ from pip._internal.models.link import Link
17
+ from pip._internal.models.wheel import Wheel
18
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
19
+ from pip._internal.utils.urls import path_to_url
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ ORIGIN_JSON_NAME = "origin.json"
24
+
25
+
26
+ def _hash_dict(d: Dict[str, str]) -> str:
27
+ """Return a stable sha224 of a dictionary."""
28
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
29
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
30
+
31
+
32
+ class Cache:
33
+ """An abstract class - provides cache directories for data from links
34
+
35
+ :param cache_dir: The root of the cache.
36
+ """
37
+
38
+ def __init__(self, cache_dir: str) -> None:
39
+ super().__init__()
40
+ assert not cache_dir or os.path.isabs(cache_dir)
41
+ self.cache_dir = cache_dir or None
42
+
43
+ def _get_cache_path_parts(self, link: Link) -> List[str]:
44
+ """Get parts of part that must be os.path.joined with cache_dir"""
45
+
46
+ # We want to generate an url to use as our cache key, we don't want to
47
+ # just re-use the URL because it might have other items in the fragment
48
+ # and we don't care about those.
49
+ key_parts = {"url": link.url_without_fragment}
50
+ if link.hash_name is not None and link.hash is not None:
51
+ key_parts[link.hash_name] = link.hash
52
+ if link.subdirectory_fragment:
53
+ key_parts["subdirectory"] = link.subdirectory_fragment
54
+
55
+ # Include interpreter name, major and minor version in cache key
56
+ # to cope with ill-behaved sdists that build a different wheel
57
+ # depending on the python version their setup.py is being run on,
58
+ # and don't encode the difference in compatibility tags.
59
+ # https://github.com/pypa/pip/issues/7296
60
+ key_parts["interpreter_name"] = interpreter_name()
61
+ key_parts["interpreter_version"] = interpreter_version()
62
+
63
+ # Encode our key url with sha224, we'll use this because it has similar
64
+ # security properties to sha256, but with a shorter total output (and
65
+ # thus less secure). However the differences don't make a lot of
66
+ # difference for our use case here.
67
+ hashed = _hash_dict(key_parts)
68
+
69
+ # We want to nest the directories some to prevent having a ton of top
70
+ # level directories where we might run out of sub directories on some
71
+ # FS.
72
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
73
+
74
+ return parts
75
+
76
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
77
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
78
+ if can_not_cache:
79
+ return []
80
+
81
+ candidates = []
82
+ path = self.get_path_for_link(link)
83
+ if os.path.isdir(path):
84
+ for candidate in os.listdir(path):
85
+ candidates.append((candidate, path))
86
+ return candidates
87
+
88
+ def get_path_for_link(self, link: Link) -> str:
89
+ """Return a directory to store cached items in for link."""
90
+ raise NotImplementedError()
91
+
92
+ def get(
93
+ self,
94
+ link: Link,
95
+ package_name: Optional[str],
96
+ supported_tags: List[Tag],
97
+ ) -> Link:
98
+ """Returns a link to a cached item if it exists, otherwise returns the
99
+ passed link.
100
+ """
101
+ raise NotImplementedError()
102
+
103
+
104
+ class SimpleWheelCache(Cache):
105
+ """A cache of wheels for future installs."""
106
+
107
+ def __init__(self, cache_dir: str) -> None:
108
+ super().__init__(cache_dir)
109
+
110
+ def get_path_for_link(self, link: Link) -> str:
111
+ """Return a directory to store cached wheels for link
112
+
113
+ Because there are M wheels for any one sdist, we provide a directory
114
+ to cache them in, and then consult that directory when looking up
115
+ cache hits.
116
+
117
+ We only insert things into the cache if they have plausible version
118
+ numbers, so that we don't contaminate the cache with things that were
119
+ not unique. E.g. ./package might have dozens of installs done for it
120
+ and build a version of 0.0...and if we built and cached a wheel, we'd
121
+ end up using the same wheel even if the source has been edited.
122
+
123
+ :param link: The link of the sdist for which this will cache wheels.
124
+ """
125
+ parts = self._get_cache_path_parts(link)
126
+ assert self.cache_dir
127
+ # Store wheels within the root cache_dir
128
+ return os.path.join(self.cache_dir, "wheels", *parts)
129
+
130
+ def get(
131
+ self,
132
+ link: Link,
133
+ package_name: Optional[str],
134
+ supported_tags: List[Tag],
135
+ ) -> Link:
136
+ candidates = []
137
+
138
+ if not package_name:
139
+ return link
140
+
141
+ canonical_package_name = canonicalize_name(package_name)
142
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
143
+ try:
144
+ wheel = Wheel(wheel_name)
145
+ except InvalidWheelFilename:
146
+ continue
147
+ if canonicalize_name(wheel.name) != canonical_package_name:
148
+ logger.debug(
149
+ "Ignoring cached wheel %s for %s as it "
150
+ "does not match the expected distribution name %s.",
151
+ wheel_name,
152
+ link,
153
+ package_name,
154
+ )
155
+ continue
156
+ if not wheel.supported(supported_tags):
157
+ # Built for a different python/arch/etc
158
+ continue
159
+ candidates.append(
160
+ (
161
+ wheel.support_index_min(supported_tags),
162
+ wheel_name,
163
+ wheel_dir,
164
+ )
165
+ )
166
+
167
+ if not candidates:
168
+ return link
169
+
170
+ _, wheel_name, wheel_dir = min(candidates)
171
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
172
+
173
+
174
+ class EphemWheelCache(SimpleWheelCache):
175
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
176
+
177
+ def __init__(self) -> None:
178
+ self._temp_dir = TempDirectory(
179
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
180
+ globally_managed=True,
181
+ )
182
+
183
+ super().__init__(self._temp_dir.path)
184
+
185
+
186
+ class CacheEntry:
187
+ def __init__(
188
+ self,
189
+ link: Link,
190
+ persistent: bool,
191
+ ):
192
+ self.link = link
193
+ self.persistent = persistent
194
+ self.origin: Optional[DirectUrl] = None
195
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
196
+ if origin_direct_url_path.exists():
197
+ try:
198
+ self.origin = DirectUrl.from_json(
199
+ origin_direct_url_path.read_text(encoding="utf-8")
200
+ )
201
+ except Exception as e:
202
+ logger.warning(
203
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
204
+ origin_direct_url_path,
205
+ link.filename,
206
+ e,
207
+ )
208
+
209
+
210
+ class WheelCache(Cache):
211
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
212
+
213
+ This Cache allows for gracefully degradation, using the ephem wheel cache
214
+ when a certain link is not found in the simple wheel cache first.
215
+ """
216
+
217
+ def __init__(self, cache_dir: str) -> None:
218
+ super().__init__(cache_dir)
219
+ self._wheel_cache = SimpleWheelCache(cache_dir)
220
+ self._ephem_cache = EphemWheelCache()
221
+
222
+ def get_path_for_link(self, link: Link) -> str:
223
+ return self._wheel_cache.get_path_for_link(link)
224
+
225
+ def get_ephem_path_for_link(self, link: Link) -> str:
226
+ return self._ephem_cache.get_path_for_link(link)
227
+
228
+ def get(
229
+ self,
230
+ link: Link,
231
+ package_name: Optional[str],
232
+ supported_tags: List[Tag],
233
+ ) -> Link:
234
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
235
+ if cache_entry is None:
236
+ return link
237
+ return cache_entry.link
238
+
239
+ def get_cache_entry(
240
+ self,
241
+ link: Link,
242
+ package_name: Optional[str],
243
+ supported_tags: List[Tag],
244
+ ) -> Optional[CacheEntry]:
245
+ """Returns a CacheEntry with a link to a cached item if it exists or
246
+ None. The cache entry indicates if the item was found in the persistent
247
+ or ephemeral cache.
248
+ """
249
+ retval = self._wheel_cache.get(
250
+ link=link,
251
+ package_name=package_name,
252
+ supported_tags=supported_tags,
253
+ )
254
+ if retval is not link:
255
+ return CacheEntry(retval, persistent=True)
256
+
257
+ retval = self._ephem_cache.get(
258
+ link=link,
259
+ package_name=package_name,
260
+ supported_tags=supported_tags,
261
+ )
262
+ if retval is not link:
263
+ return CacheEntry(retval, persistent=False)
264
+
265
+ return None
266
+
267
+ @staticmethod
268
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
269
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
270
+ if origin_path.exists():
271
+ try:
272
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
273
+ except Exception as e:
274
+ logger.warning(
275
+ "Could not read origin file %s in cache entry (%s). "
276
+ "Will attempt to overwrite it.",
277
+ origin_path,
278
+ e,
279
+ )
280
+ else:
281
+ # TODO: use DirectUrl.equivalent when
282
+ # https://github.com/pypa/pip/pull/10564 is merged.
283
+ if origin.url != download_info.url:
284
+ logger.warning(
285
+ "Origin URL %s in cache entry %s does not match download URL "
286
+ "%s. This is likely a pip bug or a cache corruption issue. "
287
+ "Will overwrite it with the new value.",
288
+ origin.url,
289
+ cache_dir,
290
+ download_info.url,
291
+ )
292
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
.venv/Lib/site-packages/pip/_internal/cli/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ """Subpackage containing all of pip's command line interface related code
2
+ """
3
+
4
+ # This file intentionally does not import submodules
.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Logic that powers autocompletion installed by ``pip completion``.
2
+ """
3
+
4
+ import optparse
5
+ import os
6
+ import sys
7
+ from itertools import chain
8
+ from typing import Any, Iterable, List, Optional
9
+
10
+ from pip._internal.cli.main_parser import create_main_parser
11
+ from pip._internal.commands import commands_dict, create_command
12
+ from pip._internal.metadata import get_default_environment
13
+
14
+
15
+ def autocomplete() -> None:
16
+ """Entry Point for completion of main and subcommand options."""
17
+ # Don't complete if user hasn't sourced bash_completion file.
18
+ if "PIP_AUTO_COMPLETE" not in os.environ:
19
+ return
20
+ cwords = os.environ["COMP_WORDS"].split()[1:]
21
+ cword = int(os.environ["COMP_CWORD"])
22
+ try:
23
+ current = cwords[cword - 1]
24
+ except IndexError:
25
+ current = ""
26
+
27
+ parser = create_main_parser()
28
+ subcommands = list(commands_dict)
29
+ options = []
30
+
31
+ # subcommand
32
+ subcommand_name: Optional[str] = None
33
+ for word in cwords:
34
+ if word in subcommands:
35
+ subcommand_name = word
36
+ break
37
+ # subcommand options
38
+ if subcommand_name is not None:
39
+ # special case: 'help' subcommand has no options
40
+ if subcommand_name == "help":
41
+ sys.exit(1)
42
+ # special case: list locally installed dists for show and uninstall
43
+ should_list_installed = not current.startswith("-") and subcommand_name in [
44
+ "show",
45
+ "uninstall",
46
+ ]
47
+ if should_list_installed:
48
+ env = get_default_environment()
49
+ lc = current.lower()
50
+ installed = [
51
+ dist.canonical_name
52
+ for dist in env.iter_installed_distributions(local_only=True)
53
+ if dist.canonical_name.startswith(lc)
54
+ and dist.canonical_name not in cwords[1:]
55
+ ]
56
+ # if there are no dists installed, fall back to option completion
57
+ if installed:
58
+ for dist in installed:
59
+ print(dist)
60
+ sys.exit(1)
61
+
62
+ should_list_installables = (
63
+ not current.startswith("-") and subcommand_name == "install"
64
+ )
65
+ if should_list_installables:
66
+ for path in auto_complete_paths(current, "path"):
67
+ print(path)
68
+ sys.exit(1)
69
+
70
+ subcommand = create_command(subcommand_name)
71
+
72
+ for opt in subcommand.parser.option_list_all:
73
+ if opt.help != optparse.SUPPRESS_HELP:
74
+ for opt_str in opt._long_opts + opt._short_opts:
75
+ options.append((opt_str, opt.nargs))
76
+
77
+ # filter out previously specified options from available options
78
+ prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
79
+ options = [(x, v) for (x, v) in options if x not in prev_opts]
80
+ # filter options by current input
81
+ options = [(k, v) for k, v in options if k.startswith(current)]
82
+ # get completion type given cwords and available subcommand options
83
+ completion_type = get_path_completion_type(
84
+ cwords,
85
+ cword,
86
+ subcommand.parser.option_list_all,
87
+ )
88
+ # get completion files and directories if ``completion_type`` is
89
+ # ``<file>``, ``<dir>`` or ``<path>``
90
+ if completion_type:
91
+ paths = auto_complete_paths(current, completion_type)
92
+ options = [(path, 0) for path in paths]
93
+ for option in options:
94
+ opt_label = option[0]
95
+ # append '=' to options which require args
96
+ if option[1] and option[0][:2] == "--":
97
+ opt_label += "="
98
+ print(opt_label)
99
+ else:
100
+ # show main parser options only when necessary
101
+
102
+ opts = [i.option_list for i in parser.option_groups]
103
+ opts.append(parser.option_list)
104
+ flattened_opts = chain.from_iterable(opts)
105
+ if current.startswith("-"):
106
+ for opt in flattened_opts:
107
+ if opt.help != optparse.SUPPRESS_HELP:
108
+ subcommands += opt._long_opts + opt._short_opts
109
+ else:
110
+ # get completion type given cwords and all available options
111
+ completion_type = get_path_completion_type(cwords, cword, flattened_opts)
112
+ if completion_type:
113
+ subcommands = list(auto_complete_paths(current, completion_type))
114
+
115
+ print(" ".join([x for x in subcommands if x.startswith(current)]))
116
+ sys.exit(1)
117
+
118
+
119
+ def get_path_completion_type(
120
+ cwords: List[str], cword: int, opts: Iterable[Any]
121
+ ) -> Optional[str]:
122
+ """Get the type of path completion (``file``, ``dir``, ``path`` or None)
123
+
124
+ :param cwords: same as the environmental variable ``COMP_WORDS``
125
+ :param cword: same as the environmental variable ``COMP_CWORD``
126
+ :param opts: The available options to check
127
+ :return: path completion type (``file``, ``dir``, ``path`` or None)
128
+ """
129
+ if cword < 2 or not cwords[cword - 2].startswith("-"):
130
+ return None
131
+ for opt in opts:
132
+ if opt.help == optparse.SUPPRESS_HELP:
133
+ continue
134
+ for o in str(opt).split("/"):
135
+ if cwords[cword - 2].split("=")[0] == o:
136
+ if not opt.metavar or any(
137
+ x in ("path", "file", "dir") for x in opt.metavar.split("/")
138
+ ):
139
+ return opt.metavar
140
+ return None
141
+
142
+
143
+ def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
144
+ """If ``completion_type`` is ``file`` or ``path``, list all regular files
145
+ and directories starting with ``current``; otherwise only list directories
146
+ starting with ``current``.
147
+
148
+ :param current: The word to be completed
149
+ :param completion_type: path completion type(``file``, ``path`` or ``dir``)
150
+ :return: A generator of regular files and/or directories
151
+ """
152
+ directory, filename = os.path.split(current)
153
+ current_path = os.path.abspath(directory)
154
+ # Don't complete paths if they can't be accessed
155
+ if not os.access(current_path, os.R_OK):
156
+ return
157
+ filename = os.path.normcase(filename)
158
+ # list all files that start with ``filename``
159
+ file_list = (
160
+ x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
161
+ )
162
+ for f in file_list:
163
+ opt = os.path.join(current_path, f)
164
+ comp_file = os.path.normcase(os.path.join(directory, f))
165
+ # complete regular files when there is not ``<dir>`` after option
166
+ # complete directories when there is ``<file>``, ``<path>`` or
167
+ # ``<dir>``after option
168
+ if completion_type != "dir" and os.path.isfile(opt):
169
+ yield comp_file
170
+ elif os.path.isdir(opt):
171
+ yield os.path.join(comp_file, "")
.venv/Lib/site-packages/pip/_internal/cli/base_command.py ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base Command class, and related routines"""
2
+
3
+ import functools
4
+ import logging
5
+ import logging.config
6
+ import optparse
7
+ import os
8
+ import sys
9
+ import traceback
10
+ from optparse import Values
11
+ from typing import Any, Callable, List, Optional, Tuple
12
+
13
+ from pip._vendor.rich import traceback as rich_traceback
14
+
15
+ from pip._internal.cli import cmdoptions
16
+ from pip._internal.cli.command_context import CommandContextMixIn
17
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
18
+ from pip._internal.cli.status_codes import (
19
+ ERROR,
20
+ PREVIOUS_BUILD_DIR_ERROR,
21
+ UNKNOWN_ERROR,
22
+ VIRTUALENV_NOT_FOUND,
23
+ )
24
+ from pip._internal.exceptions import (
25
+ BadCommand,
26
+ CommandError,
27
+ DiagnosticPipError,
28
+ InstallationError,
29
+ NetworkConnectionError,
30
+ PreviousBuildDirError,
31
+ UninstallationError,
32
+ )
33
+ from pip._internal.utils.filesystem import check_path_owner
34
+ from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
35
+ from pip._internal.utils.misc import get_prog, normalize_path
36
+ from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
37
+ from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
38
+ from pip._internal.utils.virtualenv import running_under_virtualenv
39
+
40
+ __all__ = ["Command"]
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+
45
+ class Command(CommandContextMixIn):
46
+ usage: str = ""
47
+ ignore_require_venv: bool = False
48
+
49
+ def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
50
+ super().__init__()
51
+
52
+ self.name = name
53
+ self.summary = summary
54
+ self.parser = ConfigOptionParser(
55
+ usage=self.usage,
56
+ prog=f"{get_prog()} {name}",
57
+ formatter=UpdatingDefaultsHelpFormatter(),
58
+ add_help_option=False,
59
+ name=name,
60
+ description=self.__doc__,
61
+ isolated=isolated,
62
+ )
63
+
64
+ self.tempdir_registry: Optional[TempDirRegistry] = None
65
+
66
+ # Commands should add options to this option group
67
+ optgroup_name = f"{self.name.capitalize()} Options"
68
+ self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
69
+
70
+ # Add the general options
71
+ gen_opts = cmdoptions.make_option_group(
72
+ cmdoptions.general_group,
73
+ self.parser,
74
+ )
75
+ self.parser.add_option_group(gen_opts)
76
+
77
+ self.add_options()
78
+
79
+ def add_options(self) -> None:
80
+ pass
81
+
82
+ def handle_pip_version_check(self, options: Values) -> None:
83
+ """
84
+ This is a no-op so that commands by default do not do the pip version
85
+ check.
86
+ """
87
+ # Make sure we do the pip version check if the index_group options
88
+ # are present.
89
+ assert not hasattr(options, "no_index")
90
+
91
+ def run(self, options: Values, args: List[str]) -> int:
92
+ raise NotImplementedError
93
+
94
+ def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
95
+ # factored out for testability
96
+ return self.parser.parse_args(args)
97
+
98
+ def main(self, args: List[str]) -> int:
99
+ try:
100
+ with self.main_context():
101
+ return self._main(args)
102
+ finally:
103
+ logging.shutdown()
104
+
105
+ def _main(self, args: List[str]) -> int:
106
+ # We must initialize this before the tempdir manager, otherwise the
107
+ # configuration would not be accessible by the time we clean up the
108
+ # tempdir manager.
109
+ self.tempdir_registry = self.enter_context(tempdir_registry())
110
+ # Intentionally set as early as possible so globally-managed temporary
111
+ # directories are available to the rest of the code.
112
+ self.enter_context(global_tempdir_manager())
113
+
114
+ options, args = self.parse_args(args)
115
+
116
+ # Set verbosity so that it can be used elsewhere.
117
+ self.verbosity = options.verbose - options.quiet
118
+
119
+ level_number = setup_logging(
120
+ verbosity=self.verbosity,
121
+ no_color=options.no_color,
122
+ user_log_file=options.log,
123
+ )
124
+
125
+ always_enabled_features = set(options.features_enabled) & set(
126
+ cmdoptions.ALWAYS_ENABLED_FEATURES
127
+ )
128
+ if always_enabled_features:
129
+ logger.warning(
130
+ "The following features are always enabled: %s. ",
131
+ ", ".join(sorted(always_enabled_features)),
132
+ )
133
+
134
+ # Make sure that the --python argument isn't specified after the
135
+ # subcommand. We can tell, because if --python was specified,
136
+ # we should only reach this point if we're running in the created
137
+ # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
138
+ # variable set.
139
+ if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
140
+ logger.critical(
141
+ "The --python option must be placed before the pip subcommand name"
142
+ )
143
+ sys.exit(ERROR)
144
+
145
+ # TODO: Try to get these passing down from the command?
146
+ # without resorting to os.environ to hold these.
147
+ # This also affects isolated builds and it should.
148
+
149
+ if options.no_input:
150
+ os.environ["PIP_NO_INPUT"] = "1"
151
+
152
+ if options.exists_action:
153
+ os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
154
+
155
+ if options.require_venv and not self.ignore_require_venv:
156
+ # If a venv is required check if it can really be found
157
+ if not running_under_virtualenv():
158
+ logger.critical("Could not find an activated virtualenv (required).")
159
+ sys.exit(VIRTUALENV_NOT_FOUND)
160
+
161
+ if options.cache_dir:
162
+ options.cache_dir = normalize_path(options.cache_dir)
163
+ if not check_path_owner(options.cache_dir):
164
+ logger.warning(
165
+ "The directory '%s' or its parent directory is not owned "
166
+ "or is not writable by the current user. The cache "
167
+ "has been disabled. Check the permissions and owner of "
168
+ "that directory. If executing pip with sudo, you should "
169
+ "use sudo's -H flag.",
170
+ options.cache_dir,
171
+ )
172
+ options.cache_dir = None
173
+
174
+ def intercepts_unhandled_exc(
175
+ run_func: Callable[..., int]
176
+ ) -> Callable[..., int]:
177
+ @functools.wraps(run_func)
178
+ def exc_logging_wrapper(*args: Any) -> int:
179
+ try:
180
+ status = run_func(*args)
181
+ assert isinstance(status, int)
182
+ return status
183
+ except DiagnosticPipError as exc:
184
+ logger.error("[present-rich] %s", exc)
185
+ logger.debug("Exception information:", exc_info=True)
186
+
187
+ return ERROR
188
+ except PreviousBuildDirError as exc:
189
+ logger.critical(str(exc))
190
+ logger.debug("Exception information:", exc_info=True)
191
+
192
+ return PREVIOUS_BUILD_DIR_ERROR
193
+ except (
194
+ InstallationError,
195
+ UninstallationError,
196
+ BadCommand,
197
+ NetworkConnectionError,
198
+ ) as exc:
199
+ logger.critical(str(exc))
200
+ logger.debug("Exception information:", exc_info=True)
201
+
202
+ return ERROR
203
+ except CommandError as exc:
204
+ logger.critical("%s", exc)
205
+ logger.debug("Exception information:", exc_info=True)
206
+
207
+ return ERROR
208
+ except BrokenStdoutLoggingError:
209
+ # Bypass our logger and write any remaining messages to
210
+ # stderr because stdout no longer works.
211
+ print("ERROR: Pipe to stdout was broken", file=sys.stderr)
212
+ if level_number <= logging.DEBUG:
213
+ traceback.print_exc(file=sys.stderr)
214
+
215
+ return ERROR
216
+ except KeyboardInterrupt:
217
+ logger.critical("Operation cancelled by user")
218
+ logger.debug("Exception information:", exc_info=True)
219
+
220
+ return ERROR
221
+ except BaseException:
222
+ logger.critical("Exception:", exc_info=True)
223
+
224
+ return UNKNOWN_ERROR
225
+
226
+ return exc_logging_wrapper
227
+
228
+ try:
229
+ if not options.debug_mode:
230
+ run = intercepts_unhandled_exc(self.run)
231
+ else:
232
+ run = self.run
233
+ rich_traceback.install(show_locals=True)
234
+ return run(options, args)
235
+ finally:
236
+ self.handle_pip_version_check(options)
.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py ADDED
@@ -0,0 +1,1074 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ shared options and groups
3
+
4
+ The principle here is to define options once, but *not* instantiate them
5
+ globally. One reason being that options with action='append' can carry state
6
+ between parses. pip parses general options twice internally, and shouldn't
7
+ pass on state. To be consistent, all options will follow this design.
8
+ """
9
+
10
+ # The following comment should be removed at some point in the future.
11
+ # mypy: strict-optional=False
12
+
13
+ import importlib.util
14
+ import logging
15
+ import os
16
+ import textwrap
17
+ from functools import partial
18
+ from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
19
+ from textwrap import dedent
20
+ from typing import Any, Callable, Dict, Optional, Tuple
21
+
22
+ from pip._vendor.packaging.utils import canonicalize_name
23
+
24
+ from pip._internal.cli.parser import ConfigOptionParser
25
+ from pip._internal.exceptions import CommandError
26
+ from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
27
+ from pip._internal.models.format_control import FormatControl
28
+ from pip._internal.models.index import PyPI
29
+ from pip._internal.models.target_python import TargetPython
30
+ from pip._internal.utils.hashes import STRONG_HASHES
31
+ from pip._internal.utils.misc import strtobool
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
37
+ """
38
+ Raise an option parsing error using parser.error().
39
+
40
+ Args:
41
+ parser: an OptionParser instance.
42
+ option: an Option instance.
43
+ msg: the error text.
44
+ """
45
+ msg = f"{option} error: {msg}"
46
+ msg = textwrap.fill(" ".join(msg.split()))
47
+ parser.error(msg)
48
+
49
+
50
+ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
51
+ """
52
+ Return an OptionGroup object
53
+ group -- assumed to be dict with 'name' and 'options' keys
54
+ parser -- an optparse Parser
55
+ """
56
+ option_group = OptionGroup(parser, group["name"])
57
+ for option in group["options"]:
58
+ option_group.add_option(option())
59
+ return option_group
60
+
61
+
62
+ def check_dist_restriction(options: Values, check_target: bool = False) -> None:
63
+ """Function for determining if custom platform options are allowed.
64
+
65
+ :param options: The OptionParser options.
66
+ :param check_target: Whether or not to check if --target is being used.
67
+ """
68
+ dist_restriction_set = any(
69
+ [
70
+ options.python_version,
71
+ options.platforms,
72
+ options.abis,
73
+ options.implementation,
74
+ ]
75
+ )
76
+
77
+ binary_only = FormatControl(set(), {":all:"})
78
+ sdist_dependencies_allowed = (
79
+ options.format_control != binary_only and not options.ignore_dependencies
80
+ )
81
+
82
+ # Installations or downloads using dist restrictions must not combine
83
+ # source distributions and dist-specific wheels, as they are not
84
+ # guaranteed to be locally compatible.
85
+ if dist_restriction_set and sdist_dependencies_allowed:
86
+ raise CommandError(
87
+ "When restricting platform and interpreter constraints using "
88
+ "--python-version, --platform, --abi, or --implementation, "
89
+ "either --no-deps must be set, or --only-binary=:all: must be "
90
+ "set and --no-binary must not be set (or must be set to "
91
+ ":none:)."
92
+ )
93
+
94
+ if check_target:
95
+ if dist_restriction_set and not options.target_dir:
96
+ raise CommandError(
97
+ "Can not use any platform or abi specific options unless "
98
+ "installing via '--target'"
99
+ )
100
+
101
+
102
+ def _path_option_check(option: Option, opt: str, value: str) -> str:
103
+ return os.path.expanduser(value)
104
+
105
+
106
+ def _package_name_option_check(option: Option, opt: str, value: str) -> str:
107
+ return canonicalize_name(value)
108
+
109
+
110
+ class PipOption(Option):
111
+ TYPES = Option.TYPES + ("path", "package_name")
112
+ TYPE_CHECKER = Option.TYPE_CHECKER.copy()
113
+ TYPE_CHECKER["package_name"] = _package_name_option_check
114
+ TYPE_CHECKER["path"] = _path_option_check
115
+
116
+
117
+ ###########
118
+ # options #
119
+ ###########
120
+
121
+ help_: Callable[..., Option] = partial(
122
+ Option,
123
+ "-h",
124
+ "--help",
125
+ dest="help",
126
+ action="help",
127
+ help="Show help.",
128
+ )
129
+
130
+ debug_mode: Callable[..., Option] = partial(
131
+ Option,
132
+ "--debug",
133
+ dest="debug_mode",
134
+ action="store_true",
135
+ default=False,
136
+ help=(
137
+ "Let unhandled exceptions propagate outside the main subroutine, "
138
+ "instead of logging them to stderr."
139
+ ),
140
+ )
141
+
142
+ isolated_mode: Callable[..., Option] = partial(
143
+ Option,
144
+ "--isolated",
145
+ dest="isolated_mode",
146
+ action="store_true",
147
+ default=False,
148
+ help=(
149
+ "Run pip in an isolated mode, ignoring environment variables and user "
150
+ "configuration."
151
+ ),
152
+ )
153
+
154
+ require_virtualenv: Callable[..., Option] = partial(
155
+ Option,
156
+ "--require-virtualenv",
157
+ "--require-venv",
158
+ dest="require_venv",
159
+ action="store_true",
160
+ default=False,
161
+ help=(
162
+ "Allow pip to only run in a virtual environment; "
163
+ "exit with an error otherwise."
164
+ ),
165
+ )
166
+
167
+ override_externally_managed: Callable[..., Option] = partial(
168
+ Option,
169
+ "--break-system-packages",
170
+ dest="override_externally_managed",
171
+ action="store_true",
172
+ help="Allow pip to modify an EXTERNALLY-MANAGED Python installation",
173
+ )
174
+
175
+ python: Callable[..., Option] = partial(
176
+ Option,
177
+ "--python",
178
+ dest="python",
179
+ help="Run pip with the specified Python interpreter.",
180
+ )
181
+
182
+ verbose: Callable[..., Option] = partial(
183
+ Option,
184
+ "-v",
185
+ "--verbose",
186
+ dest="verbose",
187
+ action="count",
188
+ default=0,
189
+ help="Give more output. Option is additive, and can be used up to 3 times.",
190
+ )
191
+
192
+ no_color: Callable[..., Option] = partial(
193
+ Option,
194
+ "--no-color",
195
+ dest="no_color",
196
+ action="store_true",
197
+ default=False,
198
+ help="Suppress colored output.",
199
+ )
200
+
201
+ version: Callable[..., Option] = partial(
202
+ Option,
203
+ "-V",
204
+ "--version",
205
+ dest="version",
206
+ action="store_true",
207
+ help="Show version and exit.",
208
+ )
209
+
210
+ quiet: Callable[..., Option] = partial(
211
+ Option,
212
+ "-q",
213
+ "--quiet",
214
+ dest="quiet",
215
+ action="count",
216
+ default=0,
217
+ help=(
218
+ "Give less output. Option is additive, and can be used up to 3"
219
+ " times (corresponding to WARNING, ERROR, and CRITICAL logging"
220
+ " levels)."
221
+ ),
222
+ )
223
+
224
+ progress_bar: Callable[..., Option] = partial(
225
+ Option,
226
+ "--progress-bar",
227
+ dest="progress_bar",
228
+ type="choice",
229
+ choices=["on", "off"],
230
+ default="on",
231
+ help="Specify whether the progress bar should be used [on, off] (default: on)",
232
+ )
233
+
234
+ log: Callable[..., Option] = partial(
235
+ PipOption,
236
+ "--log",
237
+ "--log-file",
238
+ "--local-log",
239
+ dest="log",
240
+ metavar="path",
241
+ type="path",
242
+ help="Path to a verbose appending log.",
243
+ )
244
+
245
+ no_input: Callable[..., Option] = partial(
246
+ Option,
247
+ # Don't ask for input
248
+ "--no-input",
249
+ dest="no_input",
250
+ action="store_true",
251
+ default=False,
252
+ help="Disable prompting for input.",
253
+ )
254
+
255
+ keyring_provider: Callable[..., Option] = partial(
256
+ Option,
257
+ "--keyring-provider",
258
+ dest="keyring_provider",
259
+ choices=["auto", "disabled", "import", "subprocess"],
260
+ default="auto",
261
+ help=(
262
+ "Enable the credential lookup via the keyring library if user input is allowed."
263
+ " Specify which mechanism to use [disabled, import, subprocess]."
264
+ " (default: disabled)"
265
+ ),
266
+ )
267
+
268
+ proxy: Callable[..., Option] = partial(
269
+ Option,
270
+ "--proxy",
271
+ dest="proxy",
272
+ type="str",
273
+ default="",
274
+ help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.",
275
+ )
276
+
277
+ retries: Callable[..., Option] = partial(
278
+ Option,
279
+ "--retries",
280
+ dest="retries",
281
+ type="int",
282
+ default=5,
283
+ help="Maximum number of retries each connection should attempt "
284
+ "(default %default times).",
285
+ )
286
+
287
+ timeout: Callable[..., Option] = partial(
288
+ Option,
289
+ "--timeout",
290
+ "--default-timeout",
291
+ metavar="sec",
292
+ dest="timeout",
293
+ type="float",
294
+ default=15,
295
+ help="Set the socket timeout (default %default seconds).",
296
+ )
297
+
298
+
299
+ def exists_action() -> Option:
300
+ return Option(
301
+ # Option when path already exist
302
+ "--exists-action",
303
+ dest="exists_action",
304
+ type="choice",
305
+ choices=["s", "i", "w", "b", "a"],
306
+ default=[],
307
+ action="append",
308
+ metavar="action",
309
+ help="Default action when a path already exists: "
310
+ "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
311
+ )
312
+
313
+
314
+ cert: Callable[..., Option] = partial(
315
+ PipOption,
316
+ "--cert",
317
+ dest="cert",
318
+ type="path",
319
+ metavar="path",
320
+ help=(
321
+ "Path to PEM-encoded CA certificate bundle. "
322
+ "If provided, overrides the default. "
323
+ "See 'SSL Certificate Verification' in pip documentation "
324
+ "for more information."
325
+ ),
326
+ )
327
+
328
+ client_cert: Callable[..., Option] = partial(
329
+ PipOption,
330
+ "--client-cert",
331
+ dest="client_cert",
332
+ type="path",
333
+ default=None,
334
+ metavar="path",
335
+ help="Path to SSL client certificate, a single file containing the "
336
+ "private key and the certificate in PEM format.",
337
+ )
338
+
339
+ index_url: Callable[..., Option] = partial(
340
+ Option,
341
+ "-i",
342
+ "--index-url",
343
+ "--pypi-url",
344
+ dest="index_url",
345
+ metavar="URL",
346
+ default=PyPI.simple_url,
347
+ help="Base URL of the Python Package Index (default %default). "
348
+ "This should point to a repository compliant with PEP 503 "
349
+ "(the simple repository API) or a local directory laid out "
350
+ "in the same format.",
351
+ )
352
+
353
+
354
+ def extra_index_url() -> Option:
355
+ return Option(
356
+ "--extra-index-url",
357
+ dest="extra_index_urls",
358
+ metavar="URL",
359
+ action="append",
360
+ default=[],
361
+ help="Extra URLs of package indexes to use in addition to "
362
+ "--index-url. Should follow the same rules as "
363
+ "--index-url.",
364
+ )
365
+
366
+
367
+ no_index: Callable[..., Option] = partial(
368
+ Option,
369
+ "--no-index",
370
+ dest="no_index",
371
+ action="store_true",
372
+ default=False,
373
+ help="Ignore package index (only looking at --find-links URLs instead).",
374
+ )
375
+
376
+
377
+ def find_links() -> Option:
378
+ return Option(
379
+ "-f",
380
+ "--find-links",
381
+ dest="find_links",
382
+ action="append",
383
+ default=[],
384
+ metavar="url",
385
+ help="If a URL or path to an html file, then parse for links to "
386
+ "archives such as sdist (.tar.gz) or wheel (.whl) files. "
387
+ "If a local path or file:// URL that's a directory, "
388
+ "then look for archives in the directory listing. "
389
+ "Links to VCS project URLs are not supported.",
390
+ )
391
+
392
+
393
+ def trusted_host() -> Option:
394
+ return Option(
395
+ "--trusted-host",
396
+ dest="trusted_hosts",
397
+ action="append",
398
+ metavar="HOSTNAME",
399
+ default=[],
400
+ help="Mark this host or host:port pair as trusted, even though it "
401
+ "does not have valid or any HTTPS.",
402
+ )
403
+
404
+
405
+ def constraints() -> Option:
406
+ return Option(
407
+ "-c",
408
+ "--constraint",
409
+ dest="constraints",
410
+ action="append",
411
+ default=[],
412
+ metavar="file",
413
+ help="Constrain versions using the given constraints file. "
414
+ "This option can be used multiple times.",
415
+ )
416
+
417
+
418
+ def requirements() -> Option:
419
+ return Option(
420
+ "-r",
421
+ "--requirement",
422
+ dest="requirements",
423
+ action="append",
424
+ default=[],
425
+ metavar="file",
426
+ help="Install from the given requirements file. "
427
+ "This option can be used multiple times.",
428
+ )
429
+
430
+
431
+ def editable() -> Option:
432
+ return Option(
433
+ "-e",
434
+ "--editable",
435
+ dest="editables",
436
+ action="append",
437
+ default=[],
438
+ metavar="path/url",
439
+ help=(
440
+ "Install a project in editable mode (i.e. setuptools "
441
+ '"develop mode") from a local project path or a VCS url.'
442
+ ),
443
+ )
444
+
445
+
446
+ def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None:
447
+ value = os.path.abspath(value)
448
+ setattr(parser.values, option.dest, value)
449
+
450
+
451
+ src: Callable[..., Option] = partial(
452
+ PipOption,
453
+ "--src",
454
+ "--source",
455
+ "--source-dir",
456
+ "--source-directory",
457
+ dest="src_dir",
458
+ type="path",
459
+ metavar="dir",
460
+ default=get_src_prefix(),
461
+ action="callback",
462
+ callback=_handle_src,
463
+ help="Directory to check out editable projects into. "
464
+ 'The default in a virtualenv is "<venv path>/src". '
465
+ 'The default for global installs is "<current dir>/src".',
466
+ )
467
+
468
+
469
+ def _get_format_control(values: Values, option: Option) -> Any:
470
+ """Get a format_control object."""
471
+ return getattr(values, option.dest)
472
+
473
+
474
+ def _handle_no_binary(
475
+ option: Option, opt_str: str, value: str, parser: OptionParser
476
+ ) -> None:
477
+ existing = _get_format_control(parser.values, option)
478
+ FormatControl.handle_mutual_excludes(
479
+ value,
480
+ existing.no_binary,
481
+ existing.only_binary,
482
+ )
483
+
484
+
485
+ def _handle_only_binary(
486
+ option: Option, opt_str: str, value: str, parser: OptionParser
487
+ ) -> None:
488
+ existing = _get_format_control(parser.values, option)
489
+ FormatControl.handle_mutual_excludes(
490
+ value,
491
+ existing.only_binary,
492
+ existing.no_binary,
493
+ )
494
+
495
+
496
+ def no_binary() -> Option:
497
+ format_control = FormatControl(set(), set())
498
+ return Option(
499
+ "--no-binary",
500
+ dest="format_control",
501
+ action="callback",
502
+ callback=_handle_no_binary,
503
+ type="str",
504
+ default=format_control,
505
+ help="Do not use binary packages. Can be supplied multiple times, and "
506
+ 'each time adds to the existing value. Accepts either ":all:" to '
507
+ 'disable all binary packages, ":none:" to empty the set (notice '
508
+ "the colons), or one or more package names with commas between "
509
+ "them (no colons). Note that some packages are tricky to compile "
510
+ "and may fail to install when this option is used on them.",
511
+ )
512
+
513
+
514
+ def only_binary() -> Option:
515
+ format_control = FormatControl(set(), set())
516
+ return Option(
517
+ "--only-binary",
518
+ dest="format_control",
519
+ action="callback",
520
+ callback=_handle_only_binary,
521
+ type="str",
522
+ default=format_control,
523
+ help="Do not use source packages. Can be supplied multiple times, and "
524
+ 'each time adds to the existing value. Accepts either ":all:" to '
525
+ 'disable all source packages, ":none:" to empty the set, or one '
526
+ "or more package names with commas between them. Packages "
527
+ "without binary distributions will fail to install when this "
528
+ "option is used on them.",
529
+ )
530
+
531
+
532
+ platforms: Callable[..., Option] = partial(
533
+ Option,
534
+ "--platform",
535
+ dest="platforms",
536
+ metavar="platform",
537
+ action="append",
538
+ default=None,
539
+ help=(
540
+ "Only use wheels compatible with <platform>. Defaults to the "
541
+ "platform of the running system. Use this option multiple times to "
542
+ "specify multiple platforms supported by the target interpreter."
543
+ ),
544
+ )
545
+
546
+
547
+ # This was made a separate function for unit-testing purposes.
548
+ def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]:
549
+ """
550
+ Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
551
+
552
+ :return: A 2-tuple (version_info, error_msg), where `error_msg` is
553
+ non-None if and only if there was a parsing error.
554
+ """
555
+ if not value:
556
+ # The empty string is the same as not providing a value.
557
+ return (None, None)
558
+
559
+ parts = value.split(".")
560
+ if len(parts) > 3:
561
+ return ((), "at most three version parts are allowed")
562
+
563
+ if len(parts) == 1:
564
+ # Then we are in the case of "3" or "37".
565
+ value = parts[0]
566
+ if len(value) > 1:
567
+ parts = [value[0], value[1:]]
568
+
569
+ try:
570
+ version_info = tuple(int(part) for part in parts)
571
+ except ValueError:
572
+ return ((), "each version part must be an integer")
573
+
574
+ return (version_info, None)
575
+
576
+
577
+ def _handle_python_version(
578
+ option: Option, opt_str: str, value: str, parser: OptionParser
579
+ ) -> None:
580
+ """
581
+ Handle a provided --python-version value.
582
+ """
583
+ version_info, error_msg = _convert_python_version(value)
584
+ if error_msg is not None:
585
+ msg = "invalid --python-version value: {!r}: {}".format(
586
+ value,
587
+ error_msg,
588
+ )
589
+ raise_option_error(parser, option=option, msg=msg)
590
+
591
+ parser.values.python_version = version_info
592
+
593
+
594
+ python_version: Callable[..., Option] = partial(
595
+ Option,
596
+ "--python-version",
597
+ dest="python_version",
598
+ metavar="python_version",
599
+ action="callback",
600
+ callback=_handle_python_version,
601
+ type="str",
602
+ default=None,
603
+ help=dedent(
604
+ """\
605
+ The Python interpreter version to use for wheel and "Requires-Python"
606
+ compatibility checks. Defaults to a version derived from the running
607
+ interpreter. The version can be specified using up to three dot-separated
608
+ integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
609
+ version can also be given as a string without dots (e.g. "37" for 3.7.0).
610
+ """
611
+ ),
612
+ )
613
+
614
+
615
+ implementation: Callable[..., Option] = partial(
616
+ Option,
617
+ "--implementation",
618
+ dest="implementation",
619
+ metavar="implementation",
620
+ default=None,
621
+ help=(
622
+ "Only use wheels compatible with Python "
623
+ "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
624
+ " or 'ip'. If not specified, then the current "
625
+ "interpreter implementation is used. Use 'py' to force "
626
+ "implementation-agnostic wheels."
627
+ ),
628
+ )
629
+
630
+
631
+ abis: Callable[..., Option] = partial(
632
+ Option,
633
+ "--abi",
634
+ dest="abis",
635
+ metavar="abi",
636
+ action="append",
637
+ default=None,
638
+ help=(
639
+ "Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. "
640
+ "If not specified, then the current interpreter abi tag is used. "
641
+ "Use this option multiple times to specify multiple abis supported "
642
+ "by the target interpreter. Generally you will need to specify "
643
+ "--implementation, --platform, and --python-version when using this "
644
+ "option."
645
+ ),
646
+ )
647
+
648
+
649
+ def add_target_python_options(cmd_opts: OptionGroup) -> None:
650
+ cmd_opts.add_option(platforms())
651
+ cmd_opts.add_option(python_version())
652
+ cmd_opts.add_option(implementation())
653
+ cmd_opts.add_option(abis())
654
+
655
+
656
+ def make_target_python(options: Values) -> TargetPython:
657
+ target_python = TargetPython(
658
+ platforms=options.platforms,
659
+ py_version_info=options.python_version,
660
+ abis=options.abis,
661
+ implementation=options.implementation,
662
+ )
663
+
664
+ return target_python
665
+
666
+
667
+ def prefer_binary() -> Option:
668
+ return Option(
669
+ "--prefer-binary",
670
+ dest="prefer_binary",
671
+ action="store_true",
672
+ default=False,
673
+ help="Prefer older binary packages over newer source packages.",
674
+ )
675
+
676
+
677
+ cache_dir: Callable[..., Option] = partial(
678
+ PipOption,
679
+ "--cache-dir",
680
+ dest="cache_dir",
681
+ default=USER_CACHE_DIR,
682
+ metavar="dir",
683
+ type="path",
684
+ help="Store the cache data in <dir>.",
685
+ )
686
+
687
+
688
+ def _handle_no_cache_dir(
689
+ option: Option, opt: str, value: str, parser: OptionParser
690
+ ) -> None:
691
+ """
692
+ Process a value provided for the --no-cache-dir option.
693
+
694
+ This is an optparse.Option callback for the --no-cache-dir option.
695
+ """
696
+ # The value argument will be None if --no-cache-dir is passed via the
697
+ # command-line, since the option doesn't accept arguments. However,
698
+ # the value can be non-None if the option is triggered e.g. by an
699
+ # environment variable, like PIP_NO_CACHE_DIR=true.
700
+ if value is not None:
701
+ # Then parse the string value to get argument error-checking.
702
+ try:
703
+ strtobool(value)
704
+ except ValueError as exc:
705
+ raise_option_error(parser, option=option, msg=str(exc))
706
+
707
+ # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
708
+ # converted to 0 (like "false" or "no") caused cache_dir to be disabled
709
+ # rather than enabled (logic would say the latter). Thus, we disable
710
+ # the cache directory not just on values that parse to True, but (for
711
+ # backwards compatibility reasons) also on values that parse to False.
712
+ # In other words, always set it to False if the option is provided in
713
+ # some (valid) form.
714
+ parser.values.cache_dir = False
715
+
716
+
717
+ no_cache: Callable[..., Option] = partial(
718
+ Option,
719
+ "--no-cache-dir",
720
+ dest="cache_dir",
721
+ action="callback",
722
+ callback=_handle_no_cache_dir,
723
+ help="Disable the cache.",
724
+ )
725
+
726
+ no_deps: Callable[..., Option] = partial(
727
+ Option,
728
+ "--no-deps",
729
+ "--no-dependencies",
730
+ dest="ignore_dependencies",
731
+ action="store_true",
732
+ default=False,
733
+ help="Don't install package dependencies.",
734
+ )
735
+
736
+ ignore_requires_python: Callable[..., Option] = partial(
737
+ Option,
738
+ "--ignore-requires-python",
739
+ dest="ignore_requires_python",
740
+ action="store_true",
741
+ help="Ignore the Requires-Python information.",
742
+ )
743
+
744
+ no_build_isolation: Callable[..., Option] = partial(
745
+ Option,
746
+ "--no-build-isolation",
747
+ dest="build_isolation",
748
+ action="store_false",
749
+ default=True,
750
+ help="Disable isolation when building a modern source distribution. "
751
+ "Build dependencies specified by PEP 518 must be already installed "
752
+ "if this option is used.",
753
+ )
754
+
755
+ check_build_deps: Callable[..., Option] = partial(
756
+ Option,
757
+ "--check-build-dependencies",
758
+ dest="check_build_deps",
759
+ action="store_true",
760
+ default=False,
761
+ help="Check the build dependencies when PEP517 is used.",
762
+ )
763
+
764
+
765
+ def _handle_no_use_pep517(
766
+ option: Option, opt: str, value: str, parser: OptionParser
767
+ ) -> None:
768
+ """
769
+ Process a value provided for the --no-use-pep517 option.
770
+
771
+ This is an optparse.Option callback for the no_use_pep517 option.
772
+ """
773
+ # Since --no-use-pep517 doesn't accept arguments, the value argument
774
+ # will be None if --no-use-pep517 is passed via the command-line.
775
+ # However, the value can be non-None if the option is triggered e.g.
776
+ # by an environment variable, for example "PIP_NO_USE_PEP517=true".
777
+ if value is not None:
778
+ msg = """A value was passed for --no-use-pep517,
779
+ probably using either the PIP_NO_USE_PEP517 environment variable
780
+ or the "no-use-pep517" config file option. Use an appropriate value
781
+ of the PIP_USE_PEP517 environment variable or the "use-pep517"
782
+ config file option instead.
783
+ """
784
+ raise_option_error(parser, option=option, msg=msg)
785
+
786
+ # If user doesn't wish to use pep517, we check if setuptools and wheel are installed
787
+ # and raise error if it is not.
788
+ packages = ("setuptools", "wheel")
789
+ if not all(importlib.util.find_spec(package) for package in packages):
790
+ msg = (
791
+ f"It is not possible to use --no-use-pep517 "
792
+ f"without {' and '.join(packages)} installed."
793
+ )
794
+ raise_option_error(parser, option=option, msg=msg)
795
+
796
+ # Otherwise, --no-use-pep517 was passed via the command-line.
797
+ parser.values.use_pep517 = False
798
+
799
+
800
+ use_pep517: Any = partial(
801
+ Option,
802
+ "--use-pep517",
803
+ dest="use_pep517",
804
+ action="store_true",
805
+ default=None,
806
+ help="Use PEP 517 for building source distributions "
807
+ "(use --no-use-pep517 to force legacy behaviour).",
808
+ )
809
+
810
+ no_use_pep517: Any = partial(
811
+ Option,
812
+ "--no-use-pep517",
813
+ dest="use_pep517",
814
+ action="callback",
815
+ callback=_handle_no_use_pep517,
816
+ default=None,
817
+ help=SUPPRESS_HELP,
818
+ )
819
+
820
+
821
+ def _handle_config_settings(
822
+ option: Option, opt_str: str, value: str, parser: OptionParser
823
+ ) -> None:
824
+ key, sep, val = value.partition("=")
825
+ if sep != "=":
826
+ parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") # noqa
827
+ dest = getattr(parser.values, option.dest)
828
+ if dest is None:
829
+ dest = {}
830
+ setattr(parser.values, option.dest, dest)
831
+ if key in dest:
832
+ if isinstance(dest[key], list):
833
+ dest[key].append(val)
834
+ else:
835
+ dest[key] = [dest[key], val]
836
+ else:
837
+ dest[key] = val
838
+
839
+
840
+ config_settings: Callable[..., Option] = partial(
841
+ Option,
842
+ "-C",
843
+ "--config-settings",
844
+ dest="config_settings",
845
+ type=str,
846
+ action="callback",
847
+ callback=_handle_config_settings,
848
+ metavar="settings",
849
+ help="Configuration settings to be passed to the PEP 517 build backend. "
850
+ "Settings take the form KEY=VALUE. Use multiple --config-settings options "
851
+ "to pass multiple keys to the backend.",
852
+ )
853
+
854
+ build_options: Callable[..., Option] = partial(
855
+ Option,
856
+ "--build-option",
857
+ dest="build_options",
858
+ metavar="options",
859
+ action="append",
860
+ help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
861
+ )
862
+
863
+ global_options: Callable[..., Option] = partial(
864
+ Option,
865
+ "--global-option",
866
+ dest="global_options",
867
+ action="append",
868
+ metavar="options",
869
+ help="Extra global options to be supplied to the setup.py "
870
+ "call before the install or bdist_wheel command.",
871
+ )
872
+
873
+ no_clean: Callable[..., Option] = partial(
874
+ Option,
875
+ "--no-clean",
876
+ action="store_true",
877
+ default=False,
878
+ help="Don't clean up build directories.",
879
+ )
880
+
881
+ pre: Callable[..., Option] = partial(
882
+ Option,
883
+ "--pre",
884
+ action="store_true",
885
+ default=False,
886
+ help="Include pre-release and development versions. By default, "
887
+ "pip only finds stable versions.",
888
+ )
889
+
890
+ disable_pip_version_check: Callable[..., Option] = partial(
891
+ Option,
892
+ "--disable-pip-version-check",
893
+ dest="disable_pip_version_check",
894
+ action="store_true",
895
+ default=False,
896
+ help="Don't periodically check PyPI to determine whether a new version "
897
+ "of pip is available for download. Implied with --no-index.",
898
+ )
899
+
900
+ root_user_action: Callable[..., Option] = partial(
901
+ Option,
902
+ "--root-user-action",
903
+ dest="root_user_action",
904
+ default="warn",
905
+ choices=["warn", "ignore"],
906
+ help="Action if pip is run as a root user. By default, a warning message is shown.",
907
+ )
908
+
909
+
910
+ def _handle_merge_hash(
911
+ option: Option, opt_str: str, value: str, parser: OptionParser
912
+ ) -> None:
913
+ """Given a value spelled "algo:digest", append the digest to a list
914
+ pointed to in a dict by the algo name."""
915
+ if not parser.values.hashes:
916
+ parser.values.hashes = {}
917
+ try:
918
+ algo, digest = value.split(":", 1)
919
+ except ValueError:
920
+ parser.error(
921
+ "Arguments to {} must be a hash name " # noqa
922
+ "followed by a value, like --hash=sha256:"
923
+ "abcde...".format(opt_str)
924
+ )
925
+ if algo not in STRONG_HASHES:
926
+ parser.error(
927
+ "Allowed hash algorithms for {} are {}.".format( # noqa
928
+ opt_str, ", ".join(STRONG_HASHES)
929
+ )
930
+ )
931
+ parser.values.hashes.setdefault(algo, []).append(digest)
932
+
933
+
934
+ hash: Callable[..., Option] = partial(
935
+ Option,
936
+ "--hash",
937
+ # Hash values eventually end up in InstallRequirement.hashes due to
938
+ # __dict__ copying in process_line().
939
+ dest="hashes",
940
+ action="callback",
941
+ callback=_handle_merge_hash,
942
+ type="string",
943
+ help="Verify that the package's archive matches this "
944
+ "hash before installing. Example: --hash=sha256:abcdef...",
945
+ )
946
+
947
+
948
+ require_hashes: Callable[..., Option] = partial(
949
+ Option,
950
+ "--require-hashes",
951
+ dest="require_hashes",
952
+ action="store_true",
953
+ default=False,
954
+ help="Require a hash to check each requirement against, for "
955
+ "repeatable installs. This option is implied when any package in a "
956
+ "requirements file has a --hash option.",
957
+ )
958
+
959
+
960
+ list_path: Callable[..., Option] = partial(
961
+ PipOption,
962
+ "--path",
963
+ dest="path",
964
+ type="path",
965
+ action="append",
966
+ help="Restrict to the specified installation path for listing "
967
+ "packages (can be used multiple times).",
968
+ )
969
+
970
+
971
+ def check_list_path_option(options: Values) -> None:
972
+ if options.path and (options.user or options.local):
973
+ raise CommandError("Cannot combine '--path' with '--user' or '--local'")
974
+
975
+
976
+ list_exclude: Callable[..., Option] = partial(
977
+ PipOption,
978
+ "--exclude",
979
+ dest="excludes",
980
+ action="append",
981
+ metavar="package",
982
+ type="package_name",
983
+ help="Exclude specified package from the output",
984
+ )
985
+
986
+
987
+ no_python_version_warning: Callable[..., Option] = partial(
988
+ Option,
989
+ "--no-python-version-warning",
990
+ dest="no_python_version_warning",
991
+ action="store_true",
992
+ default=False,
993
+ help="Silence deprecation warnings for upcoming unsupported Pythons.",
994
+ )
995
+
996
+
997
+ # Features that are now always on. A warning is printed if they are used.
998
+ ALWAYS_ENABLED_FEATURES = [
999
+ "no-binary-enable-wheel-cache", # always on since 23.1
1000
+ ]
1001
+
1002
+ use_new_feature: Callable[..., Option] = partial(
1003
+ Option,
1004
+ "--use-feature",
1005
+ dest="features_enabled",
1006
+ metavar="feature",
1007
+ action="append",
1008
+ default=[],
1009
+ choices=[
1010
+ "fast-deps",
1011
+ "truststore",
1012
+ ]
1013
+ + ALWAYS_ENABLED_FEATURES,
1014
+ help="Enable new functionality, that may be backward incompatible.",
1015
+ )
1016
+
1017
+ use_deprecated_feature: Callable[..., Option] = partial(
1018
+ Option,
1019
+ "--use-deprecated",
1020
+ dest="deprecated_features_enabled",
1021
+ metavar="feature",
1022
+ action="append",
1023
+ default=[],
1024
+ choices=[
1025
+ "legacy-resolver",
1026
+ ],
1027
+ help=("Enable deprecated functionality, that will be removed in the future."),
1028
+ )
1029
+
1030
+
1031
+ ##########
1032
+ # groups #
1033
+ ##########
1034
+
1035
+ general_group: Dict[str, Any] = {
1036
+ "name": "General Options",
1037
+ "options": [
1038
+ help_,
1039
+ debug_mode,
1040
+ isolated_mode,
1041
+ require_virtualenv,
1042
+ python,
1043
+ verbose,
1044
+ version,
1045
+ quiet,
1046
+ log,
1047
+ no_input,
1048
+ keyring_provider,
1049
+ proxy,
1050
+ retries,
1051
+ timeout,
1052
+ exists_action,
1053
+ trusted_host,
1054
+ cert,
1055
+ client_cert,
1056
+ cache_dir,
1057
+ no_cache,
1058
+ disable_pip_version_check,
1059
+ no_color,
1060
+ no_python_version_warning,
1061
+ use_new_feature,
1062
+ use_deprecated_feature,
1063
+ ],
1064
+ }
1065
+
1066
+ index_group: Dict[str, Any] = {
1067
+ "name": "Package Index Options",
1068
+ "options": [
1069
+ index_url,
1070
+ extra_index_url,
1071
+ no_index,
1072
+ find_links,
1073
+ ],
1074
+ }
.venv/Lib/site-packages/pip/_internal/cli/command_context.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from contextlib import ExitStack, contextmanager
2
+ from typing import ContextManager, Generator, TypeVar
3
+
4
+ _T = TypeVar("_T", covariant=True)
5
+
6
+
7
+ class CommandContextMixIn:
8
+ def __init__(self) -> None:
9
+ super().__init__()
10
+ self._in_main_context = False
11
+ self._main_context = ExitStack()
12
+
13
+ @contextmanager
14
+ def main_context(self) -> Generator[None, None, None]:
15
+ assert not self._in_main_context
16
+
17
+ self._in_main_context = True
18
+ try:
19
+ with self._main_context:
20
+ yield
21
+ finally:
22
+ self._in_main_context = False
23
+
24
+ def enter_context(self, context_provider: ContextManager[_T]) -> _T:
25
+ assert self._in_main_context
26
+
27
+ return self._main_context.enter_context(context_provider)
.venv/Lib/site-packages/pip/_internal/cli/main.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Primary application entrypoint.
2
+ """
3
+ import locale
4
+ import logging
5
+ import os
6
+ import sys
7
+ import warnings
8
+ from typing import List, Optional
9
+
10
+ from pip._internal.cli.autocompletion import autocomplete
11
+ from pip._internal.cli.main_parser import parse_command
12
+ from pip._internal.commands import create_command
13
+ from pip._internal.exceptions import PipError
14
+ from pip._internal.utils import deprecation
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ # Do not import and use main() directly! Using it directly is actively
20
+ # discouraged by pip's maintainers. The name, location and behavior of
21
+ # this function is subject to change, so calling it directly is not
22
+ # portable across different pip versions.
23
+
24
+ # In addition, running pip in-process is unsupported and unsafe. This is
25
+ # elaborated in detail at
26
+ # https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
27
+ # That document also provides suggestions that should work for nearly
28
+ # all users that are considering importing and using main() directly.
29
+
30
+ # However, we know that certain users will still want to invoke pip
31
+ # in-process. If you understand and accept the implications of using pip
32
+ # in an unsupported manner, the best approach is to use runpy to avoid
33
+ # depending on the exact location of this entry point.
34
+
35
+ # The following example shows how to use runpy to invoke pip in that
36
+ # case:
37
+ #
38
+ # sys.argv = ["pip", your, args, here]
39
+ # runpy.run_module("pip", run_name="__main__")
40
+ #
41
+ # Note that this will exit the process after running, unlike a direct
42
+ # call to main. As it is not safe to do any processing after calling
43
+ # main, this should not be an issue in practice.
44
+
45
+
46
+ def main(args: Optional[List[str]] = None) -> int:
47
+ if args is None:
48
+ args = sys.argv[1:]
49
+
50
+ # Suppress the pkg_resources deprecation warning
51
+ # Note - we use a module of .*pkg_resources to cover
52
+ # the normal case (pip._vendor.pkg_resources) and the
53
+ # devendored case (a bare pkg_resources)
54
+ warnings.filterwarnings(
55
+ action="ignore", category=DeprecationWarning, module=".*pkg_resources"
56
+ )
57
+
58
+ # Configure our deprecation warnings to be sent through loggers
59
+ deprecation.install_warning_logger()
60
+
61
+ autocomplete()
62
+
63
+ try:
64
+ cmd_name, cmd_args = parse_command(args)
65
+ except PipError as exc:
66
+ sys.stderr.write(f"ERROR: {exc}")
67
+ sys.stderr.write(os.linesep)
68
+ sys.exit(1)
69
+
70
+ # Needed for locale.getpreferredencoding(False) to work
71
+ # in pip._internal.utils.encoding.auto_decode
72
+ try:
73
+ locale.setlocale(locale.LC_ALL, "")
74
+ except locale.Error as e:
75
+ # setlocale can apparently crash if locale are uninitialized
76
+ logger.debug("Ignoring error %s when setting locale", e)
77
+ command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
78
+
79
+ return command.main(cmd_args)
.venv/Lib/site-packages/pip/_internal/cli/main_parser.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """A single place for constructing and exposing the main parser
2
+ """
3
+
4
+ import os
5
+ import subprocess
6
+ import sys
7
+ from typing import List, Optional, Tuple
8
+
9
+ from pip._internal.build_env import get_runnable_pip
10
+ from pip._internal.cli import cmdoptions
11
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
12
+ from pip._internal.commands import commands_dict, get_similar_commands
13
+ from pip._internal.exceptions import CommandError
14
+ from pip._internal.utils.misc import get_pip_version, get_prog
15
+
16
+ __all__ = ["create_main_parser", "parse_command"]
17
+
18
+
19
+ def create_main_parser() -> ConfigOptionParser:
20
+ """Creates and returns the main parser for pip's CLI"""
21
+
22
+ parser = ConfigOptionParser(
23
+ usage="\n%prog <command> [options]",
24
+ add_help_option=False,
25
+ formatter=UpdatingDefaultsHelpFormatter(),
26
+ name="global",
27
+ prog=get_prog(),
28
+ )
29
+ parser.disable_interspersed_args()
30
+
31
+ parser.version = get_pip_version()
32
+
33
+ # add the general options
34
+ gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
35
+ parser.add_option_group(gen_opts)
36
+
37
+ # so the help formatter knows
38
+ parser.main = True # type: ignore
39
+
40
+ # create command listing for description
41
+ description = [""] + [
42
+ f"{name:27} {command_info.summary}"
43
+ for name, command_info in commands_dict.items()
44
+ ]
45
+ parser.description = "\n".join(description)
46
+
47
+ return parser
48
+
49
+
50
+ def identify_python_interpreter(python: str) -> Optional[str]:
51
+ # If the named file exists, use it.
52
+ # If it's a directory, assume it's a virtual environment and
53
+ # look for the environment's Python executable.
54
+ if os.path.exists(python):
55
+ if os.path.isdir(python):
56
+ # bin/python for Unix, Scripts/python.exe for Windows
57
+ # Try both in case of odd cases like cygwin.
58
+ for exe in ("bin/python", "Scripts/python.exe"):
59
+ py = os.path.join(python, exe)
60
+ if os.path.exists(py):
61
+ return py
62
+ else:
63
+ return python
64
+
65
+ # Could not find the interpreter specified
66
+ return None
67
+
68
+
69
+ def parse_command(args: List[str]) -> Tuple[str, List[str]]:
70
+ parser = create_main_parser()
71
+
72
+ # Note: parser calls disable_interspersed_args(), so the result of this
73
+ # call is to split the initial args into the general options before the
74
+ # subcommand and everything else.
75
+ # For example:
76
+ # args: ['--timeout=5', 'install', '--user', 'INITools']
77
+ # general_options: ['--timeout==5']
78
+ # args_else: ['install', '--user', 'INITools']
79
+ general_options, args_else = parser.parse_args(args)
80
+
81
+ # --python
82
+ if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
83
+ # Re-invoke pip using the specified Python interpreter
84
+ interpreter = identify_python_interpreter(general_options.python)
85
+ if interpreter is None:
86
+ raise CommandError(
87
+ f"Could not locate Python interpreter {general_options.python}"
88
+ )
89
+
90
+ pip_cmd = [
91
+ interpreter,
92
+ get_runnable_pip(),
93
+ ]
94
+ pip_cmd.extend(args)
95
+
96
+ # Set a flag so the child doesn't re-invoke itself, causing
97
+ # an infinite loop.
98
+ os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
99
+ returncode = 0
100
+ try:
101
+ proc = subprocess.run(pip_cmd)
102
+ returncode = proc.returncode
103
+ except (subprocess.SubprocessError, OSError) as exc:
104
+ raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
105
+ sys.exit(returncode)
106
+
107
+ # --version
108
+ if general_options.version:
109
+ sys.stdout.write(parser.version)
110
+ sys.stdout.write(os.linesep)
111
+ sys.exit()
112
+
113
+ # pip || pip help -> print_help()
114
+ if not args_else or (args_else[0] == "help" and len(args_else) == 1):
115
+ parser.print_help()
116
+ sys.exit()
117
+
118
+ # the subcommand name
119
+ cmd_name = args_else[0]
120
+
121
+ if cmd_name not in commands_dict:
122
+ guess = get_similar_commands(cmd_name)
123
+
124
+ msg = [f'unknown command "{cmd_name}"']
125
+ if guess:
126
+ msg.append(f'maybe you meant "{guess}"')
127
+
128
+ raise CommandError(" - ".join(msg))
129
+
130
+ # all the args without the subcommand
131
+ cmd_args = args[:]
132
+ cmd_args.remove(cmd_name)
133
+
134
+ return cmd_name, cmd_args
.venv/Lib/site-packages/pip/_internal/cli/parser.py ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base option parser setup"""
2
+
3
+ import logging
4
+ import optparse
5
+ import shutil
6
+ import sys
7
+ import textwrap
8
+ from contextlib import suppress
9
+ from typing import Any, Dict, Generator, List, Tuple
10
+
11
+ from pip._internal.cli.status_codes import UNKNOWN_ERROR
12
+ from pip._internal.configuration import Configuration, ConfigurationError
13
+ from pip._internal.utils.misc import redact_auth_from_url, strtobool
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
19
+ """A prettier/less verbose help formatter for optparse."""
20
+
21
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
22
+ # help position must be aligned with __init__.parseopts.description
23
+ kwargs["max_help_position"] = 30
24
+ kwargs["indent_increment"] = 1
25
+ kwargs["width"] = shutil.get_terminal_size()[0] - 2
26
+ super().__init__(*args, **kwargs)
27
+
28
+ def format_option_strings(self, option: optparse.Option) -> str:
29
+ return self._format_option_strings(option)
30
+
31
+ def _format_option_strings(
32
+ self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", "
33
+ ) -> str:
34
+ """
35
+ Return a comma-separated list of option strings and metavars.
36
+
37
+ :param option: tuple of (short opt, long opt), e.g: ('-f', '--format')
38
+ :param mvarfmt: metavar format string
39
+ :param optsep: separator
40
+ """
41
+ opts = []
42
+
43
+ if option._short_opts:
44
+ opts.append(option._short_opts[0])
45
+ if option._long_opts:
46
+ opts.append(option._long_opts[0])
47
+ if len(opts) > 1:
48
+ opts.insert(1, optsep)
49
+
50
+ if option.takes_value():
51
+ assert option.dest is not None
52
+ metavar = option.metavar or option.dest.lower()
53
+ opts.append(mvarfmt.format(metavar.lower()))
54
+
55
+ return "".join(opts)
56
+
57
+ def format_heading(self, heading: str) -> str:
58
+ if heading == "Options":
59
+ return ""
60
+ return heading + ":\n"
61
+
62
+ def format_usage(self, usage: str) -> str:
63
+ """
64
+ Ensure there is only one newline between usage and the first heading
65
+ if there is no description.
66
+ """
67
+ msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
68
+ return msg
69
+
70
+ def format_description(self, description: str) -> str:
71
+ # leave full control over description to us
72
+ if description:
73
+ if hasattr(self.parser, "main"):
74
+ label = "Commands"
75
+ else:
76
+ label = "Description"
77
+ # some doc strings have initial newlines, some don't
78
+ description = description.lstrip("\n")
79
+ # some doc strings have final newlines and spaces, some don't
80
+ description = description.rstrip()
81
+ # dedent, then reindent
82
+ description = self.indent_lines(textwrap.dedent(description), " ")
83
+ description = f"{label}:\n{description}\n"
84
+ return description
85
+ else:
86
+ return ""
87
+
88
+ def format_epilog(self, epilog: str) -> str:
89
+ # leave full control over epilog to us
90
+ if epilog:
91
+ return epilog
92
+ else:
93
+ return ""
94
+
95
+ def indent_lines(self, text: str, indent: str) -> str:
96
+ new_lines = [indent + line for line in text.split("\n")]
97
+ return "\n".join(new_lines)
98
+
99
+
100
+ class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
101
+ """Custom help formatter for use in ConfigOptionParser.
102
+
103
+ This is updates the defaults before expanding them, allowing
104
+ them to show up correctly in the help listing.
105
+
106
+ Also redact auth from url type options
107
+ """
108
+
109
+ def expand_default(self, option: optparse.Option) -> str:
110
+ default_values = None
111
+ if self.parser is not None:
112
+ assert isinstance(self.parser, ConfigOptionParser)
113
+ self.parser._update_defaults(self.parser.defaults)
114
+ assert option.dest is not None
115
+ default_values = self.parser.defaults.get(option.dest)
116
+ help_text = super().expand_default(option)
117
+
118
+ if default_values and option.metavar == "URL":
119
+ if isinstance(default_values, str):
120
+ default_values = [default_values]
121
+
122
+ # If its not a list, we should abort and just return the help text
123
+ if not isinstance(default_values, list):
124
+ default_values = []
125
+
126
+ for val in default_values:
127
+ help_text = help_text.replace(val, redact_auth_from_url(val))
128
+
129
+ return help_text
130
+
131
+
132
+ class CustomOptionParser(optparse.OptionParser):
133
+ def insert_option_group(
134
+ self, idx: int, *args: Any, **kwargs: Any
135
+ ) -> optparse.OptionGroup:
136
+ """Insert an OptionGroup at a given position."""
137
+ group = self.add_option_group(*args, **kwargs)
138
+
139
+ self.option_groups.pop()
140
+ self.option_groups.insert(idx, group)
141
+
142
+ return group
143
+
144
+ @property
145
+ def option_list_all(self) -> List[optparse.Option]:
146
+ """Get a list of all options, including those in option groups."""
147
+ res = self.option_list[:]
148
+ for i in self.option_groups:
149
+ res.extend(i.option_list)
150
+
151
+ return res
152
+
153
+
154
+ class ConfigOptionParser(CustomOptionParser):
155
+ """Custom option parser which updates its defaults by checking the
156
+ configuration files and environmental variables"""
157
+
158
+ def __init__(
159
+ self,
160
+ *args: Any,
161
+ name: str,
162
+ isolated: bool = False,
163
+ **kwargs: Any,
164
+ ) -> None:
165
+ self.name = name
166
+ self.config = Configuration(isolated)
167
+
168
+ assert self.name
169
+ super().__init__(*args, **kwargs)
170
+
171
+ def check_default(self, option: optparse.Option, key: str, val: Any) -> Any:
172
+ try:
173
+ return option.check_value(key, val)
174
+ except optparse.OptionValueError as exc:
175
+ print(f"An error occurred during configuration: {exc}")
176
+ sys.exit(3)
177
+
178
+ def _get_ordered_configuration_items(
179
+ self,
180
+ ) -> Generator[Tuple[str, Any], None, None]:
181
+ # Configuration gives keys in an unordered manner. Order them.
182
+ override_order = ["global", self.name, ":env:"]
183
+
184
+ # Pool the options into different groups
185
+ section_items: Dict[str, List[Tuple[str, Any]]] = {
186
+ name: [] for name in override_order
187
+ }
188
+ for section_key, val in self.config.items():
189
+ # ignore empty values
190
+ if not val:
191
+ logger.debug(
192
+ "Ignoring configuration key '%s' as it's value is empty.",
193
+ section_key,
194
+ )
195
+ continue
196
+
197
+ section, key = section_key.split(".", 1)
198
+ if section in override_order:
199
+ section_items[section].append((key, val))
200
+
201
+ # Yield each group in their override order
202
+ for section in override_order:
203
+ for key, val in section_items[section]:
204
+ yield key, val
205
+
206
+ def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]:
207
+ """Updates the given defaults with values from the config files and
208
+ the environ. Does a little special handling for certain types of
209
+ options (lists)."""
210
+
211
+ # Accumulate complex default state.
212
+ self.values = optparse.Values(self.defaults)
213
+ late_eval = set()
214
+ # Then set the options with those values
215
+ for key, val in self._get_ordered_configuration_items():
216
+ # '--' because configuration supports only long names
217
+ option = self.get_option("--" + key)
218
+
219
+ # Ignore options not present in this parser. E.g. non-globals put
220
+ # in [global] by users that want them to apply to all applicable
221
+ # commands.
222
+ if option is None:
223
+ continue
224
+
225
+ assert option.dest is not None
226
+
227
+ if option.action in ("store_true", "store_false"):
228
+ try:
229
+ val = strtobool(val)
230
+ except ValueError:
231
+ self.error(
232
+ "{} is not a valid value for {} option, " # noqa
233
+ "please specify a boolean value like yes/no, "
234
+ "true/false or 1/0 instead.".format(val, key)
235
+ )
236
+ elif option.action == "count":
237
+ with suppress(ValueError):
238
+ val = strtobool(val)
239
+ with suppress(ValueError):
240
+ val = int(val)
241
+ if not isinstance(val, int) or val < 0:
242
+ self.error(
243
+ "{} is not a valid value for {} option, " # noqa
244
+ "please instead specify either a non-negative integer "
245
+ "or a boolean value like yes/no or false/true "
246
+ "which is equivalent to 1/0.".format(val, key)
247
+ )
248
+ elif option.action == "append":
249
+ val = val.split()
250
+ val = [self.check_default(option, key, v) for v in val]
251
+ elif option.action == "callback":
252
+ assert option.callback is not None
253
+ late_eval.add(option.dest)
254
+ opt_str = option.get_opt_string()
255
+ val = option.convert_value(opt_str, val)
256
+ # From take_action
257
+ args = option.callback_args or ()
258
+ kwargs = option.callback_kwargs or {}
259
+ option.callback(option, opt_str, val, self, *args, **kwargs)
260
+ else:
261
+ val = self.check_default(option, key, val)
262
+
263
+ defaults[option.dest] = val
264
+
265
+ for key in late_eval:
266
+ defaults[key] = getattr(self.values, key)
267
+ self.values = None
268
+ return defaults
269
+
270
+ def get_default_values(self) -> optparse.Values:
271
+ """Overriding to make updating the defaults after instantiation of
272
+ the option parser possible, _update_defaults() does the dirty work."""
273
+ if not self.process_default_values:
274
+ # Old, pre-Optik 1.5 behaviour.
275
+ return optparse.Values(self.defaults)
276
+
277
+ # Load the configuration, or error out in case of an error
278
+ try:
279
+ self.config.load()
280
+ except ConfigurationError as err:
281
+ self.exit(UNKNOWN_ERROR, str(err))
282
+
283
+ defaults = self._update_defaults(self.defaults.copy()) # ours
284
+ for option in self._get_all_options():
285
+ assert option.dest is not None
286
+ default = defaults.get(option.dest)
287
+ if isinstance(default, str):
288
+ opt_str = option.get_opt_string()
289
+ defaults[option.dest] = option.check_value(opt_str, default)
290
+ return optparse.Values(defaults)
291
+
292
+ def error(self, msg: str) -> None:
293
+ self.print_usage(sys.stderr)
294
+ self.exit(UNKNOWN_ERROR, f"{msg}\n")
.venv/Lib/site-packages/pip/_internal/cli/progress_bars.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import functools
2
+ from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple
3
+
4
+ from pip._vendor.rich.progress import (
5
+ BarColumn,
6
+ DownloadColumn,
7
+ FileSizeColumn,
8
+ Progress,
9
+ ProgressColumn,
10
+ SpinnerColumn,
11
+ TextColumn,
12
+ TimeElapsedColumn,
13
+ TimeRemainingColumn,
14
+ TransferSpeedColumn,
15
+ )
16
+
17
+ from pip._internal.utils.logging import get_indentation
18
+
19
+ DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]]
20
+
21
+
22
+ def _rich_progress_bar(
23
+ iterable: Iterable[bytes],
24
+ *,
25
+ bar_type: str,
26
+ size: int,
27
+ ) -> Generator[bytes, None, None]:
28
+ assert bar_type == "on", "This should only be used in the default mode."
29
+
30
+ if not size:
31
+ total = float("inf")
32
+ columns: Tuple[ProgressColumn, ...] = (
33
+ TextColumn("[progress.description]{task.description}"),
34
+ SpinnerColumn("line", speed=1.5),
35
+ FileSizeColumn(),
36
+ TransferSpeedColumn(),
37
+ TimeElapsedColumn(),
38
+ )
39
+ else:
40
+ total = size
41
+ columns = (
42
+ TextColumn("[progress.description]{task.description}"),
43
+ BarColumn(),
44
+ DownloadColumn(),
45
+ TransferSpeedColumn(),
46
+ TextColumn("eta"),
47
+ TimeRemainingColumn(),
48
+ )
49
+
50
+ progress = Progress(*columns, refresh_per_second=30)
51
+ task_id = progress.add_task(" " * (get_indentation() + 2), total=total)
52
+ with progress:
53
+ for chunk in iterable:
54
+ yield chunk
55
+ progress.update(task_id, advance=len(chunk))
56
+
57
+
58
+ def get_download_progress_renderer(
59
+ *, bar_type: str, size: Optional[int] = None
60
+ ) -> DownloadProgressRenderer:
61
+ """Get an object that can be used to render the download progress.
62
+
63
+ Returns a callable, that takes an iterable to "wrap".
64
+ """
65
+ if bar_type == "on":
66
+ return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size)
67
+ else:
68
+ return iter # no-op, when passed an iterator
.venv/Lib/site-packages/pip/_internal/cli/req_command.py ADDED
@@ -0,0 +1,508 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Contains the Command base classes that depend on PipSession.
2
+
3
+ The classes in this module are in a separate module so the commands not
4
+ needing download / PackageFinder capability don't unnecessarily import the
5
+ PackageFinder machinery and all its vendored dependencies, etc.
6
+ """
7
+
8
+ import logging
9
+ import os
10
+ import sys
11
+ from functools import partial
12
+ from optparse import Values
13
+ from typing import TYPE_CHECKING, Any, List, Optional, Tuple
14
+
15
+ from pip._internal.cache import WheelCache
16
+ from pip._internal.cli import cmdoptions
17
+ from pip._internal.cli.base_command import Command
18
+ from pip._internal.cli.command_context import CommandContextMixIn
19
+ from pip._internal.exceptions import CommandError, PreviousBuildDirError
20
+ from pip._internal.index.collector import LinkCollector
21
+ from pip._internal.index.package_finder import PackageFinder
22
+ from pip._internal.models.selection_prefs import SelectionPreferences
23
+ from pip._internal.models.target_python import TargetPython
24
+ from pip._internal.network.session import PipSession
25
+ from pip._internal.operations.build.build_tracker import BuildTracker
26
+ from pip._internal.operations.prepare import RequirementPreparer
27
+ from pip._internal.req.constructors import (
28
+ install_req_from_editable,
29
+ install_req_from_line,
30
+ install_req_from_parsed_requirement,
31
+ install_req_from_req_string,
32
+ )
33
+ from pip._internal.req.req_file import parse_requirements
34
+ from pip._internal.req.req_install import InstallRequirement
35
+ from pip._internal.resolution.base import BaseResolver
36
+ from pip._internal.self_outdated_check import pip_self_version_check
37
+ from pip._internal.utils.temp_dir import (
38
+ TempDirectory,
39
+ TempDirectoryTypeRegistry,
40
+ tempdir_kinds,
41
+ )
42
+ from pip._internal.utils.virtualenv import running_under_virtualenv
43
+
44
+ if TYPE_CHECKING:
45
+ from ssl import SSLContext
46
+
47
+ logger = logging.getLogger(__name__)
48
+
49
+
50
+ def _create_truststore_ssl_context() -> Optional["SSLContext"]:
51
+ if sys.version_info < (3, 10):
52
+ raise CommandError("The truststore feature is only available for Python 3.10+")
53
+
54
+ try:
55
+ import ssl
56
+ except ImportError:
57
+ logger.warning("Disabling truststore since ssl support is missing")
58
+ return None
59
+
60
+ try:
61
+ import truststore
62
+ except ImportError:
63
+ raise CommandError(
64
+ "To use the truststore feature, 'truststore' must be installed into "
65
+ "pip's current environment."
66
+ )
67
+
68
+ return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
69
+
70
+
71
+ class SessionCommandMixin(CommandContextMixIn):
72
+
73
+ """
74
+ A class mixin for command classes needing _build_session().
75
+ """
76
+
77
+ def __init__(self) -> None:
78
+ super().__init__()
79
+ self._session: Optional[PipSession] = None
80
+
81
+ @classmethod
82
+ def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
83
+ """Return a list of index urls from user-provided options."""
84
+ index_urls = []
85
+ if not getattr(options, "no_index", False):
86
+ url = getattr(options, "index_url", None)
87
+ if url:
88
+ index_urls.append(url)
89
+ urls = getattr(options, "extra_index_urls", None)
90
+ if urls:
91
+ index_urls.extend(urls)
92
+ # Return None rather than an empty list
93
+ return index_urls or None
94
+
95
+ def get_default_session(self, options: Values) -> PipSession:
96
+ """Get a default-managed session."""
97
+ if self._session is None:
98
+ self._session = self.enter_context(self._build_session(options))
99
+ # there's no type annotation on requests.Session, so it's
100
+ # automatically ContextManager[Any] and self._session becomes Any,
101
+ # then https://github.com/python/mypy/issues/7696 kicks in
102
+ assert self._session is not None
103
+ return self._session
104
+
105
+ def _build_session(
106
+ self,
107
+ options: Values,
108
+ retries: Optional[int] = None,
109
+ timeout: Optional[int] = None,
110
+ fallback_to_certifi: bool = False,
111
+ ) -> PipSession:
112
+ cache_dir = options.cache_dir
113
+ assert not cache_dir or os.path.isabs(cache_dir)
114
+
115
+ if "truststore" in options.features_enabled:
116
+ try:
117
+ ssl_context = _create_truststore_ssl_context()
118
+ except Exception:
119
+ if not fallback_to_certifi:
120
+ raise
121
+ ssl_context = None
122
+ else:
123
+ ssl_context = None
124
+
125
+ session = PipSession(
126
+ cache=os.path.join(cache_dir, "http") if cache_dir else None,
127
+ retries=retries if retries is not None else options.retries,
128
+ trusted_hosts=options.trusted_hosts,
129
+ index_urls=self._get_index_urls(options),
130
+ ssl_context=ssl_context,
131
+ )
132
+
133
+ # Handle custom ca-bundles from the user
134
+ if options.cert:
135
+ session.verify = options.cert
136
+
137
+ # Handle SSL client certificate
138
+ if options.client_cert:
139
+ session.cert = options.client_cert
140
+
141
+ # Handle timeouts
142
+ if options.timeout or timeout:
143
+ session.timeout = timeout if timeout is not None else options.timeout
144
+
145
+ # Handle configured proxies
146
+ if options.proxy:
147
+ session.proxies = {
148
+ "http": options.proxy,
149
+ "https": options.proxy,
150
+ }
151
+
152
+ # Determine if we can prompt the user for authentication or not
153
+ session.auth.prompting = not options.no_input
154
+ session.auth.keyring_provider = options.keyring_provider
155
+
156
+ return session
157
+
158
+
159
+ class IndexGroupCommand(Command, SessionCommandMixin):
160
+
161
+ """
162
+ Abstract base class for commands with the index_group options.
163
+
164
+ This also corresponds to the commands that permit the pip version check.
165
+ """
166
+
167
+ def handle_pip_version_check(self, options: Values) -> None:
168
+ """
169
+ Do the pip version check if not disabled.
170
+
171
+ This overrides the default behavior of not doing the check.
172
+ """
173
+ # Make sure the index_group options are present.
174
+ assert hasattr(options, "no_index")
175
+
176
+ if options.disable_pip_version_check or options.no_index:
177
+ return
178
+
179
+ # Otherwise, check if we're using the latest version of pip available.
180
+ session = self._build_session(
181
+ options,
182
+ retries=0,
183
+ timeout=min(5, options.timeout),
184
+ # This is set to ensure the function does not fail when truststore is
185
+ # specified in use-feature but cannot be loaded. This usually raises a
186
+ # CommandError and shows a nice user-facing error, but this function is not
187
+ # called in that try-except block.
188
+ fallback_to_certifi=True,
189
+ )
190
+ with session:
191
+ pip_self_version_check(session, options)
192
+
193
+
194
+ KEEPABLE_TEMPDIR_TYPES = [
195
+ tempdir_kinds.BUILD_ENV,
196
+ tempdir_kinds.EPHEM_WHEEL_CACHE,
197
+ tempdir_kinds.REQ_BUILD,
198
+ ]
199
+
200
+
201
+ def warn_if_run_as_root() -> None:
202
+ """Output a warning for sudo users on Unix.
203
+
204
+ In a virtual environment, sudo pip still writes to virtualenv.
205
+ On Windows, users may run pip as Administrator without issues.
206
+ This warning only applies to Unix root users outside of virtualenv.
207
+ """
208
+ if running_under_virtualenv():
209
+ return
210
+ if not hasattr(os, "getuid"):
211
+ return
212
+ # On Windows, there are no "system managed" Python packages. Installing as
213
+ # Administrator via pip is the correct way of updating system environments.
214
+ #
215
+ # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
216
+ # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
217
+ if sys.platform == "win32" or sys.platform == "cygwin":
218
+ return
219
+
220
+ if os.getuid() != 0:
221
+ return
222
+
223
+ logger.warning(
224
+ "Running pip as the 'root' user can result in broken permissions and "
225
+ "conflicting behaviour with the system package manager. "
226
+ "It is recommended to use a virtual environment instead: "
227
+ "https://pip.pypa.io/warnings/venv"
228
+ )
229
+
230
+
231
+ def with_cleanup(func: Any) -> Any:
232
+ """Decorator for common logic related to managing temporary
233
+ directories.
234
+ """
235
+
236
+ def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None:
237
+ for t in KEEPABLE_TEMPDIR_TYPES:
238
+ registry.set_delete(t, False)
239
+
240
+ def wrapper(
241
+ self: RequirementCommand, options: Values, args: List[Any]
242
+ ) -> Optional[int]:
243
+ assert self.tempdir_registry is not None
244
+ if options.no_clean:
245
+ configure_tempdir_registry(self.tempdir_registry)
246
+
247
+ try:
248
+ return func(self, options, args)
249
+ except PreviousBuildDirError:
250
+ # This kind of conflict can occur when the user passes an explicit
251
+ # build directory with a pre-existing folder. In that case we do
252
+ # not want to accidentally remove it.
253
+ configure_tempdir_registry(self.tempdir_registry)
254
+ raise
255
+
256
+ return wrapper
257
+
258
+
259
+ class RequirementCommand(IndexGroupCommand):
260
+ def __init__(self, *args: Any, **kw: Any) -> None:
261
+ super().__init__(*args, **kw)
262
+
263
+ self.cmd_opts.add_option(cmdoptions.no_clean())
264
+
265
+ @staticmethod
266
+ def determine_resolver_variant(options: Values) -> str:
267
+ """Determines which resolver should be used, based on the given options."""
268
+ if "legacy-resolver" in options.deprecated_features_enabled:
269
+ return "legacy"
270
+
271
+ return "2020-resolver"
272
+
273
+ @classmethod
274
+ def make_requirement_preparer(
275
+ cls,
276
+ temp_build_dir: TempDirectory,
277
+ options: Values,
278
+ build_tracker: BuildTracker,
279
+ session: PipSession,
280
+ finder: PackageFinder,
281
+ use_user_site: bool,
282
+ download_dir: Optional[str] = None,
283
+ verbosity: int = 0,
284
+ ) -> RequirementPreparer:
285
+ """
286
+ Create a RequirementPreparer instance for the given parameters.
287
+ """
288
+ temp_build_dir_path = temp_build_dir.path
289
+ assert temp_build_dir_path is not None
290
+ legacy_resolver = False
291
+
292
+ resolver_variant = cls.determine_resolver_variant(options)
293
+ if resolver_variant == "2020-resolver":
294
+ lazy_wheel = "fast-deps" in options.features_enabled
295
+ if lazy_wheel:
296
+ logger.warning(
297
+ "pip is using lazily downloaded wheels using HTTP "
298
+ "range requests to obtain dependency information. "
299
+ "This experimental feature is enabled through "
300
+ "--use-feature=fast-deps and it is not ready for "
301
+ "production."
302
+ )
303
+ else:
304
+ legacy_resolver = True
305
+ lazy_wheel = False
306
+ if "fast-deps" in options.features_enabled:
307
+ logger.warning(
308
+ "fast-deps has no effect when used with the legacy resolver."
309
+ )
310
+
311
+ return RequirementPreparer(
312
+ build_dir=temp_build_dir_path,
313
+ src_dir=options.src_dir,
314
+ download_dir=download_dir,
315
+ build_isolation=options.build_isolation,
316
+ check_build_deps=options.check_build_deps,
317
+ build_tracker=build_tracker,
318
+ session=session,
319
+ progress_bar=options.progress_bar,
320
+ finder=finder,
321
+ require_hashes=options.require_hashes,
322
+ use_user_site=use_user_site,
323
+ lazy_wheel=lazy_wheel,
324
+ verbosity=verbosity,
325
+ legacy_resolver=legacy_resolver,
326
+ )
327
+
328
+ @classmethod
329
+ def make_resolver(
330
+ cls,
331
+ preparer: RequirementPreparer,
332
+ finder: PackageFinder,
333
+ options: Values,
334
+ wheel_cache: Optional[WheelCache] = None,
335
+ use_user_site: bool = False,
336
+ ignore_installed: bool = True,
337
+ ignore_requires_python: bool = False,
338
+ force_reinstall: bool = False,
339
+ upgrade_strategy: str = "to-satisfy-only",
340
+ use_pep517: Optional[bool] = None,
341
+ py_version_info: Optional[Tuple[int, ...]] = None,
342
+ ) -> BaseResolver:
343
+ """
344
+ Create a Resolver instance for the given parameters.
345
+ """
346
+ make_install_req = partial(
347
+ install_req_from_req_string,
348
+ isolated=options.isolated_mode,
349
+ use_pep517=use_pep517,
350
+ )
351
+ resolver_variant = cls.determine_resolver_variant(options)
352
+ # The long import name and duplicated invocation is needed to convince
353
+ # Mypy into correctly typechecking. Otherwise it would complain the
354
+ # "Resolver" class being redefined.
355
+ if resolver_variant == "2020-resolver":
356
+ import pip._internal.resolution.resolvelib.resolver
357
+
358
+ return pip._internal.resolution.resolvelib.resolver.Resolver(
359
+ preparer=preparer,
360
+ finder=finder,
361
+ wheel_cache=wheel_cache,
362
+ make_install_req=make_install_req,
363
+ use_user_site=use_user_site,
364
+ ignore_dependencies=options.ignore_dependencies,
365
+ ignore_installed=ignore_installed,
366
+ ignore_requires_python=ignore_requires_python,
367
+ force_reinstall=force_reinstall,
368
+ upgrade_strategy=upgrade_strategy,
369
+ py_version_info=py_version_info,
370
+ )
371
+ import pip._internal.resolution.legacy.resolver
372
+
373
+ return pip._internal.resolution.legacy.resolver.Resolver(
374
+ preparer=preparer,
375
+ finder=finder,
376
+ wheel_cache=wheel_cache,
377
+ make_install_req=make_install_req,
378
+ use_user_site=use_user_site,
379
+ ignore_dependencies=options.ignore_dependencies,
380
+ ignore_installed=ignore_installed,
381
+ ignore_requires_python=ignore_requires_python,
382
+ force_reinstall=force_reinstall,
383
+ upgrade_strategy=upgrade_strategy,
384
+ py_version_info=py_version_info,
385
+ )
386
+
387
+ def get_requirements(
388
+ self,
389
+ args: List[str],
390
+ options: Values,
391
+ finder: PackageFinder,
392
+ session: PipSession,
393
+ ) -> List[InstallRequirement]:
394
+ """
395
+ Parse command-line arguments into the corresponding requirements.
396
+ """
397
+ requirements: List[InstallRequirement] = []
398
+ for filename in options.constraints:
399
+ for parsed_req in parse_requirements(
400
+ filename,
401
+ constraint=True,
402
+ finder=finder,
403
+ options=options,
404
+ session=session,
405
+ ):
406
+ req_to_add = install_req_from_parsed_requirement(
407
+ parsed_req,
408
+ isolated=options.isolated_mode,
409
+ user_supplied=False,
410
+ )
411
+ requirements.append(req_to_add)
412
+
413
+ for req in args:
414
+ req_to_add = install_req_from_line(
415
+ req,
416
+ comes_from=None,
417
+ isolated=options.isolated_mode,
418
+ use_pep517=options.use_pep517,
419
+ user_supplied=True,
420
+ config_settings=getattr(options, "config_settings", None),
421
+ )
422
+ requirements.append(req_to_add)
423
+
424
+ for req in options.editables:
425
+ req_to_add = install_req_from_editable(
426
+ req,
427
+ user_supplied=True,
428
+ isolated=options.isolated_mode,
429
+ use_pep517=options.use_pep517,
430
+ config_settings=getattr(options, "config_settings", None),
431
+ )
432
+ requirements.append(req_to_add)
433
+
434
+ # NOTE: options.require_hashes may be set if --require-hashes is True
435
+ for filename in options.requirements:
436
+ for parsed_req in parse_requirements(
437
+ filename, finder=finder, options=options, session=session
438
+ ):
439
+ req_to_add = install_req_from_parsed_requirement(
440
+ parsed_req,
441
+ isolated=options.isolated_mode,
442
+ use_pep517=options.use_pep517,
443
+ user_supplied=True,
444
+ config_settings=parsed_req.options.get("config_settings")
445
+ if parsed_req.options
446
+ else None,
447
+ )
448
+ requirements.append(req_to_add)
449
+
450
+ # If any requirement has hash options, enable hash checking.
451
+ if any(req.has_hash_options for req in requirements):
452
+ options.require_hashes = True
453
+
454
+ if not (args or options.editables or options.requirements):
455
+ opts = {"name": self.name}
456
+ if options.find_links:
457
+ raise CommandError(
458
+ "You must give at least one requirement to {name} "
459
+ '(maybe you meant "pip {name} {links}"?)'.format(
460
+ **dict(opts, links=" ".join(options.find_links))
461
+ )
462
+ )
463
+ else:
464
+ raise CommandError(
465
+ "You must give at least one requirement to {name} "
466
+ '(see "pip help {name}")'.format(**opts)
467
+ )
468
+
469
+ return requirements
470
+
471
+ @staticmethod
472
+ def trace_basic_info(finder: PackageFinder) -> None:
473
+ """
474
+ Trace basic information about the provided objects.
475
+ """
476
+ # Display where finder is looking for packages
477
+ search_scope = finder.search_scope
478
+ locations = search_scope.get_formatted_locations()
479
+ if locations:
480
+ logger.info(locations)
481
+
482
+ def _build_package_finder(
483
+ self,
484
+ options: Values,
485
+ session: PipSession,
486
+ target_python: Optional[TargetPython] = None,
487
+ ignore_requires_python: Optional[bool] = None,
488
+ ) -> PackageFinder:
489
+ """
490
+ Create a package finder appropriate to this requirement command.
491
+
492
+ :param ignore_requires_python: Whether to ignore incompatible
493
+ "Requires-Python" values in links. Defaults to False.
494
+ """
495
+ link_collector = LinkCollector.create(session, options=options)
496
+ selection_prefs = SelectionPreferences(
497
+ allow_yanked=True,
498
+ format_control=options.format_control,
499
+ allow_all_prereleases=options.pre,
500
+ prefer_binary=options.prefer_binary,
501
+ ignore_requires_python=ignore_requires_python,
502
+ )
503
+
504
+ return PackageFinder.create(
505
+ link_collector=link_collector,
506
+ selection_prefs=selection_prefs,
507
+ target_python=target_python,
508
+ )
.venv/Lib/site-packages/pip/_internal/cli/spinners.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import contextlib
2
+ import itertools
3
+ import logging
4
+ import sys
5
+ import time
6
+ from typing import IO, Generator, Optional
7
+
8
+ from pip._internal.utils.compat import WINDOWS
9
+ from pip._internal.utils.logging import get_indentation
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class SpinnerInterface:
15
+ def spin(self) -> None:
16
+ raise NotImplementedError()
17
+
18
+ def finish(self, final_status: str) -> None:
19
+ raise NotImplementedError()
20
+
21
+
22
+ class InteractiveSpinner(SpinnerInterface):
23
+ def __init__(
24
+ self,
25
+ message: str,
26
+ file: Optional[IO[str]] = None,
27
+ spin_chars: str = "-\\|/",
28
+ # Empirically, 8 updates/second looks nice
29
+ min_update_interval_seconds: float = 0.125,
30
+ ):
31
+ self._message = message
32
+ if file is None:
33
+ file = sys.stdout
34
+ self._file = file
35
+ self._rate_limiter = RateLimiter(min_update_interval_seconds)
36
+ self._finished = False
37
+
38
+ self._spin_cycle = itertools.cycle(spin_chars)
39
+
40
+ self._file.write(" " * get_indentation() + self._message + " ... ")
41
+ self._width = 0
42
+
43
+ def _write(self, status: str) -> None:
44
+ assert not self._finished
45
+ # Erase what we wrote before by backspacing to the beginning, writing
46
+ # spaces to overwrite the old text, and then backspacing again
47
+ backup = "\b" * self._width
48
+ self._file.write(backup + " " * self._width + backup)
49
+ # Now we have a blank slate to add our status
50
+ self._file.write(status)
51
+ self._width = len(status)
52
+ self._file.flush()
53
+ self._rate_limiter.reset()
54
+
55
+ def spin(self) -> None:
56
+ if self._finished:
57
+ return
58
+ if not self._rate_limiter.ready():
59
+ return
60
+ self._write(next(self._spin_cycle))
61
+
62
+ def finish(self, final_status: str) -> None:
63
+ if self._finished:
64
+ return
65
+ self._write(final_status)
66
+ self._file.write("\n")
67
+ self._file.flush()
68
+ self._finished = True
69
+
70
+
71
+ # Used for dumb terminals, non-interactive installs (no tty), etc.
72
+ # We still print updates occasionally (once every 60 seconds by default) to
73
+ # act as a keep-alive for systems like Travis-CI that take lack-of-output as
74
+ # an indication that a task has frozen.
75
+ class NonInteractiveSpinner(SpinnerInterface):
76
+ def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None:
77
+ self._message = message
78
+ self._finished = False
79
+ self._rate_limiter = RateLimiter(min_update_interval_seconds)
80
+ self._update("started")
81
+
82
+ def _update(self, status: str) -> None:
83
+ assert not self._finished
84
+ self._rate_limiter.reset()
85
+ logger.info("%s: %s", self._message, status)
86
+
87
+ def spin(self) -> None:
88
+ if self._finished:
89
+ return
90
+ if not self._rate_limiter.ready():
91
+ return
92
+ self._update("still running...")
93
+
94
+ def finish(self, final_status: str) -> None:
95
+ if self._finished:
96
+ return
97
+ self._update(f"finished with status '{final_status}'")
98
+ self._finished = True
99
+
100
+
101
+ class RateLimiter:
102
+ def __init__(self, min_update_interval_seconds: float) -> None:
103
+ self._min_update_interval_seconds = min_update_interval_seconds
104
+ self._last_update: float = 0
105
+
106
+ def ready(self) -> bool:
107
+ now = time.time()
108
+ delta = now - self._last_update
109
+ return delta >= self._min_update_interval_seconds
110
+
111
+ def reset(self) -> None:
112
+ self._last_update = time.time()
113
+
114
+
115
+ @contextlib.contextmanager
116
+ def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
117
+ # Interactive spinner goes directly to sys.stdout rather than being routed
118
+ # through the logging system, but it acts like it has level INFO,
119
+ # i.e. it's only displayed if we're at level INFO or better.
120
+ # Non-interactive spinner goes through the logging system, so it is always
121
+ # in sync with logging configuration.
122
+ if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
123
+ spinner: SpinnerInterface = InteractiveSpinner(message)
124
+ else:
125
+ spinner = NonInteractiveSpinner(message)
126
+ try:
127
+ with hidden_cursor(sys.stdout):
128
+ yield spinner
129
+ except KeyboardInterrupt:
130
+ spinner.finish("canceled")
131
+ raise
132
+ except Exception:
133
+ spinner.finish("error")
134
+ raise
135
+ else:
136
+ spinner.finish("done")
137
+
138
+
139
+ HIDE_CURSOR = "\x1b[?25l"
140
+ SHOW_CURSOR = "\x1b[?25h"
141
+
142
+
143
+ @contextlib.contextmanager
144
+ def hidden_cursor(file: IO[str]) -> Generator[None, None, None]:
145
+ # The Windows terminal does not support the hide/show cursor ANSI codes,
146
+ # even via colorama. So don't even try.
147
+ if WINDOWS:
148
+ yield
149
+ # We don't want to clutter the output with control characters if we're
150
+ # writing to a file, or if the user is running with --quiet.
151
+ # See https://github.com/pypa/pip/issues/3418
152
+ elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
153
+ yield
154
+ else:
155
+ file.write(HIDE_CURSOR)
156
+ try:
157
+ yield
158
+ finally:
159
+ file.write(SHOW_CURSOR)
.venv/Lib/site-packages/pip/_internal/cli/status_codes.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ SUCCESS = 0
2
+ ERROR = 1
3
+ UNKNOWN_ERROR = 2
4
+ VIRTUALENV_NOT_FOUND = 3
5
+ PREVIOUS_BUILD_DIR_ERROR = 4
6
+ NO_MATCHES_FOUND = 23
.venv/Lib/site-packages/pip/_internal/commands/__init__.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Package containing all pip commands
3
+ """
4
+
5
+ import importlib
6
+ from collections import namedtuple
7
+ from typing import Any, Dict, Optional
8
+
9
+ from pip._internal.cli.base_command import Command
10
+
11
+ CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary")
12
+
13
+ # This dictionary does a bunch of heavy lifting for help output:
14
+ # - Enables avoiding additional (costly) imports for presenting `--help`.
15
+ # - The ordering matters for help display.
16
+ #
17
+ # Even though the module path starts with the same "pip._internal.commands"
18
+ # prefix, the full path makes testing easier (specifically when modifying
19
+ # `commands_dict` in test setup / teardown).
20
+ commands_dict: Dict[str, CommandInfo] = {
21
+ "install": CommandInfo(
22
+ "pip._internal.commands.install",
23
+ "InstallCommand",
24
+ "Install packages.",
25
+ ),
26
+ "download": CommandInfo(
27
+ "pip._internal.commands.download",
28
+ "DownloadCommand",
29
+ "Download packages.",
30
+ ),
31
+ "uninstall": CommandInfo(
32
+ "pip._internal.commands.uninstall",
33
+ "UninstallCommand",
34
+ "Uninstall packages.",
35
+ ),
36
+ "freeze": CommandInfo(
37
+ "pip._internal.commands.freeze",
38
+ "FreezeCommand",
39
+ "Output installed packages in requirements format.",
40
+ ),
41
+ "inspect": CommandInfo(
42
+ "pip._internal.commands.inspect",
43
+ "InspectCommand",
44
+ "Inspect the python environment.",
45
+ ),
46
+ "list": CommandInfo(
47
+ "pip._internal.commands.list",
48
+ "ListCommand",
49
+ "List installed packages.",
50
+ ),
51
+ "show": CommandInfo(
52
+ "pip._internal.commands.show",
53
+ "ShowCommand",
54
+ "Show information about installed packages.",
55
+ ),
56
+ "check": CommandInfo(
57
+ "pip._internal.commands.check",
58
+ "CheckCommand",
59
+ "Verify installed packages have compatible dependencies.",
60
+ ),
61
+ "config": CommandInfo(
62
+ "pip._internal.commands.configuration",
63
+ "ConfigurationCommand",
64
+ "Manage local and global configuration.",
65
+ ),
66
+ "search": CommandInfo(
67
+ "pip._internal.commands.search",
68
+ "SearchCommand",
69
+ "Search PyPI for packages.",
70
+ ),
71
+ "cache": CommandInfo(
72
+ "pip._internal.commands.cache",
73
+ "CacheCommand",
74
+ "Inspect and manage pip's wheel cache.",
75
+ ),
76
+ "index": CommandInfo(
77
+ "pip._internal.commands.index",
78
+ "IndexCommand",
79
+ "Inspect information available from package indexes.",
80
+ ),
81
+ "wheel": CommandInfo(
82
+ "pip._internal.commands.wheel",
83
+ "WheelCommand",
84
+ "Build wheels from your requirements.",
85
+ ),
86
+ "hash": CommandInfo(
87
+ "pip._internal.commands.hash",
88
+ "HashCommand",
89
+ "Compute hashes of package archives.",
90
+ ),
91
+ "completion": CommandInfo(
92
+ "pip._internal.commands.completion",
93
+ "CompletionCommand",
94
+ "A helper command used for command completion.",
95
+ ),
96
+ "debug": CommandInfo(
97
+ "pip._internal.commands.debug",
98
+ "DebugCommand",
99
+ "Show information useful for debugging.",
100
+ ),
101
+ "help": CommandInfo(
102
+ "pip._internal.commands.help",
103
+ "HelpCommand",
104
+ "Show help for commands.",
105
+ ),
106
+ }
107
+
108
+
109
+ def create_command(name: str, **kwargs: Any) -> Command:
110
+ """
111
+ Create an instance of the Command class with the given name.
112
+ """
113
+ module_path, class_name, summary = commands_dict[name]
114
+ module = importlib.import_module(module_path)
115
+ command_class = getattr(module, class_name)
116
+ command = command_class(name=name, summary=summary, **kwargs)
117
+
118
+ return command
119
+
120
+
121
+ def get_similar_commands(name: str) -> Optional[str]:
122
+ """Command name auto-correct."""
123
+ from difflib import get_close_matches
124
+
125
+ name = name.lower()
126
+
127
+ close_commands = get_close_matches(name, commands_dict.keys())
128
+
129
+ if close_commands:
130
+ return close_commands[0]
131
+ else:
132
+ return None
.venv/Lib/site-packages/pip/_internal/commands/cache.py ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import textwrap
3
+ from optparse import Values
4
+ from typing import Any, List
5
+
6
+ import pip._internal.utils.filesystem as filesystem
7
+ from pip._internal.cli.base_command import Command
8
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
9
+ from pip._internal.exceptions import CommandError, PipError
10
+ from pip._internal.utils.logging import getLogger
11
+
12
+ logger = getLogger(__name__)
13
+
14
+
15
+ class CacheCommand(Command):
16
+ """
17
+ Inspect and manage pip's wheel cache.
18
+
19
+ Subcommands:
20
+
21
+ - dir: Show the cache directory.
22
+ - info: Show information about the cache.
23
+ - list: List filenames of packages stored in the cache.
24
+ - remove: Remove one or more package from the cache.
25
+ - purge: Remove all items from the cache.
26
+
27
+ ``<pattern>`` can be a glob expression or a package name.
28
+ """
29
+
30
+ ignore_require_venv = True
31
+ usage = """
32
+ %prog dir
33
+ %prog info
34
+ %prog list [<pattern>] [--format=[human, abspath]]
35
+ %prog remove <pattern>
36
+ %prog purge
37
+ """
38
+
39
+ def add_options(self) -> None:
40
+ self.cmd_opts.add_option(
41
+ "--format",
42
+ action="store",
43
+ dest="list_format",
44
+ default="human",
45
+ choices=("human", "abspath"),
46
+ help="Select the output format among: human (default) or abspath",
47
+ )
48
+
49
+ self.parser.insert_option_group(0, self.cmd_opts)
50
+
51
+ def run(self, options: Values, args: List[str]) -> int:
52
+ handlers = {
53
+ "dir": self.get_cache_dir,
54
+ "info": self.get_cache_info,
55
+ "list": self.list_cache_items,
56
+ "remove": self.remove_cache_items,
57
+ "purge": self.purge_cache,
58
+ }
59
+
60
+ if not options.cache_dir:
61
+ logger.error("pip cache commands can not function since cache is disabled.")
62
+ return ERROR
63
+
64
+ # Determine action
65
+ if not args or args[0] not in handlers:
66
+ logger.error(
67
+ "Need an action (%s) to perform.",
68
+ ", ".join(sorted(handlers)),
69
+ )
70
+ return ERROR
71
+
72
+ action = args[0]
73
+
74
+ # Error handling happens here, not in the action-handlers.
75
+ try:
76
+ handlers[action](options, args[1:])
77
+ except PipError as e:
78
+ logger.error(e.args[0])
79
+ return ERROR
80
+
81
+ return SUCCESS
82
+
83
+ def get_cache_dir(self, options: Values, args: List[Any]) -> None:
84
+ if args:
85
+ raise CommandError("Too many arguments")
86
+
87
+ logger.info(options.cache_dir)
88
+
89
+ def get_cache_info(self, options: Values, args: List[Any]) -> None:
90
+ if args:
91
+ raise CommandError("Too many arguments")
92
+
93
+ num_http_files = len(self._find_http_files(options))
94
+ num_packages = len(self._find_wheels(options, "*"))
95
+
96
+ http_cache_location = self._cache_dir(options, "http")
97
+ wheels_cache_location = self._cache_dir(options, "wheels")
98
+ http_cache_size = filesystem.format_directory_size(http_cache_location)
99
+ wheels_cache_size = filesystem.format_directory_size(wheels_cache_location)
100
+
101
+ message = (
102
+ textwrap.dedent(
103
+ """
104
+ Package index page cache location: {http_cache_location}
105
+ Package index page cache size: {http_cache_size}
106
+ Number of HTTP files: {num_http_files}
107
+ Locally built wheels location: {wheels_cache_location}
108
+ Locally built wheels size: {wheels_cache_size}
109
+ Number of locally built wheels: {package_count}
110
+ """
111
+ )
112
+ .format(
113
+ http_cache_location=http_cache_location,
114
+ http_cache_size=http_cache_size,
115
+ num_http_files=num_http_files,
116
+ wheels_cache_location=wheels_cache_location,
117
+ package_count=num_packages,
118
+ wheels_cache_size=wheels_cache_size,
119
+ )
120
+ .strip()
121
+ )
122
+
123
+ logger.info(message)
124
+
125
+ def list_cache_items(self, options: Values, args: List[Any]) -> None:
126
+ if len(args) > 1:
127
+ raise CommandError("Too many arguments")
128
+
129
+ if args:
130
+ pattern = args[0]
131
+ else:
132
+ pattern = "*"
133
+
134
+ files = self._find_wheels(options, pattern)
135
+ if options.list_format == "human":
136
+ self.format_for_human(files)
137
+ else:
138
+ self.format_for_abspath(files)
139
+
140
+ def format_for_human(self, files: List[str]) -> None:
141
+ if not files:
142
+ logger.info("No locally built wheels cached.")
143
+ return
144
+
145
+ results = []
146
+ for filename in files:
147
+ wheel = os.path.basename(filename)
148
+ size = filesystem.format_file_size(filename)
149
+ results.append(f" - {wheel} ({size})")
150
+ logger.info("Cache contents:\n")
151
+ logger.info("\n".join(sorted(results)))
152
+
153
+ def format_for_abspath(self, files: List[str]) -> None:
154
+ if not files:
155
+ return
156
+
157
+ results = []
158
+ for filename in files:
159
+ results.append(filename)
160
+
161
+ logger.info("\n".join(sorted(results)))
162
+
163
+ def remove_cache_items(self, options: Values, args: List[Any]) -> None:
164
+ if len(args) > 1:
165
+ raise CommandError("Too many arguments")
166
+
167
+ if not args:
168
+ raise CommandError("Please provide a pattern")
169
+
170
+ files = self._find_wheels(options, args[0])
171
+
172
+ no_matching_msg = "No matching packages"
173
+ if args[0] == "*":
174
+ # Only fetch http files if no specific pattern given
175
+ files += self._find_http_files(options)
176
+ else:
177
+ # Add the pattern to the log message
178
+ no_matching_msg += ' for pattern "{}"'.format(args[0])
179
+
180
+ if not files:
181
+ logger.warning(no_matching_msg)
182
+
183
+ for filename in files:
184
+ os.unlink(filename)
185
+ logger.verbose("Removed %s", filename)
186
+ logger.info("Files removed: %s", len(files))
187
+
188
+ def purge_cache(self, options: Values, args: List[Any]) -> None:
189
+ if args:
190
+ raise CommandError("Too many arguments")
191
+
192
+ return self.remove_cache_items(options, ["*"])
193
+
194
+ def _cache_dir(self, options: Values, subdir: str) -> str:
195
+ return os.path.join(options.cache_dir, subdir)
196
+
197
+ def _find_http_files(self, options: Values) -> List[str]:
198
+ http_dir = self._cache_dir(options, "http")
199
+ return filesystem.find_files(http_dir, "*")
200
+
201
+ def _find_wheels(self, options: Values, pattern: str) -> List[str]:
202
+ wheel_dir = self._cache_dir(options, "wheels")
203
+
204
+ # The wheel filename format, as specified in PEP 427, is:
205
+ # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
206
+ #
207
+ # Additionally, non-alphanumeric values in the distribution are
208
+ # normalized to underscores (_), meaning hyphens can never occur
209
+ # before `-{version}`.
210
+ #
211
+ # Given that information:
212
+ # - If the pattern we're given contains a hyphen (-), the user is
213
+ # providing at least the version. Thus, we can just append `*.whl`
214
+ # to match the rest of it.
215
+ # - If the pattern we're given doesn't contain a hyphen (-), the
216
+ # user is only providing the name. Thus, we append `-*.whl` to
217
+ # match the hyphen before the version, followed by anything else.
218
+ #
219
+ # PEP 427: https://www.python.org/dev/peps/pep-0427/
220
+ pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl")
221
+
222
+ return filesystem.find_files(wheel_dir, pattern)
.venv/Lib/site-packages/pip/_internal/commands/check.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from optparse import Values
3
+ from typing import List
4
+
5
+ from pip._internal.cli.base_command import Command
6
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
7
+ from pip._internal.operations.check import (
8
+ check_package_set,
9
+ create_package_set_from_installed,
10
+ warn_legacy_versions_and_specifiers,
11
+ )
12
+ from pip._internal.utils.misc import write_output
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class CheckCommand(Command):
18
+ """Verify installed packages have compatible dependencies."""
19
+
20
+ usage = """
21
+ %prog [options]"""
22
+
23
+ def run(self, options: Values, args: List[str]) -> int:
24
+ package_set, parsing_probs = create_package_set_from_installed()
25
+ warn_legacy_versions_and_specifiers(package_set)
26
+ missing, conflicting = check_package_set(package_set)
27
+
28
+ for project_name in missing:
29
+ version = package_set[project_name].version
30
+ for dependency in missing[project_name]:
31
+ write_output(
32
+ "%s %s requires %s, which is not installed.",
33
+ project_name,
34
+ version,
35
+ dependency[0],
36
+ )
37
+
38
+ for project_name in conflicting:
39
+ version = package_set[project_name].version
40
+ for dep_name, dep_version, req in conflicting[project_name]:
41
+ write_output(
42
+ "%s %s has requirement %s, but you have %s %s.",
43
+ project_name,
44
+ version,
45
+ req,
46
+ dep_name,
47
+ dep_version,
48
+ )
49
+
50
+ if missing or conflicting or parsing_probs:
51
+ return ERROR
52
+ else:
53
+ write_output("No broken requirements found.")
54
+ return SUCCESS
.venv/Lib/site-packages/pip/_internal/commands/completion.py ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ import textwrap
3
+ from optparse import Values
4
+ from typing import List
5
+
6
+ from pip._internal.cli.base_command import Command
7
+ from pip._internal.cli.status_codes import SUCCESS
8
+ from pip._internal.utils.misc import get_prog
9
+
10
+ BASE_COMPLETION = """
11
+ # pip {shell} completion start{script}# pip {shell} completion end
12
+ """
13
+
14
+ COMPLETION_SCRIPTS = {
15
+ "bash": """
16
+ _pip_completion()
17
+ {{
18
+ COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\
19
+ COMP_CWORD=$COMP_CWORD \\
20
+ PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
21
+ }}
22
+ complete -o default -F _pip_completion {prog}
23
+ """,
24
+ "zsh": """
25
+ #compdef -P pip[0-9.]#
26
+ compadd $( COMP_WORDS="$words[*]" \\
27
+ COMP_CWORD=$((CURRENT-1)) \\
28
+ PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )
29
+ """,
30
+ "fish": """
31
+ function __fish_complete_pip
32
+ set -lx COMP_WORDS (commandline -o) ""
33
+ set -lx COMP_CWORD ( \\
34
+ math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
35
+ )
36
+ set -lx PIP_AUTO_COMPLETE 1
37
+ string split \\ -- (eval $COMP_WORDS[1])
38
+ end
39
+ complete -fa "(__fish_complete_pip)" -c {prog}
40
+ """,
41
+ "powershell": """
42
+ if ((Test-Path Function:\\TabExpansion) -and -not `
43
+ (Test-Path Function:\\_pip_completeBackup)) {{
44
+ Rename-Item Function:\\TabExpansion _pip_completeBackup
45
+ }}
46
+ function TabExpansion($line, $lastWord) {{
47
+ $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart()
48
+ if ($lastBlock.StartsWith("{prog} ")) {{
49
+ $Env:COMP_WORDS=$lastBlock
50
+ $Env:COMP_CWORD=$lastBlock.Split().Length - 1
51
+ $Env:PIP_AUTO_COMPLETE=1
52
+ (& {prog}).Split()
53
+ Remove-Item Env:COMP_WORDS
54
+ Remove-Item Env:COMP_CWORD
55
+ Remove-Item Env:PIP_AUTO_COMPLETE
56
+ }}
57
+ elseif (Test-Path Function:\\_pip_completeBackup) {{
58
+ # Fall back on existing tab expansion
59
+ _pip_completeBackup $line $lastWord
60
+ }}
61
+ }}
62
+ """,
63
+ }
64
+
65
+
66
+ class CompletionCommand(Command):
67
+ """A helper command to be used for command completion."""
68
+
69
+ ignore_require_venv = True
70
+
71
+ def add_options(self) -> None:
72
+ self.cmd_opts.add_option(
73
+ "--bash",
74
+ "-b",
75
+ action="store_const",
76
+ const="bash",
77
+ dest="shell",
78
+ help="Emit completion code for bash",
79
+ )
80
+ self.cmd_opts.add_option(
81
+ "--zsh",
82
+ "-z",
83
+ action="store_const",
84
+ const="zsh",
85
+ dest="shell",
86
+ help="Emit completion code for zsh",
87
+ )
88
+ self.cmd_opts.add_option(
89
+ "--fish",
90
+ "-f",
91
+ action="store_const",
92
+ const="fish",
93
+ dest="shell",
94
+ help="Emit completion code for fish",
95
+ )
96
+ self.cmd_opts.add_option(
97
+ "--powershell",
98
+ "-p",
99
+ action="store_const",
100
+ const="powershell",
101
+ dest="shell",
102
+ help="Emit completion code for powershell",
103
+ )
104
+
105
+ self.parser.insert_option_group(0, self.cmd_opts)
106
+
107
+ def run(self, options: Values, args: List[str]) -> int:
108
+ """Prints the completion code of the given shell"""
109
+ shells = COMPLETION_SCRIPTS.keys()
110
+ shell_options = ["--" + shell for shell in sorted(shells)]
111
+ if options.shell in shells:
112
+ script = textwrap.dedent(
113
+ COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog())
114
+ )
115
+ print(BASE_COMPLETION.format(script=script, shell=options.shell))
116
+ return SUCCESS
117
+ else:
118
+ sys.stderr.write(
119
+ "ERROR: You must pass {}\n".format(" or ".join(shell_options))
120
+ )
121
+ return SUCCESS
.venv/Lib/site-packages/pip/_internal/commands/configuration.py ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ import subprocess
4
+ from optparse import Values
5
+ from typing import Any, List, Optional
6
+
7
+ from pip._internal.cli.base_command import Command
8
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
9
+ from pip._internal.configuration import (
10
+ Configuration,
11
+ Kind,
12
+ get_configuration_files,
13
+ kinds,
14
+ )
15
+ from pip._internal.exceptions import PipError
16
+ from pip._internal.utils.logging import indent_log
17
+ from pip._internal.utils.misc import get_prog, write_output
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class ConfigurationCommand(Command):
23
+ """
24
+ Manage local and global configuration.
25
+
26
+ Subcommands:
27
+
28
+ - list: List the active configuration (or from the file specified)
29
+ - edit: Edit the configuration file in an editor
30
+ - get: Get the value associated with command.option
31
+ - set: Set the command.option=value
32
+ - unset: Unset the value associated with command.option
33
+ - debug: List the configuration files and values defined under them
34
+
35
+ Configuration keys should be dot separated command and option name,
36
+ with the special prefix "global" affecting any command. For example,
37
+ "pip config set global.index-url https://example.org/" would configure
38
+ the index url for all commands, but "pip config set download.timeout 10"
39
+ would configure a 10 second timeout only for "pip download" commands.
40
+
41
+ If none of --user, --global and --site are passed, a virtual
42
+ environment configuration file is used if one is active and the file
43
+ exists. Otherwise, all modifications happen to the user file by
44
+ default.
45
+ """
46
+
47
+ ignore_require_venv = True
48
+ usage = """
49
+ %prog [<file-option>] list
50
+ %prog [<file-option>] [--editor <editor-path>] edit
51
+
52
+ %prog [<file-option>] get command.option
53
+ %prog [<file-option>] set command.option value
54
+ %prog [<file-option>] unset command.option
55
+ %prog [<file-option>] debug
56
+ """
57
+
58
+ def add_options(self) -> None:
59
+ self.cmd_opts.add_option(
60
+ "--editor",
61
+ dest="editor",
62
+ action="store",
63
+ default=None,
64
+ help=(
65
+ "Editor to use to edit the file. Uses VISUAL or EDITOR "
66
+ "environment variables if not provided."
67
+ ),
68
+ )
69
+
70
+ self.cmd_opts.add_option(
71
+ "--global",
72
+ dest="global_file",
73
+ action="store_true",
74
+ default=False,
75
+ help="Use the system-wide configuration file only",
76
+ )
77
+
78
+ self.cmd_opts.add_option(
79
+ "--user",
80
+ dest="user_file",
81
+ action="store_true",
82
+ default=False,
83
+ help="Use the user configuration file only",
84
+ )
85
+
86
+ self.cmd_opts.add_option(
87
+ "--site",
88
+ dest="site_file",
89
+ action="store_true",
90
+ default=False,
91
+ help="Use the current environment configuration file only",
92
+ )
93
+
94
+ self.parser.insert_option_group(0, self.cmd_opts)
95
+
96
+ def run(self, options: Values, args: List[str]) -> int:
97
+ handlers = {
98
+ "list": self.list_values,
99
+ "edit": self.open_in_editor,
100
+ "get": self.get_name,
101
+ "set": self.set_name_value,
102
+ "unset": self.unset_name,
103
+ "debug": self.list_config_values,
104
+ }
105
+
106
+ # Determine action
107
+ if not args or args[0] not in handlers:
108
+ logger.error(
109
+ "Need an action (%s) to perform.",
110
+ ", ".join(sorted(handlers)),
111
+ )
112
+ return ERROR
113
+
114
+ action = args[0]
115
+
116
+ # Determine which configuration files are to be loaded
117
+ # Depends on whether the command is modifying.
118
+ try:
119
+ load_only = self._determine_file(
120
+ options, need_value=(action in ["get", "set", "unset", "edit"])
121
+ )
122
+ except PipError as e:
123
+ logger.error(e.args[0])
124
+ return ERROR
125
+
126
+ # Load a new configuration
127
+ self.configuration = Configuration(
128
+ isolated=options.isolated_mode, load_only=load_only
129
+ )
130
+ self.configuration.load()
131
+
132
+ # Error handling happens here, not in the action-handlers.
133
+ try:
134
+ handlers[action](options, args[1:])
135
+ except PipError as e:
136
+ logger.error(e.args[0])
137
+ return ERROR
138
+
139
+ return SUCCESS
140
+
141
+ def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]:
142
+ file_options = [
143
+ key
144
+ for key, value in (
145
+ (kinds.USER, options.user_file),
146
+ (kinds.GLOBAL, options.global_file),
147
+ (kinds.SITE, options.site_file),
148
+ )
149
+ if value
150
+ ]
151
+
152
+ if not file_options:
153
+ if not need_value:
154
+ return None
155
+ # Default to user, unless there's a site file.
156
+ elif any(
157
+ os.path.exists(site_config_file)
158
+ for site_config_file in get_configuration_files()[kinds.SITE]
159
+ ):
160
+ return kinds.SITE
161
+ else:
162
+ return kinds.USER
163
+ elif len(file_options) == 1:
164
+ return file_options[0]
165
+
166
+ raise PipError(
167
+ "Need exactly one file to operate upon "
168
+ "(--user, --site, --global) to perform."
169
+ )
170
+
171
+ def list_values(self, options: Values, args: List[str]) -> None:
172
+ self._get_n_args(args, "list", n=0)
173
+
174
+ for key, value in sorted(self.configuration.items()):
175
+ write_output("%s=%r", key, value)
176
+
177
+ def get_name(self, options: Values, args: List[str]) -> None:
178
+ key = self._get_n_args(args, "get [name]", n=1)
179
+ value = self.configuration.get_value(key)
180
+
181
+ write_output("%s", value)
182
+
183
+ def set_name_value(self, options: Values, args: List[str]) -> None:
184
+ key, value = self._get_n_args(args, "set [name] [value]", n=2)
185
+ self.configuration.set_value(key, value)
186
+
187
+ self._save_configuration()
188
+
189
+ def unset_name(self, options: Values, args: List[str]) -> None:
190
+ key = self._get_n_args(args, "unset [name]", n=1)
191
+ self.configuration.unset_value(key)
192
+
193
+ self._save_configuration()
194
+
195
+ def list_config_values(self, options: Values, args: List[str]) -> None:
196
+ """List config key-value pairs across different config files"""
197
+ self._get_n_args(args, "debug", n=0)
198
+
199
+ self.print_env_var_values()
200
+ # Iterate over config files and print if they exist, and the
201
+ # key-value pairs present in them if they do
202
+ for variant, files in sorted(self.configuration.iter_config_files()):
203
+ write_output("%s:", variant)
204
+ for fname in files:
205
+ with indent_log():
206
+ file_exists = os.path.exists(fname)
207
+ write_output("%s, exists: %r", fname, file_exists)
208
+ if file_exists:
209
+ self.print_config_file_values(variant)
210
+
211
+ def print_config_file_values(self, variant: Kind) -> None:
212
+ """Get key-value pairs from the file of a variant"""
213
+ for name, value in self.configuration.get_values_in_config(variant).items():
214
+ with indent_log():
215
+ write_output("%s: %s", name, value)
216
+
217
+ def print_env_var_values(self) -> None:
218
+ """Get key-values pairs present as environment variables"""
219
+ write_output("%s:", "env_var")
220
+ with indent_log():
221
+ for key, value in sorted(self.configuration.get_environ_vars()):
222
+ env_var = f"PIP_{key.upper()}"
223
+ write_output("%s=%r", env_var, value)
224
+
225
+ def open_in_editor(self, options: Values, args: List[str]) -> None:
226
+ editor = self._determine_editor(options)
227
+
228
+ fname = self.configuration.get_file_to_edit()
229
+ if fname is None:
230
+ raise PipError("Could not determine appropriate file.")
231
+ elif '"' in fname:
232
+ # This shouldn't happen, unless we see a username like that.
233
+ # If that happens, we'd appreciate a pull request fixing this.
234
+ raise PipError(
235
+ f'Can not open an editor for a file name containing "\n{fname}'
236
+ )
237
+
238
+ try:
239
+ subprocess.check_call(f'{editor} "{fname}"', shell=True)
240
+ except FileNotFoundError as e:
241
+ if not e.filename:
242
+ e.filename = editor
243
+ raise
244
+ except subprocess.CalledProcessError as e:
245
+ raise PipError(
246
+ "Editor Subprocess exited with exit code {}".format(e.returncode)
247
+ )
248
+
249
+ def _get_n_args(self, args: List[str], example: str, n: int) -> Any:
250
+ """Helper to make sure the command got the right number of arguments"""
251
+ if len(args) != n:
252
+ msg = (
253
+ "Got unexpected number of arguments, expected {}. "
254
+ '(example: "{} config {}")'
255
+ ).format(n, get_prog(), example)
256
+ raise PipError(msg)
257
+
258
+ if n == 1:
259
+ return args[0]
260
+ else:
261
+ return args
262
+
263
+ def _save_configuration(self) -> None:
264
+ # We successfully ran a modifying command. Need to save the
265
+ # configuration.
266
+ try:
267
+ self.configuration.save()
268
+ except Exception:
269
+ logger.exception(
270
+ "Unable to save configuration. Please report this as a bug."
271
+ )
272
+ raise PipError("Internal Error.")
273
+
274
+ def _determine_editor(self, options: Values) -> str:
275
+ if options.editor is not None:
276
+ return options.editor
277
+ elif "VISUAL" in os.environ:
278
+ return os.environ["VISUAL"]
279
+ elif "EDITOR" in os.environ:
280
+ return os.environ["EDITOR"]
281
+ else:
282
+ raise PipError("Could not determine editor to use.")