]> jfr.im git - yt-dlp.git/blame - youtube_dl/compat.py
pull changes from remote master (#190)
[yt-dlp.git] / youtube_dl / compat.py
CommitLineData
dfe5fa49 1# coding: utf-8
451948b2
PH
2from __future__ import unicode_literals
3
f206126d 4import base64
0a67a363 5import binascii
003c69a8 6import collections
d7cd9a9e 7import ctypes
0a67a363 8import email
8c25f81b 9import getpass
0a67a363 10import io
2384f5a6 11import itertools
e07e9313 12import optparse
8c25f81b 13import os
d7cd9a9e 14import platform
7d4111ed 15import re
51f579b6 16import shlex
003c69a8 17import shutil
be4a824d 18import socket
dab0daee 19import struct
8c25f81b
PH
20import subprocess
21import sys
36e6f62c 22import xml.etree.ElementTree
8c25f81b
PH
23
24
25try:
26 import urllib.request as compat_urllib_request
5f6a1245 27except ImportError: # Python 2
8c25f81b
PH
28 import urllib2 as compat_urllib_request
29
30try:
31 import urllib.error as compat_urllib_error
5f6a1245 32except ImportError: # Python 2
8c25f81b
PH
33 import urllib2 as compat_urllib_error
34
35try:
36 import urllib.parse as compat_urllib_parse
5f6a1245 37except ImportError: # Python 2
8c25f81b
PH
38 import urllib as compat_urllib_parse
39
40try:
41 from urllib.parse import urlparse as compat_urllib_parse_urlparse
5f6a1245 42except ImportError: # Python 2
8c25f81b
PH
43 from urlparse import urlparse as compat_urllib_parse_urlparse
44
45try:
46 import urllib.parse as compat_urlparse
5f6a1245 47except ImportError: # Python 2
8c25f81b
PH
48 import urlparse as compat_urlparse
49
0a67a363
YCH
50try:
51 import urllib.response as compat_urllib_response
52except ImportError: # Python 2
53 import urllib as compat_urllib_response
54
8c25f81b
PH
55try:
56 import http.cookiejar as compat_cookiejar
5f6a1245 57except ImportError: # Python 2
8c25f81b
PH
58 import cookielib as compat_cookiejar
59
b827ee92
AG
60if sys.version_info[0] == 2:
61 class compat_cookiejar_Cookie(compat_cookiejar.Cookie):
62 def __init__(self, version, name, value, *args, **kwargs):
63 if isinstance(name, compat_str):
64 name = name.encode()
65 if isinstance(value, compat_str):
66 value = value.encode()
67 compat_cookiejar.Cookie.__init__(self, version, name, value, *args, **kwargs)
68else:
69 compat_cookiejar_Cookie = compat_cookiejar.Cookie
70
799207e8 71try:
72 import http.cookies as compat_cookies
73except ImportError: # Python 2
74 import Cookie as compat_cookies
75
8c25f81b
PH
76try:
77 import html.entities as compat_html_entities
5f6a1245 78except ImportError: # Python 2
8c25f81b
PH
79 import htmlentitydefs as compat_html_entities
80
9631a94f 81try: # Python >= 3.3
836ab0c5
YCH
82 compat_html_entities_html5 = compat_html_entities.html5
83except AttributeError:
9631a94f
YCH
84 # Copied from CPython 3.5.1 html/entities.py
85 compat_html_entities_html5 = {
86 'Aacute': '\xc1',
87 'aacute': '\xe1',
88 'Aacute;': '\xc1',
89 'aacute;': '\xe1',
90 'Abreve;': '\u0102',
91 'abreve;': '\u0103',
92 'ac;': '\u223e',
93 'acd;': '\u223f',
94 'acE;': '\u223e\u0333',
95 'Acirc': '\xc2',
96 'acirc': '\xe2',
97 'Acirc;': '\xc2',
98 'acirc;': '\xe2',
99 'acute': '\xb4',
100 'acute;': '\xb4',
101 'Acy;': '\u0410',
102 'acy;': '\u0430',
103 'AElig': '\xc6',
104 'aelig': '\xe6',
105 'AElig;': '\xc6',
106 'aelig;': '\xe6',
107 'af;': '\u2061',
108 'Afr;': '\U0001d504',
109 'afr;': '\U0001d51e',
110 'Agrave': '\xc0',
111 'agrave': '\xe0',
112 'Agrave;': '\xc0',
113 'agrave;': '\xe0',
114 'alefsym;': '\u2135',
115 'aleph;': '\u2135',
116 'Alpha;': '\u0391',
117 'alpha;': '\u03b1',
118 'Amacr;': '\u0100',
119 'amacr;': '\u0101',
120 'amalg;': '\u2a3f',
121 'AMP': '&',
122 'amp': '&',
123 'AMP;': '&',
124 'amp;': '&',
125 'And;': '\u2a53',
126 'and;': '\u2227',
127 'andand;': '\u2a55',
128 'andd;': '\u2a5c',
129 'andslope;': '\u2a58',
130 'andv;': '\u2a5a',
131 'ang;': '\u2220',
132 'ange;': '\u29a4',
133 'angle;': '\u2220',
134 'angmsd;': '\u2221',
135 'angmsdaa;': '\u29a8',
136 'angmsdab;': '\u29a9',
137 'angmsdac;': '\u29aa',
138 'angmsdad;': '\u29ab',
139 'angmsdae;': '\u29ac',
140 'angmsdaf;': '\u29ad',
141 'angmsdag;': '\u29ae',
142 'angmsdah;': '\u29af',
143 'angrt;': '\u221f',
144 'angrtvb;': '\u22be',
145 'angrtvbd;': '\u299d',
146 'angsph;': '\u2222',
147 'angst;': '\xc5',
148 'angzarr;': '\u237c',
149 'Aogon;': '\u0104',
150 'aogon;': '\u0105',
151 'Aopf;': '\U0001d538',
152 'aopf;': '\U0001d552',
153 'ap;': '\u2248',
154 'apacir;': '\u2a6f',
155 'apE;': '\u2a70',
156 'ape;': '\u224a',
157 'apid;': '\u224b',
158 'apos;': "'",
159 'ApplyFunction;': '\u2061',
160 'approx;': '\u2248',
161 'approxeq;': '\u224a',
162 'Aring': '\xc5',
163 'aring': '\xe5',
164 'Aring;': '\xc5',
165 'aring;': '\xe5',
166 'Ascr;': '\U0001d49c',
167 'ascr;': '\U0001d4b6',
168 'Assign;': '\u2254',
169 'ast;': '*',
170 'asymp;': '\u2248',
171 'asympeq;': '\u224d',
172 'Atilde': '\xc3',
173 'atilde': '\xe3',
174 'Atilde;': '\xc3',
175 'atilde;': '\xe3',
176 'Auml': '\xc4',
177 'auml': '\xe4',
178 'Auml;': '\xc4',
179 'auml;': '\xe4',
180 'awconint;': '\u2233',
181 'awint;': '\u2a11',
182 'backcong;': '\u224c',
183 'backepsilon;': '\u03f6',
184 'backprime;': '\u2035',
185 'backsim;': '\u223d',
186 'backsimeq;': '\u22cd',
187 'Backslash;': '\u2216',
188 'Barv;': '\u2ae7',
189 'barvee;': '\u22bd',
190 'Barwed;': '\u2306',
191 'barwed;': '\u2305',
192 'barwedge;': '\u2305',
193 'bbrk;': '\u23b5',
194 'bbrktbrk;': '\u23b6',
195 'bcong;': '\u224c',
196 'Bcy;': '\u0411',
197 'bcy;': '\u0431',
198 'bdquo;': '\u201e',
199 'becaus;': '\u2235',
200 'Because;': '\u2235',
201 'because;': '\u2235',
202 'bemptyv;': '\u29b0',
203 'bepsi;': '\u03f6',
204 'bernou;': '\u212c',
205 'Bernoullis;': '\u212c',
206 'Beta;': '\u0392',
207 'beta;': '\u03b2',
208 'beth;': '\u2136',
209 'between;': '\u226c',
210 'Bfr;': '\U0001d505',
211 'bfr;': '\U0001d51f',
212 'bigcap;': '\u22c2',
213 'bigcirc;': '\u25ef',
214 'bigcup;': '\u22c3',
215 'bigodot;': '\u2a00',
216 'bigoplus;': '\u2a01',
217 'bigotimes;': '\u2a02',
218 'bigsqcup;': '\u2a06',
219 'bigstar;': '\u2605',
220 'bigtriangledown;': '\u25bd',
221 'bigtriangleup;': '\u25b3',
222 'biguplus;': '\u2a04',
223 'bigvee;': '\u22c1',
224 'bigwedge;': '\u22c0',
225 'bkarow;': '\u290d',
226 'blacklozenge;': '\u29eb',
227 'blacksquare;': '\u25aa',
228 'blacktriangle;': '\u25b4',
229 'blacktriangledown;': '\u25be',
230 'blacktriangleleft;': '\u25c2',
231 'blacktriangleright;': '\u25b8',
232 'blank;': '\u2423',
233 'blk12;': '\u2592',
234 'blk14;': '\u2591',
235 'blk34;': '\u2593',
236 'block;': '\u2588',
237 'bne;': '=\u20e5',
238 'bnequiv;': '\u2261\u20e5',
239 'bNot;': '\u2aed',
240 'bnot;': '\u2310',
241 'Bopf;': '\U0001d539',
242 'bopf;': '\U0001d553',
243 'bot;': '\u22a5',
244 'bottom;': '\u22a5',
245 'bowtie;': '\u22c8',
246 'boxbox;': '\u29c9',
247 'boxDL;': '\u2557',
248 'boxDl;': '\u2556',
249 'boxdL;': '\u2555',
250 'boxdl;': '\u2510',
251 'boxDR;': '\u2554',
252 'boxDr;': '\u2553',
253 'boxdR;': '\u2552',
254 'boxdr;': '\u250c',
255 'boxH;': '\u2550',
256 'boxh;': '\u2500',
257 'boxHD;': '\u2566',
258 'boxHd;': '\u2564',
259 'boxhD;': '\u2565',
260 'boxhd;': '\u252c',
261 'boxHU;': '\u2569',
262 'boxHu;': '\u2567',
263 'boxhU;': '\u2568',
264 'boxhu;': '\u2534',
265 'boxminus;': '\u229f',
266 'boxplus;': '\u229e',
267 'boxtimes;': '\u22a0',
268 'boxUL;': '\u255d',
269 'boxUl;': '\u255c',
270 'boxuL;': '\u255b',
271 'boxul;': '\u2518',
272 'boxUR;': '\u255a',
273 'boxUr;': '\u2559',
274 'boxuR;': '\u2558',
275 'boxur;': '\u2514',
276 'boxV;': '\u2551',
277 'boxv;': '\u2502',
278 'boxVH;': '\u256c',
279 'boxVh;': '\u256b',
280 'boxvH;': '\u256a',
281 'boxvh;': '\u253c',
282 'boxVL;': '\u2563',
283 'boxVl;': '\u2562',
284 'boxvL;': '\u2561',
285 'boxvl;': '\u2524',
286 'boxVR;': '\u2560',
287 'boxVr;': '\u255f',
288 'boxvR;': '\u255e',
289 'boxvr;': '\u251c',
290 'bprime;': '\u2035',
291 'Breve;': '\u02d8',
292 'breve;': '\u02d8',
293 'brvbar': '\xa6',
294 'brvbar;': '\xa6',
295 'Bscr;': '\u212c',
296 'bscr;': '\U0001d4b7',
297 'bsemi;': '\u204f',
298 'bsim;': '\u223d',
299 'bsime;': '\u22cd',
300 'bsol;': '\\',
301 'bsolb;': '\u29c5',
302 'bsolhsub;': '\u27c8',
303 'bull;': '\u2022',
304 'bullet;': '\u2022',
305 'bump;': '\u224e',
306 'bumpE;': '\u2aae',
307 'bumpe;': '\u224f',
308 'Bumpeq;': '\u224e',
309 'bumpeq;': '\u224f',
310 'Cacute;': '\u0106',
311 'cacute;': '\u0107',
312 'Cap;': '\u22d2',
313 'cap;': '\u2229',
314 'capand;': '\u2a44',
315 'capbrcup;': '\u2a49',
316 'capcap;': '\u2a4b',
317 'capcup;': '\u2a47',
318 'capdot;': '\u2a40',
319 'CapitalDifferentialD;': '\u2145',
320 'caps;': '\u2229\ufe00',
321 'caret;': '\u2041',
322 'caron;': '\u02c7',
323 'Cayleys;': '\u212d',
324 'ccaps;': '\u2a4d',
325 'Ccaron;': '\u010c',
326 'ccaron;': '\u010d',
327 'Ccedil': '\xc7',
328 'ccedil': '\xe7',
329 'Ccedil;': '\xc7',
330 'ccedil;': '\xe7',
331 'Ccirc;': '\u0108',
332 'ccirc;': '\u0109',
333 'Cconint;': '\u2230',
334 'ccups;': '\u2a4c',
335 'ccupssm;': '\u2a50',
336 'Cdot;': '\u010a',
337 'cdot;': '\u010b',
338 'cedil': '\xb8',
339 'cedil;': '\xb8',
340 'Cedilla;': '\xb8',
341 'cemptyv;': '\u29b2',
342 'cent': '\xa2',
343 'cent;': '\xa2',
344 'CenterDot;': '\xb7',
345 'centerdot;': '\xb7',
346 'Cfr;': '\u212d',
347 'cfr;': '\U0001d520',
348 'CHcy;': '\u0427',
349 'chcy;': '\u0447',
350 'check;': '\u2713',
351 'checkmark;': '\u2713',
352 'Chi;': '\u03a7',
353 'chi;': '\u03c7',
354 'cir;': '\u25cb',
355 'circ;': '\u02c6',
356 'circeq;': '\u2257',
357 'circlearrowleft;': '\u21ba',
358 'circlearrowright;': '\u21bb',
359 'circledast;': '\u229b',
360 'circledcirc;': '\u229a',
361 'circleddash;': '\u229d',
362 'CircleDot;': '\u2299',
363 'circledR;': '\xae',
364 'circledS;': '\u24c8',
365 'CircleMinus;': '\u2296',
366 'CirclePlus;': '\u2295',
367 'CircleTimes;': '\u2297',
368 'cirE;': '\u29c3',
369 'cire;': '\u2257',
370 'cirfnint;': '\u2a10',
371 'cirmid;': '\u2aef',
372 'cirscir;': '\u29c2',
373 'ClockwiseContourIntegral;': '\u2232',
374 'CloseCurlyDoubleQuote;': '\u201d',
375 'CloseCurlyQuote;': '\u2019',
376 'clubs;': '\u2663',
377 'clubsuit;': '\u2663',
378 'Colon;': '\u2237',
379 'colon;': ':',
380 'Colone;': '\u2a74',
381 'colone;': '\u2254',
382 'coloneq;': '\u2254',
383 'comma;': ',',
384 'commat;': '@',
385 'comp;': '\u2201',
386 'compfn;': '\u2218',
387 'complement;': '\u2201',
388 'complexes;': '\u2102',
389 'cong;': '\u2245',
390 'congdot;': '\u2a6d',
391 'Congruent;': '\u2261',
392 'Conint;': '\u222f',
393 'conint;': '\u222e',
394 'ContourIntegral;': '\u222e',
395 'Copf;': '\u2102',
396 'copf;': '\U0001d554',
397 'coprod;': '\u2210',
398 'Coproduct;': '\u2210',
399 'COPY': '\xa9',
400 'copy': '\xa9',
401 'COPY;': '\xa9',
402 'copy;': '\xa9',
403 'copysr;': '\u2117',
404 'CounterClockwiseContourIntegral;': '\u2233',
405 'crarr;': '\u21b5',
406 'Cross;': '\u2a2f',
407 'cross;': '\u2717',
408 'Cscr;': '\U0001d49e',
409 'cscr;': '\U0001d4b8',
410 'csub;': '\u2acf',
411 'csube;': '\u2ad1',
412 'csup;': '\u2ad0',
413 'csupe;': '\u2ad2',
414 'ctdot;': '\u22ef',
415 'cudarrl;': '\u2938',
416 'cudarrr;': '\u2935',
417 'cuepr;': '\u22de',
418 'cuesc;': '\u22df',
419 'cularr;': '\u21b6',
420 'cularrp;': '\u293d',
421 'Cup;': '\u22d3',
422 'cup;': '\u222a',
423 'cupbrcap;': '\u2a48',
424 'CupCap;': '\u224d',
425 'cupcap;': '\u2a46',
426 'cupcup;': '\u2a4a',
427 'cupdot;': '\u228d',
428 'cupor;': '\u2a45',
429 'cups;': '\u222a\ufe00',
430 'curarr;': '\u21b7',
431 'curarrm;': '\u293c',
432 'curlyeqprec;': '\u22de',
433 'curlyeqsucc;': '\u22df',
434 'curlyvee;': '\u22ce',
435 'curlywedge;': '\u22cf',
436 'curren': '\xa4',
437 'curren;': '\xa4',
438 'curvearrowleft;': '\u21b6',
439 'curvearrowright;': '\u21b7',
440 'cuvee;': '\u22ce',
441 'cuwed;': '\u22cf',
442 'cwconint;': '\u2232',
443 'cwint;': '\u2231',
444 'cylcty;': '\u232d',
445 'Dagger;': '\u2021',
446 'dagger;': '\u2020',
447 'daleth;': '\u2138',
448 'Darr;': '\u21a1',
449 'dArr;': '\u21d3',
450 'darr;': '\u2193',
451 'dash;': '\u2010',
452 'Dashv;': '\u2ae4',
453 'dashv;': '\u22a3',
454 'dbkarow;': '\u290f',
455 'dblac;': '\u02dd',
456 'Dcaron;': '\u010e',
457 'dcaron;': '\u010f',
458 'Dcy;': '\u0414',
459 'dcy;': '\u0434',
460 'DD;': '\u2145',
461 'dd;': '\u2146',
462 'ddagger;': '\u2021',
463 'ddarr;': '\u21ca',
464 'DDotrahd;': '\u2911',
465 'ddotseq;': '\u2a77',
466 'deg': '\xb0',
467 'deg;': '\xb0',
468 'Del;': '\u2207',
469 'Delta;': '\u0394',
470 'delta;': '\u03b4',
471 'demptyv;': '\u29b1',
472 'dfisht;': '\u297f',
473 'Dfr;': '\U0001d507',
474 'dfr;': '\U0001d521',
475 'dHar;': '\u2965',
476 'dharl;': '\u21c3',
477 'dharr;': '\u21c2',
478 'DiacriticalAcute;': '\xb4',
479 'DiacriticalDot;': '\u02d9',
480 'DiacriticalDoubleAcute;': '\u02dd',
481 'DiacriticalGrave;': '`',
482 'DiacriticalTilde;': '\u02dc',
483 'diam;': '\u22c4',
484 'Diamond;': '\u22c4',
485 'diamond;': '\u22c4',
486 'diamondsuit;': '\u2666',
487 'diams;': '\u2666',
488 'die;': '\xa8',
489 'DifferentialD;': '\u2146',
490 'digamma;': '\u03dd',
491 'disin;': '\u22f2',
492 'div;': '\xf7',
493 'divide': '\xf7',
494 'divide;': '\xf7',
495 'divideontimes;': '\u22c7',
496 'divonx;': '\u22c7',
497 'DJcy;': '\u0402',
498 'djcy;': '\u0452',
499 'dlcorn;': '\u231e',
500 'dlcrop;': '\u230d',
501 'dollar;': '$',
502 'Dopf;': '\U0001d53b',
503 'dopf;': '\U0001d555',
504 'Dot;': '\xa8',
505 'dot;': '\u02d9',
506 'DotDot;': '\u20dc',
507 'doteq;': '\u2250',
508 'doteqdot;': '\u2251',
509 'DotEqual;': '\u2250',
510 'dotminus;': '\u2238',
511 'dotplus;': '\u2214',
512 'dotsquare;': '\u22a1',
513 'doublebarwedge;': '\u2306',
514 'DoubleContourIntegral;': '\u222f',
515 'DoubleDot;': '\xa8',
516 'DoubleDownArrow;': '\u21d3',
517 'DoubleLeftArrow;': '\u21d0',
518 'DoubleLeftRightArrow;': '\u21d4',
519 'DoubleLeftTee;': '\u2ae4',
520 'DoubleLongLeftArrow;': '\u27f8',
521 'DoubleLongLeftRightArrow;': '\u27fa',
522 'DoubleLongRightArrow;': '\u27f9',
523 'DoubleRightArrow;': '\u21d2',
524 'DoubleRightTee;': '\u22a8',
525 'DoubleUpArrow;': '\u21d1',
526 'DoubleUpDownArrow;': '\u21d5',
527 'DoubleVerticalBar;': '\u2225',
528 'DownArrow;': '\u2193',
529 'Downarrow;': '\u21d3',
530 'downarrow;': '\u2193',
531 'DownArrowBar;': '\u2913',
532 'DownArrowUpArrow;': '\u21f5',
533 'DownBreve;': '\u0311',
534 'downdownarrows;': '\u21ca',
535 'downharpoonleft;': '\u21c3',
536 'downharpoonright;': '\u21c2',
537 'DownLeftRightVector;': '\u2950',
538 'DownLeftTeeVector;': '\u295e',
539 'DownLeftVector;': '\u21bd',
540 'DownLeftVectorBar;': '\u2956',
541 'DownRightTeeVector;': '\u295f',
542 'DownRightVector;': '\u21c1',
543 'DownRightVectorBar;': '\u2957',
544 'DownTee;': '\u22a4',
545 'DownTeeArrow;': '\u21a7',
546 'drbkarow;': '\u2910',
547 'drcorn;': '\u231f',
548 'drcrop;': '\u230c',
549 'Dscr;': '\U0001d49f',
550 'dscr;': '\U0001d4b9',
551 'DScy;': '\u0405',
552 'dscy;': '\u0455',
553 'dsol;': '\u29f6',
554 'Dstrok;': '\u0110',
555 'dstrok;': '\u0111',
556 'dtdot;': '\u22f1',
557 'dtri;': '\u25bf',
558 'dtrif;': '\u25be',
559 'duarr;': '\u21f5',
560 'duhar;': '\u296f',
561 'dwangle;': '\u29a6',
562 'DZcy;': '\u040f',
563 'dzcy;': '\u045f',
564 'dzigrarr;': '\u27ff',
565 'Eacute': '\xc9',
566 'eacute': '\xe9',
567 'Eacute;': '\xc9',
568 'eacute;': '\xe9',
569 'easter;': '\u2a6e',
570 'Ecaron;': '\u011a',
571 'ecaron;': '\u011b',
572 'ecir;': '\u2256',
573 'Ecirc': '\xca',
574 'ecirc': '\xea',
575 'Ecirc;': '\xca',
576 'ecirc;': '\xea',
577 'ecolon;': '\u2255',
578 'Ecy;': '\u042d',
579 'ecy;': '\u044d',
580 'eDDot;': '\u2a77',
581 'Edot;': '\u0116',
582 'eDot;': '\u2251',
583 'edot;': '\u0117',
584 'ee;': '\u2147',
585 'efDot;': '\u2252',
586 'Efr;': '\U0001d508',
587 'efr;': '\U0001d522',
588 'eg;': '\u2a9a',
589 'Egrave': '\xc8',
590 'egrave': '\xe8',
591 'Egrave;': '\xc8',
592 'egrave;': '\xe8',
593 'egs;': '\u2a96',
594 'egsdot;': '\u2a98',
595 'el;': '\u2a99',
596 'Element;': '\u2208',
597 'elinters;': '\u23e7',
598 'ell;': '\u2113',
599 'els;': '\u2a95',
600 'elsdot;': '\u2a97',
601 'Emacr;': '\u0112',
602 'emacr;': '\u0113',
603 'empty;': '\u2205',
604 'emptyset;': '\u2205',
605 'EmptySmallSquare;': '\u25fb',
606 'emptyv;': '\u2205',
607 'EmptyVerySmallSquare;': '\u25ab',
608 'emsp13;': '\u2004',
609 'emsp14;': '\u2005',
610 'emsp;': '\u2003',
611 'ENG;': '\u014a',
612 'eng;': '\u014b',
613 'ensp;': '\u2002',
614 'Eogon;': '\u0118',
615 'eogon;': '\u0119',
616 'Eopf;': '\U0001d53c',
617 'eopf;': '\U0001d556',
618 'epar;': '\u22d5',
619 'eparsl;': '\u29e3',
620 'eplus;': '\u2a71',
621 'epsi;': '\u03b5',
622 'Epsilon;': '\u0395',
623 'epsilon;': '\u03b5',
624 'epsiv;': '\u03f5',
625 'eqcirc;': '\u2256',
626 'eqcolon;': '\u2255',
627 'eqsim;': '\u2242',
628 'eqslantgtr;': '\u2a96',
629 'eqslantless;': '\u2a95',
630 'Equal;': '\u2a75',
631 'equals;': '=',
632 'EqualTilde;': '\u2242',
633 'equest;': '\u225f',
634 'Equilibrium;': '\u21cc',
635 'equiv;': '\u2261',
636 'equivDD;': '\u2a78',
637 'eqvparsl;': '\u29e5',
638 'erarr;': '\u2971',
639 'erDot;': '\u2253',
640 'Escr;': '\u2130',
641 'escr;': '\u212f',
642 'esdot;': '\u2250',
643 'Esim;': '\u2a73',
644 'esim;': '\u2242',
645 'Eta;': '\u0397',
646 'eta;': '\u03b7',
647 'ETH': '\xd0',
648 'eth': '\xf0',
649 'ETH;': '\xd0',
650 'eth;': '\xf0',
651 'Euml': '\xcb',
652 'euml': '\xeb',
653 'Euml;': '\xcb',
654 'euml;': '\xeb',
655 'euro;': '\u20ac',
656 'excl;': '!',
657 'exist;': '\u2203',
658 'Exists;': '\u2203',
659 'expectation;': '\u2130',
660 'ExponentialE;': '\u2147',
661 'exponentiale;': '\u2147',
662 'fallingdotseq;': '\u2252',
663 'Fcy;': '\u0424',
664 'fcy;': '\u0444',
665 'female;': '\u2640',
666 'ffilig;': '\ufb03',
667 'fflig;': '\ufb00',
668 'ffllig;': '\ufb04',
669 'Ffr;': '\U0001d509',
670 'ffr;': '\U0001d523',
671 'filig;': '\ufb01',
672 'FilledSmallSquare;': '\u25fc',
673 'FilledVerySmallSquare;': '\u25aa',
674 'fjlig;': 'fj',
675 'flat;': '\u266d',
676 'fllig;': '\ufb02',
677 'fltns;': '\u25b1',
678 'fnof;': '\u0192',
679 'Fopf;': '\U0001d53d',
680 'fopf;': '\U0001d557',
681 'ForAll;': '\u2200',
682 'forall;': '\u2200',
683 'fork;': '\u22d4',
684 'forkv;': '\u2ad9',
685 'Fouriertrf;': '\u2131',
686 'fpartint;': '\u2a0d',
687 'frac12': '\xbd',
688 'frac12;': '\xbd',
689 'frac13;': '\u2153',
690 'frac14': '\xbc',
691 'frac14;': '\xbc',
692 'frac15;': '\u2155',
693 'frac16;': '\u2159',
694 'frac18;': '\u215b',
695 'frac23;': '\u2154',
696 'frac25;': '\u2156',
697 'frac34': '\xbe',
698 'frac34;': '\xbe',
699 'frac35;': '\u2157',
700 'frac38;': '\u215c',
701 'frac45;': '\u2158',
702 'frac56;': '\u215a',
703 'frac58;': '\u215d',
704 'frac78;': '\u215e',
705 'frasl;': '\u2044',
706 'frown;': '\u2322',
707 'Fscr;': '\u2131',
708 'fscr;': '\U0001d4bb',
709 'gacute;': '\u01f5',
710 'Gamma;': '\u0393',
711 'gamma;': '\u03b3',
712 'Gammad;': '\u03dc',
713 'gammad;': '\u03dd',
714 'gap;': '\u2a86',
715 'Gbreve;': '\u011e',
716 'gbreve;': '\u011f',
717 'Gcedil;': '\u0122',
718 'Gcirc;': '\u011c',
719 'gcirc;': '\u011d',
720 'Gcy;': '\u0413',
721 'gcy;': '\u0433',
722 'Gdot;': '\u0120',
723 'gdot;': '\u0121',
724 'gE;': '\u2267',
725 'ge;': '\u2265',
726 'gEl;': '\u2a8c',
727 'gel;': '\u22db',
728 'geq;': '\u2265',
729 'geqq;': '\u2267',
730 'geqslant;': '\u2a7e',
731 'ges;': '\u2a7e',
732 'gescc;': '\u2aa9',
733 'gesdot;': '\u2a80',
734 'gesdoto;': '\u2a82',
735 'gesdotol;': '\u2a84',
736 'gesl;': '\u22db\ufe00',
737 'gesles;': '\u2a94',
738 'Gfr;': '\U0001d50a',
739 'gfr;': '\U0001d524',
740 'Gg;': '\u22d9',
741 'gg;': '\u226b',
742 'ggg;': '\u22d9',
743 'gimel;': '\u2137',
744 'GJcy;': '\u0403',
745 'gjcy;': '\u0453',
746 'gl;': '\u2277',
747 'gla;': '\u2aa5',
748 'glE;': '\u2a92',
749 'glj;': '\u2aa4',
750 'gnap;': '\u2a8a',
751 'gnapprox;': '\u2a8a',
752 'gnE;': '\u2269',
753 'gne;': '\u2a88',
754 'gneq;': '\u2a88',
755 'gneqq;': '\u2269',
756 'gnsim;': '\u22e7',
757 'Gopf;': '\U0001d53e',
758 'gopf;': '\U0001d558',
759 'grave;': '`',
760 'GreaterEqual;': '\u2265',
761 'GreaterEqualLess;': '\u22db',
762 'GreaterFullEqual;': '\u2267',
763 'GreaterGreater;': '\u2aa2',
764 'GreaterLess;': '\u2277',
765 'GreaterSlantEqual;': '\u2a7e',
766 'GreaterTilde;': '\u2273',
767 'Gscr;': '\U0001d4a2',
768 'gscr;': '\u210a',
769 'gsim;': '\u2273',
770 'gsime;': '\u2a8e',
771 'gsiml;': '\u2a90',
772 'GT': '>',
773 'gt': '>',
774 'GT;': '>',
775 'Gt;': '\u226b',
776 'gt;': '>',
777 'gtcc;': '\u2aa7',
778 'gtcir;': '\u2a7a',
779 'gtdot;': '\u22d7',
780 'gtlPar;': '\u2995',
781 'gtquest;': '\u2a7c',
782 'gtrapprox;': '\u2a86',
783 'gtrarr;': '\u2978',
784 'gtrdot;': '\u22d7',
785 'gtreqless;': '\u22db',
786 'gtreqqless;': '\u2a8c',
787 'gtrless;': '\u2277',
788 'gtrsim;': '\u2273',
789 'gvertneqq;': '\u2269\ufe00',
790 'gvnE;': '\u2269\ufe00',
791 'Hacek;': '\u02c7',
792 'hairsp;': '\u200a',
793 'half;': '\xbd',
794 'hamilt;': '\u210b',
795 'HARDcy;': '\u042a',
796 'hardcy;': '\u044a',
797 'hArr;': '\u21d4',
798 'harr;': '\u2194',
799 'harrcir;': '\u2948',
800 'harrw;': '\u21ad',
801 'Hat;': '^',
802 'hbar;': '\u210f',
803 'Hcirc;': '\u0124',
804 'hcirc;': '\u0125',
805 'hearts;': '\u2665',
806 'heartsuit;': '\u2665',
807 'hellip;': '\u2026',
808 'hercon;': '\u22b9',
809 'Hfr;': '\u210c',
810 'hfr;': '\U0001d525',
811 'HilbertSpace;': '\u210b',
812 'hksearow;': '\u2925',
813 'hkswarow;': '\u2926',
814 'hoarr;': '\u21ff',
815 'homtht;': '\u223b',
816 'hookleftarrow;': '\u21a9',
817 'hookrightarrow;': '\u21aa',
818 'Hopf;': '\u210d',
819 'hopf;': '\U0001d559',
820 'horbar;': '\u2015',
821 'HorizontalLine;': '\u2500',
822 'Hscr;': '\u210b',
823 'hscr;': '\U0001d4bd',
824 'hslash;': '\u210f',
825 'Hstrok;': '\u0126',
826 'hstrok;': '\u0127',
827 'HumpDownHump;': '\u224e',
828 'HumpEqual;': '\u224f',
829 'hybull;': '\u2043',
830 'hyphen;': '\u2010',
831 'Iacute': '\xcd',
832 'iacute': '\xed',
833 'Iacute;': '\xcd',
834 'iacute;': '\xed',
835 'ic;': '\u2063',
836 'Icirc': '\xce',
837 'icirc': '\xee',
838 'Icirc;': '\xce',
839 'icirc;': '\xee',
840 'Icy;': '\u0418',
841 'icy;': '\u0438',
842 'Idot;': '\u0130',
843 'IEcy;': '\u0415',
844 'iecy;': '\u0435',
845 'iexcl': '\xa1',
846 'iexcl;': '\xa1',
847 'iff;': '\u21d4',
848 'Ifr;': '\u2111',
849 'ifr;': '\U0001d526',
850 'Igrave': '\xcc',
851 'igrave': '\xec',
852 'Igrave;': '\xcc',
853 'igrave;': '\xec',
854 'ii;': '\u2148',
855 'iiiint;': '\u2a0c',
856 'iiint;': '\u222d',
857 'iinfin;': '\u29dc',
858 'iiota;': '\u2129',
859 'IJlig;': '\u0132',
860 'ijlig;': '\u0133',
861 'Im;': '\u2111',
862 'Imacr;': '\u012a',
863 'imacr;': '\u012b',
864 'image;': '\u2111',
865 'ImaginaryI;': '\u2148',
866 'imagline;': '\u2110',
867 'imagpart;': '\u2111',
868 'imath;': '\u0131',
869 'imof;': '\u22b7',
870 'imped;': '\u01b5',
871 'Implies;': '\u21d2',
872 'in;': '\u2208',
873 'incare;': '\u2105',
874 'infin;': '\u221e',
875 'infintie;': '\u29dd',
876 'inodot;': '\u0131',
877 'Int;': '\u222c',
878 'int;': '\u222b',
879 'intcal;': '\u22ba',
880 'integers;': '\u2124',
881 'Integral;': '\u222b',
882 'intercal;': '\u22ba',
883 'Intersection;': '\u22c2',
884 'intlarhk;': '\u2a17',
885 'intprod;': '\u2a3c',
886 'InvisibleComma;': '\u2063',
887 'InvisibleTimes;': '\u2062',
888 'IOcy;': '\u0401',
889 'iocy;': '\u0451',
890 'Iogon;': '\u012e',
891 'iogon;': '\u012f',
892 'Iopf;': '\U0001d540',
893 'iopf;': '\U0001d55a',
894 'Iota;': '\u0399',
895 'iota;': '\u03b9',
896 'iprod;': '\u2a3c',
897 'iquest': '\xbf',
898 'iquest;': '\xbf',
899 'Iscr;': '\u2110',
900 'iscr;': '\U0001d4be',
901 'isin;': '\u2208',
902 'isindot;': '\u22f5',
903 'isinE;': '\u22f9',
904 'isins;': '\u22f4',
905 'isinsv;': '\u22f3',
906 'isinv;': '\u2208',
907 'it;': '\u2062',
908 'Itilde;': '\u0128',
909 'itilde;': '\u0129',
910 'Iukcy;': '\u0406',
911 'iukcy;': '\u0456',
912 'Iuml': '\xcf',
913 'iuml': '\xef',
914 'Iuml;': '\xcf',
915 'iuml;': '\xef',
916 'Jcirc;': '\u0134',
917 'jcirc;': '\u0135',
918 'Jcy;': '\u0419',
919 'jcy;': '\u0439',
920 'Jfr;': '\U0001d50d',
921 'jfr;': '\U0001d527',
922 'jmath;': '\u0237',
923 'Jopf;': '\U0001d541',
924 'jopf;': '\U0001d55b',
925 'Jscr;': '\U0001d4a5',
926 'jscr;': '\U0001d4bf',
927 'Jsercy;': '\u0408',
928 'jsercy;': '\u0458',
929 'Jukcy;': '\u0404',
930 'jukcy;': '\u0454',
931 'Kappa;': '\u039a',
932 'kappa;': '\u03ba',
933 'kappav;': '\u03f0',
934 'Kcedil;': '\u0136',
935 'kcedil;': '\u0137',
936 'Kcy;': '\u041a',
937 'kcy;': '\u043a',
938 'Kfr;': '\U0001d50e',
939 'kfr;': '\U0001d528',
940 'kgreen;': '\u0138',
941 'KHcy;': '\u0425',
942 'khcy;': '\u0445',
943 'KJcy;': '\u040c',
944 'kjcy;': '\u045c',
945 'Kopf;': '\U0001d542',
946 'kopf;': '\U0001d55c',
947 'Kscr;': '\U0001d4a6',
948 'kscr;': '\U0001d4c0',
949 'lAarr;': '\u21da',
950 'Lacute;': '\u0139',
951 'lacute;': '\u013a',
952 'laemptyv;': '\u29b4',
953 'lagran;': '\u2112',
954 'Lambda;': '\u039b',
955 'lambda;': '\u03bb',
956 'Lang;': '\u27ea',
957 'lang;': '\u27e8',
958 'langd;': '\u2991',
959 'langle;': '\u27e8',
960 'lap;': '\u2a85',
961 'Laplacetrf;': '\u2112',
962 'laquo': '\xab',
963 'laquo;': '\xab',
964 'Larr;': '\u219e',
965 'lArr;': '\u21d0',
966 'larr;': '\u2190',
967 'larrb;': '\u21e4',
968 'larrbfs;': '\u291f',
969 'larrfs;': '\u291d',
970 'larrhk;': '\u21a9',
971 'larrlp;': '\u21ab',
972 'larrpl;': '\u2939',
973 'larrsim;': '\u2973',
974 'larrtl;': '\u21a2',
975 'lat;': '\u2aab',
976 'lAtail;': '\u291b',
977 'latail;': '\u2919',
978 'late;': '\u2aad',
979 'lates;': '\u2aad\ufe00',
980 'lBarr;': '\u290e',
981 'lbarr;': '\u290c',
982 'lbbrk;': '\u2772',
983 'lbrace;': '{',
984 'lbrack;': '[',
985 'lbrke;': '\u298b',
986 'lbrksld;': '\u298f',
987 'lbrkslu;': '\u298d',
988 'Lcaron;': '\u013d',
989 'lcaron;': '\u013e',
990 'Lcedil;': '\u013b',
991 'lcedil;': '\u013c',
992 'lceil;': '\u2308',
993 'lcub;': '{',
994 'Lcy;': '\u041b',
995 'lcy;': '\u043b',
996 'ldca;': '\u2936',
997 'ldquo;': '\u201c',
998 'ldquor;': '\u201e',
999 'ldrdhar;': '\u2967',
1000 'ldrushar;': '\u294b',
1001 'ldsh;': '\u21b2',
1002 'lE;': '\u2266',
1003 'le;': '\u2264',
1004 'LeftAngleBracket;': '\u27e8',
1005 'LeftArrow;': '\u2190',
1006 'Leftarrow;': '\u21d0',
1007 'leftarrow;': '\u2190',
1008 'LeftArrowBar;': '\u21e4',
1009 'LeftArrowRightArrow;': '\u21c6',
1010 'leftarrowtail;': '\u21a2',
1011 'LeftCeiling;': '\u2308',
1012 'LeftDoubleBracket;': '\u27e6',
1013 'LeftDownTeeVector;': '\u2961',
1014 'LeftDownVector;': '\u21c3',
1015 'LeftDownVectorBar;': '\u2959',
1016 'LeftFloor;': '\u230a',
1017 'leftharpoondown;': '\u21bd',
1018 'leftharpoonup;': '\u21bc',
1019 'leftleftarrows;': '\u21c7',
1020 'LeftRightArrow;': '\u2194',
1021 'Leftrightarrow;': '\u21d4',
1022 'leftrightarrow;': '\u2194',
1023 'leftrightarrows;': '\u21c6',
1024 'leftrightharpoons;': '\u21cb',
1025 'leftrightsquigarrow;': '\u21ad',
1026 'LeftRightVector;': '\u294e',
1027 'LeftTee;': '\u22a3',
1028 'LeftTeeArrow;': '\u21a4',
1029 'LeftTeeVector;': '\u295a',
1030 'leftthreetimes;': '\u22cb',
1031 'LeftTriangle;': '\u22b2',
1032 'LeftTriangleBar;': '\u29cf',
1033 'LeftTriangleEqual;': '\u22b4',
1034 'LeftUpDownVector;': '\u2951',
1035 'LeftUpTeeVector;': '\u2960',
1036 'LeftUpVector;': '\u21bf',
1037 'LeftUpVectorBar;': '\u2958',
1038 'LeftVector;': '\u21bc',
1039 'LeftVectorBar;': '\u2952',
1040 'lEg;': '\u2a8b',
1041 'leg;': '\u22da',
1042 'leq;': '\u2264',
1043 'leqq;': '\u2266',
1044 'leqslant;': '\u2a7d',
1045 'les;': '\u2a7d',
1046 'lescc;': '\u2aa8',
1047 'lesdot;': '\u2a7f',
1048 'lesdoto;': '\u2a81',
1049 'lesdotor;': '\u2a83',
1050 'lesg;': '\u22da\ufe00',
1051 'lesges;': '\u2a93',
1052 'lessapprox;': '\u2a85',
1053 'lessdot;': '\u22d6',
1054 'lesseqgtr;': '\u22da',
1055 'lesseqqgtr;': '\u2a8b',
1056 'LessEqualGreater;': '\u22da',
1057 'LessFullEqual;': '\u2266',
1058 'LessGreater;': '\u2276',
1059 'lessgtr;': '\u2276',
1060 'LessLess;': '\u2aa1',
1061 'lesssim;': '\u2272',
1062 'LessSlantEqual;': '\u2a7d',
1063 'LessTilde;': '\u2272',
1064 'lfisht;': '\u297c',
1065 'lfloor;': '\u230a',
1066 'Lfr;': '\U0001d50f',
1067 'lfr;': '\U0001d529',
1068 'lg;': '\u2276',
1069 'lgE;': '\u2a91',
1070 'lHar;': '\u2962',
1071 'lhard;': '\u21bd',
1072 'lharu;': '\u21bc',
1073 'lharul;': '\u296a',
1074 'lhblk;': '\u2584',
1075 'LJcy;': '\u0409',
1076 'ljcy;': '\u0459',
1077 'Ll;': '\u22d8',
1078 'll;': '\u226a',
1079 'llarr;': '\u21c7',
1080 'llcorner;': '\u231e',
1081 'Lleftarrow;': '\u21da',
1082 'llhard;': '\u296b',
1083 'lltri;': '\u25fa',
1084 'Lmidot;': '\u013f',
1085 'lmidot;': '\u0140',
1086 'lmoust;': '\u23b0',
1087 'lmoustache;': '\u23b0',
1088 'lnap;': '\u2a89',
1089 'lnapprox;': '\u2a89',
1090 'lnE;': '\u2268',
1091 'lne;': '\u2a87',
1092 'lneq;': '\u2a87',
1093 'lneqq;': '\u2268',
1094 'lnsim;': '\u22e6',
1095 'loang;': '\u27ec',
1096 'loarr;': '\u21fd',
1097 'lobrk;': '\u27e6',
1098 'LongLeftArrow;': '\u27f5',
1099 'Longleftarrow;': '\u27f8',
1100 'longleftarrow;': '\u27f5',
1101 'LongLeftRightArrow;': '\u27f7',
1102 'Longleftrightarrow;': '\u27fa',
1103 'longleftrightarrow;': '\u27f7',
1104 'longmapsto;': '\u27fc',
1105 'LongRightArrow;': '\u27f6',
1106 'Longrightarrow;': '\u27f9',
1107 'longrightarrow;': '\u27f6',
1108 'looparrowleft;': '\u21ab',
1109 'looparrowright;': '\u21ac',
1110 'lopar;': '\u2985',
1111 'Lopf;': '\U0001d543',
1112 'lopf;': '\U0001d55d',
1113 'loplus;': '\u2a2d',
1114 'lotimes;': '\u2a34',
1115 'lowast;': '\u2217',
1116 'lowbar;': '_',
1117 'LowerLeftArrow;': '\u2199',
1118 'LowerRightArrow;': '\u2198',
1119 'loz;': '\u25ca',
1120 'lozenge;': '\u25ca',
1121 'lozf;': '\u29eb',
1122 'lpar;': '(',
1123 'lparlt;': '\u2993',
1124 'lrarr;': '\u21c6',
1125 'lrcorner;': '\u231f',
1126 'lrhar;': '\u21cb',
1127 'lrhard;': '\u296d',
1128 'lrm;': '\u200e',
1129 'lrtri;': '\u22bf',
1130 'lsaquo;': '\u2039',
1131 'Lscr;': '\u2112',
1132 'lscr;': '\U0001d4c1',
1133 'Lsh;': '\u21b0',
1134 'lsh;': '\u21b0',
1135 'lsim;': '\u2272',
1136 'lsime;': '\u2a8d',
1137 'lsimg;': '\u2a8f',
1138 'lsqb;': '[',
1139 'lsquo;': '\u2018',
1140 'lsquor;': '\u201a',
1141 'Lstrok;': '\u0141',
1142 'lstrok;': '\u0142',
1143 'LT': '<',
1144 'lt': '<',
1145 'LT;': '<',
1146 'Lt;': '\u226a',
1147 'lt;': '<',
1148 'ltcc;': '\u2aa6',
1149 'ltcir;': '\u2a79',
1150 'ltdot;': '\u22d6',
1151 'lthree;': '\u22cb',
1152 'ltimes;': '\u22c9',
1153 'ltlarr;': '\u2976',
1154 'ltquest;': '\u2a7b',
1155 'ltri;': '\u25c3',
1156 'ltrie;': '\u22b4',
1157 'ltrif;': '\u25c2',
1158 'ltrPar;': '\u2996',
1159 'lurdshar;': '\u294a',
1160 'luruhar;': '\u2966',
1161 'lvertneqq;': '\u2268\ufe00',
1162 'lvnE;': '\u2268\ufe00',
1163 'macr': '\xaf',
1164 'macr;': '\xaf',
1165 'male;': '\u2642',
1166 'malt;': '\u2720',
1167 'maltese;': '\u2720',
1168 'Map;': '\u2905',
1169 'map;': '\u21a6',
1170 'mapsto;': '\u21a6',
1171 'mapstodown;': '\u21a7',
1172 'mapstoleft;': '\u21a4',
1173 'mapstoup;': '\u21a5',
1174 'marker;': '\u25ae',
1175 'mcomma;': '\u2a29',
1176 'Mcy;': '\u041c',
1177 'mcy;': '\u043c',
1178 'mdash;': '\u2014',
1179 'mDDot;': '\u223a',
1180 'measuredangle;': '\u2221',
1181 'MediumSpace;': '\u205f',
1182 'Mellintrf;': '\u2133',
1183 'Mfr;': '\U0001d510',
1184 'mfr;': '\U0001d52a',
1185 'mho;': '\u2127',
1186 'micro': '\xb5',
1187 'micro;': '\xb5',
1188 'mid;': '\u2223',
1189 'midast;': '*',
1190 'midcir;': '\u2af0',
1191 'middot': '\xb7',
1192 'middot;': '\xb7',
1193 'minus;': '\u2212',
1194 'minusb;': '\u229f',
1195 'minusd;': '\u2238',
1196 'minusdu;': '\u2a2a',
1197 'MinusPlus;': '\u2213',
1198 'mlcp;': '\u2adb',
1199 'mldr;': '\u2026',
1200 'mnplus;': '\u2213',
1201 'models;': '\u22a7',
1202 'Mopf;': '\U0001d544',
1203 'mopf;': '\U0001d55e',
1204 'mp;': '\u2213',
1205 'Mscr;': '\u2133',
1206 'mscr;': '\U0001d4c2',
1207 'mstpos;': '\u223e',
1208 'Mu;': '\u039c',
1209 'mu;': '\u03bc',
1210 'multimap;': '\u22b8',
1211 'mumap;': '\u22b8',
1212 'nabla;': '\u2207',
1213 'Nacute;': '\u0143',
1214 'nacute;': '\u0144',
1215 'nang;': '\u2220\u20d2',
1216 'nap;': '\u2249',
1217 'napE;': '\u2a70\u0338',
1218 'napid;': '\u224b\u0338',
1219 'napos;': '\u0149',
1220 'napprox;': '\u2249',
1221 'natur;': '\u266e',
1222 'natural;': '\u266e',
1223 'naturals;': '\u2115',
1224 'nbsp': '\xa0',
1225 'nbsp;': '\xa0',
1226 'nbump;': '\u224e\u0338',
1227 'nbumpe;': '\u224f\u0338',
1228 'ncap;': '\u2a43',
1229 'Ncaron;': '\u0147',
1230 'ncaron;': '\u0148',
1231 'Ncedil;': '\u0145',
1232 'ncedil;': '\u0146',
1233 'ncong;': '\u2247',
1234 'ncongdot;': '\u2a6d\u0338',
1235 'ncup;': '\u2a42',
1236 'Ncy;': '\u041d',
1237 'ncy;': '\u043d',
1238 'ndash;': '\u2013',
1239 'ne;': '\u2260',
1240 'nearhk;': '\u2924',
1241 'neArr;': '\u21d7',
1242 'nearr;': '\u2197',
1243 'nearrow;': '\u2197',
1244 'nedot;': '\u2250\u0338',
1245 'NegativeMediumSpace;': '\u200b',
1246 'NegativeThickSpace;': '\u200b',
1247 'NegativeThinSpace;': '\u200b',
1248 'NegativeVeryThinSpace;': '\u200b',
1249 'nequiv;': '\u2262',
1250 'nesear;': '\u2928',
1251 'nesim;': '\u2242\u0338',
1252 'NestedGreaterGreater;': '\u226b',
1253 'NestedLessLess;': '\u226a',
1254 'NewLine;': '\n',
1255 'nexist;': '\u2204',
1256 'nexists;': '\u2204',
1257 'Nfr;': '\U0001d511',
1258 'nfr;': '\U0001d52b',
1259 'ngE;': '\u2267\u0338',
1260 'nge;': '\u2271',
1261 'ngeq;': '\u2271',
1262 'ngeqq;': '\u2267\u0338',
1263 'ngeqslant;': '\u2a7e\u0338',
1264 'nges;': '\u2a7e\u0338',
1265 'nGg;': '\u22d9\u0338',
1266 'ngsim;': '\u2275',
1267 'nGt;': '\u226b\u20d2',
1268 'ngt;': '\u226f',
1269 'ngtr;': '\u226f',
1270 'nGtv;': '\u226b\u0338',
1271 'nhArr;': '\u21ce',
1272 'nharr;': '\u21ae',
1273 'nhpar;': '\u2af2',
1274 'ni;': '\u220b',
1275 'nis;': '\u22fc',
1276 'nisd;': '\u22fa',
1277 'niv;': '\u220b',
1278 'NJcy;': '\u040a',
1279 'njcy;': '\u045a',
1280 'nlArr;': '\u21cd',
1281 'nlarr;': '\u219a',
1282 'nldr;': '\u2025',
1283 'nlE;': '\u2266\u0338',
1284 'nle;': '\u2270',
1285 'nLeftarrow;': '\u21cd',
1286 'nleftarrow;': '\u219a',
1287 'nLeftrightarrow;': '\u21ce',
1288 'nleftrightarrow;': '\u21ae',
1289 'nleq;': '\u2270',
1290 'nleqq;': '\u2266\u0338',
1291 'nleqslant;': '\u2a7d\u0338',
1292 'nles;': '\u2a7d\u0338',
1293 'nless;': '\u226e',
1294 'nLl;': '\u22d8\u0338',
1295 'nlsim;': '\u2274',
1296 'nLt;': '\u226a\u20d2',
1297 'nlt;': '\u226e',
1298 'nltri;': '\u22ea',
1299 'nltrie;': '\u22ec',
1300 'nLtv;': '\u226a\u0338',
1301 'nmid;': '\u2224',
1302 'NoBreak;': '\u2060',
1303 'NonBreakingSpace;': '\xa0',
1304 'Nopf;': '\u2115',
1305 'nopf;': '\U0001d55f',
1306 'not': '\xac',
1307 'Not;': '\u2aec',
1308 'not;': '\xac',
1309 'NotCongruent;': '\u2262',
1310 'NotCupCap;': '\u226d',
1311 'NotDoubleVerticalBar;': '\u2226',
1312 'NotElement;': '\u2209',
1313 'NotEqual;': '\u2260',
1314 'NotEqualTilde;': '\u2242\u0338',
1315 'NotExists;': '\u2204',
1316 'NotGreater;': '\u226f',
1317 'NotGreaterEqual;': '\u2271',
1318 'NotGreaterFullEqual;': '\u2267\u0338',
1319 'NotGreaterGreater;': '\u226b\u0338',
1320 'NotGreaterLess;': '\u2279',
1321 'NotGreaterSlantEqual;': '\u2a7e\u0338',
1322 'NotGreaterTilde;': '\u2275',
1323 'NotHumpDownHump;': '\u224e\u0338',
1324 'NotHumpEqual;': '\u224f\u0338',
1325 'notin;': '\u2209',
1326 'notindot;': '\u22f5\u0338',
1327 'notinE;': '\u22f9\u0338',
1328 'notinva;': '\u2209',
1329 'notinvb;': '\u22f7',
1330 'notinvc;': '\u22f6',
1331 'NotLeftTriangle;': '\u22ea',
1332 'NotLeftTriangleBar;': '\u29cf\u0338',
1333 'NotLeftTriangleEqual;': '\u22ec',
1334 'NotLess;': '\u226e',
1335 'NotLessEqual;': '\u2270',
1336 'NotLessGreater;': '\u2278',
1337 'NotLessLess;': '\u226a\u0338',
1338 'NotLessSlantEqual;': '\u2a7d\u0338',
1339 'NotLessTilde;': '\u2274',
1340 'NotNestedGreaterGreater;': '\u2aa2\u0338',
1341 'NotNestedLessLess;': '\u2aa1\u0338',
1342 'notni;': '\u220c',
1343 'notniva;': '\u220c',
1344 'notnivb;': '\u22fe',
1345 'notnivc;': '\u22fd',
1346 'NotPrecedes;': '\u2280',
1347 'NotPrecedesEqual;': '\u2aaf\u0338',
1348 'NotPrecedesSlantEqual;': '\u22e0',
1349 'NotReverseElement;': '\u220c',
1350 'NotRightTriangle;': '\u22eb',
1351 'NotRightTriangleBar;': '\u29d0\u0338',
1352 'NotRightTriangleEqual;': '\u22ed',
1353 'NotSquareSubset;': '\u228f\u0338',
1354 'NotSquareSubsetEqual;': '\u22e2',
1355 'NotSquareSuperset;': '\u2290\u0338',
1356 'NotSquareSupersetEqual;': '\u22e3',
1357 'NotSubset;': '\u2282\u20d2',
1358 'NotSubsetEqual;': '\u2288',
1359 'NotSucceeds;': '\u2281',
1360 'NotSucceedsEqual;': '\u2ab0\u0338',
1361 'NotSucceedsSlantEqual;': '\u22e1',
1362 'NotSucceedsTilde;': '\u227f\u0338',
1363 'NotSuperset;': '\u2283\u20d2',
1364 'NotSupersetEqual;': '\u2289',
1365 'NotTilde;': '\u2241',
1366 'NotTildeEqual;': '\u2244',
1367 'NotTildeFullEqual;': '\u2247',
1368 'NotTildeTilde;': '\u2249',
1369 'NotVerticalBar;': '\u2224',
1370 'npar;': '\u2226',
1371 'nparallel;': '\u2226',
1372 'nparsl;': '\u2afd\u20e5',
1373 'npart;': '\u2202\u0338',
1374 'npolint;': '\u2a14',
1375 'npr;': '\u2280',
1376 'nprcue;': '\u22e0',
1377 'npre;': '\u2aaf\u0338',
1378 'nprec;': '\u2280',
1379 'npreceq;': '\u2aaf\u0338',
1380 'nrArr;': '\u21cf',
1381 'nrarr;': '\u219b',
1382 'nrarrc;': '\u2933\u0338',
1383 'nrarrw;': '\u219d\u0338',
1384 'nRightarrow;': '\u21cf',
1385 'nrightarrow;': '\u219b',
1386 'nrtri;': '\u22eb',
1387 'nrtrie;': '\u22ed',
1388 'nsc;': '\u2281',
1389 'nsccue;': '\u22e1',
1390 'nsce;': '\u2ab0\u0338',
1391 'Nscr;': '\U0001d4a9',
1392 'nscr;': '\U0001d4c3',
1393 'nshortmid;': '\u2224',
1394 'nshortparallel;': '\u2226',
1395 'nsim;': '\u2241',
1396 'nsime;': '\u2244',
1397 'nsimeq;': '\u2244',
1398 'nsmid;': '\u2224',
1399 'nspar;': '\u2226',
1400 'nsqsube;': '\u22e2',
1401 'nsqsupe;': '\u22e3',
1402 'nsub;': '\u2284',
1403 'nsubE;': '\u2ac5\u0338',
1404 'nsube;': '\u2288',
1405 'nsubset;': '\u2282\u20d2',
1406 'nsubseteq;': '\u2288',
1407 'nsubseteqq;': '\u2ac5\u0338',
1408 'nsucc;': '\u2281',
1409 'nsucceq;': '\u2ab0\u0338',
1410 'nsup;': '\u2285',
1411 'nsupE;': '\u2ac6\u0338',
1412 'nsupe;': '\u2289',
1413 'nsupset;': '\u2283\u20d2',
1414 'nsupseteq;': '\u2289',
1415 'nsupseteqq;': '\u2ac6\u0338',
1416 'ntgl;': '\u2279',
1417 'Ntilde': '\xd1',
1418 'ntilde': '\xf1',
1419 'Ntilde;': '\xd1',
1420 'ntilde;': '\xf1',
1421 'ntlg;': '\u2278',
1422 'ntriangleleft;': '\u22ea',
1423 'ntrianglelefteq;': '\u22ec',
1424 'ntriangleright;': '\u22eb',
1425 'ntrianglerighteq;': '\u22ed',
1426 'Nu;': '\u039d',
1427 'nu;': '\u03bd',
1428 'num;': '#',
1429 'numero;': '\u2116',
1430 'numsp;': '\u2007',
1431 'nvap;': '\u224d\u20d2',
1432 'nVDash;': '\u22af',
1433 'nVdash;': '\u22ae',
1434 'nvDash;': '\u22ad',
1435 'nvdash;': '\u22ac',
1436 'nvge;': '\u2265\u20d2',
1437 'nvgt;': '>\u20d2',
1438 'nvHarr;': '\u2904',
1439 'nvinfin;': '\u29de',
1440 'nvlArr;': '\u2902',
1441 'nvle;': '\u2264\u20d2',
1442 'nvlt;': '<\u20d2',
1443 'nvltrie;': '\u22b4\u20d2',
1444 'nvrArr;': '\u2903',
1445 'nvrtrie;': '\u22b5\u20d2',
1446 'nvsim;': '\u223c\u20d2',
1447 'nwarhk;': '\u2923',
1448 'nwArr;': '\u21d6',
1449 'nwarr;': '\u2196',
1450 'nwarrow;': '\u2196',
1451 'nwnear;': '\u2927',
1452 'Oacute': '\xd3',
1453 'oacute': '\xf3',
1454 'Oacute;': '\xd3',
1455 'oacute;': '\xf3',
1456 'oast;': '\u229b',
1457 'ocir;': '\u229a',
1458 'Ocirc': '\xd4',
1459 'ocirc': '\xf4',
1460 'Ocirc;': '\xd4',
1461 'ocirc;': '\xf4',
1462 'Ocy;': '\u041e',
1463 'ocy;': '\u043e',
1464 'odash;': '\u229d',
1465 'Odblac;': '\u0150',
1466 'odblac;': '\u0151',
1467 'odiv;': '\u2a38',
1468 'odot;': '\u2299',
1469 'odsold;': '\u29bc',
1470 'OElig;': '\u0152',
1471 'oelig;': '\u0153',
1472 'ofcir;': '\u29bf',
1473 'Ofr;': '\U0001d512',
1474 'ofr;': '\U0001d52c',
1475 'ogon;': '\u02db',
1476 'Ograve': '\xd2',
1477 'ograve': '\xf2',
1478 'Ograve;': '\xd2',
1479 'ograve;': '\xf2',
1480 'ogt;': '\u29c1',
1481 'ohbar;': '\u29b5',
1482 'ohm;': '\u03a9',
1483 'oint;': '\u222e',
1484 'olarr;': '\u21ba',
1485 'olcir;': '\u29be',
1486 'olcross;': '\u29bb',
1487 'oline;': '\u203e',
1488 'olt;': '\u29c0',
1489 'Omacr;': '\u014c',
1490 'omacr;': '\u014d',
1491 'Omega;': '\u03a9',
1492 'omega;': '\u03c9',
1493 'Omicron;': '\u039f',
1494 'omicron;': '\u03bf',
1495 'omid;': '\u29b6',
1496 'ominus;': '\u2296',
1497 'Oopf;': '\U0001d546',
1498 'oopf;': '\U0001d560',
1499 'opar;': '\u29b7',
1500 'OpenCurlyDoubleQuote;': '\u201c',
1501 'OpenCurlyQuote;': '\u2018',
1502 'operp;': '\u29b9',
1503 'oplus;': '\u2295',
1504 'Or;': '\u2a54',
1505 'or;': '\u2228',
1506 'orarr;': '\u21bb',
1507 'ord;': '\u2a5d',
1508 'order;': '\u2134',
1509 'orderof;': '\u2134',
1510 'ordf': '\xaa',
1511 'ordf;': '\xaa',
1512 'ordm': '\xba',
1513 'ordm;': '\xba',
1514 'origof;': '\u22b6',
1515 'oror;': '\u2a56',
1516 'orslope;': '\u2a57',
1517 'orv;': '\u2a5b',
1518 'oS;': '\u24c8',
1519 'Oscr;': '\U0001d4aa',
1520 'oscr;': '\u2134',
1521 'Oslash': '\xd8',
1522 'oslash': '\xf8',
1523 'Oslash;': '\xd8',
1524 'oslash;': '\xf8',
1525 'osol;': '\u2298',
1526 'Otilde': '\xd5',
1527 'otilde': '\xf5',
1528 'Otilde;': '\xd5',
1529 'otilde;': '\xf5',
1530 'Otimes;': '\u2a37',
1531 'otimes;': '\u2297',
1532 'otimesas;': '\u2a36',
1533 'Ouml': '\xd6',
1534 'ouml': '\xf6',
1535 'Ouml;': '\xd6',
1536 'ouml;': '\xf6',
1537 'ovbar;': '\u233d',
1538 'OverBar;': '\u203e',
1539 'OverBrace;': '\u23de',
1540 'OverBracket;': '\u23b4',
1541 'OverParenthesis;': '\u23dc',
1542 'par;': '\u2225',
1543 'para': '\xb6',
1544 'para;': '\xb6',
1545 'parallel;': '\u2225',
1546 'parsim;': '\u2af3',
1547 'parsl;': '\u2afd',
1548 'part;': '\u2202',
1549 'PartialD;': '\u2202',
1550 'Pcy;': '\u041f',
1551 'pcy;': '\u043f',
1552 'percnt;': '%',
1553 'period;': '.',
1554 'permil;': '\u2030',
1555 'perp;': '\u22a5',
1556 'pertenk;': '\u2031',
1557 'Pfr;': '\U0001d513',
1558 'pfr;': '\U0001d52d',
1559 'Phi;': '\u03a6',
1560 'phi;': '\u03c6',
1561 'phiv;': '\u03d5',
1562 'phmmat;': '\u2133',
1563 'phone;': '\u260e',
1564 'Pi;': '\u03a0',
1565 'pi;': '\u03c0',
1566 'pitchfork;': '\u22d4',
1567 'piv;': '\u03d6',
1568 'planck;': '\u210f',
1569 'planckh;': '\u210e',
1570 'plankv;': '\u210f',
1571 'plus;': '+',
1572 'plusacir;': '\u2a23',
1573 'plusb;': '\u229e',
1574 'pluscir;': '\u2a22',
1575 'plusdo;': '\u2214',
1576 'plusdu;': '\u2a25',
1577 'pluse;': '\u2a72',
1578 'PlusMinus;': '\xb1',
1579 'plusmn': '\xb1',
1580 'plusmn;': '\xb1',
1581 'plussim;': '\u2a26',
1582 'plustwo;': '\u2a27',
1583 'pm;': '\xb1',
1584 'Poincareplane;': '\u210c',
1585 'pointint;': '\u2a15',
1586 'Popf;': '\u2119',
1587 'popf;': '\U0001d561',
1588 'pound': '\xa3',
1589 'pound;': '\xa3',
1590 'Pr;': '\u2abb',
1591 'pr;': '\u227a',
1592 'prap;': '\u2ab7',
1593 'prcue;': '\u227c',
1594 'prE;': '\u2ab3',
1595 'pre;': '\u2aaf',
1596 'prec;': '\u227a',
1597 'precapprox;': '\u2ab7',
1598 'preccurlyeq;': '\u227c',
1599 'Precedes;': '\u227a',
1600 'PrecedesEqual;': '\u2aaf',
1601 'PrecedesSlantEqual;': '\u227c',
1602 'PrecedesTilde;': '\u227e',
1603 'preceq;': '\u2aaf',
1604 'precnapprox;': '\u2ab9',
1605 'precneqq;': '\u2ab5',
1606 'precnsim;': '\u22e8',
1607 'precsim;': '\u227e',
1608 'Prime;': '\u2033',
1609 'prime;': '\u2032',
1610 'primes;': '\u2119',
1611 'prnap;': '\u2ab9',
1612 'prnE;': '\u2ab5',
1613 'prnsim;': '\u22e8',
1614 'prod;': '\u220f',
1615 'Product;': '\u220f',
1616 'profalar;': '\u232e',
1617 'profline;': '\u2312',
1618 'profsurf;': '\u2313',
1619 'prop;': '\u221d',
1620 'Proportion;': '\u2237',
1621 'Proportional;': '\u221d',
1622 'propto;': '\u221d',
1623 'prsim;': '\u227e',
1624 'prurel;': '\u22b0',
1625 'Pscr;': '\U0001d4ab',
1626 'pscr;': '\U0001d4c5',
1627 'Psi;': '\u03a8',
1628 'psi;': '\u03c8',
1629 'puncsp;': '\u2008',
1630 'Qfr;': '\U0001d514',
1631 'qfr;': '\U0001d52e',
1632 'qint;': '\u2a0c',
1633 'Qopf;': '\u211a',
1634 'qopf;': '\U0001d562',
1635 'qprime;': '\u2057',
1636 'Qscr;': '\U0001d4ac',
1637 'qscr;': '\U0001d4c6',
1638 'quaternions;': '\u210d',
1639 'quatint;': '\u2a16',
1640 'quest;': '?',
1641 'questeq;': '\u225f',
1642 'QUOT': '"',
1643 'quot': '"',
1644 'QUOT;': '"',
1645 'quot;': '"',
1646 'rAarr;': '\u21db',
1647 'race;': '\u223d\u0331',
1648 'Racute;': '\u0154',
1649 'racute;': '\u0155',
1650 'radic;': '\u221a',
1651 'raemptyv;': '\u29b3',
1652 'Rang;': '\u27eb',
1653 'rang;': '\u27e9',
1654 'rangd;': '\u2992',
1655 'range;': '\u29a5',
1656 'rangle;': '\u27e9',
1657 'raquo': '\xbb',
1658 'raquo;': '\xbb',
1659 'Rarr;': '\u21a0',
1660 'rArr;': '\u21d2',
1661 'rarr;': '\u2192',
1662 'rarrap;': '\u2975',
1663 'rarrb;': '\u21e5',
1664 'rarrbfs;': '\u2920',
1665 'rarrc;': '\u2933',
1666 'rarrfs;': '\u291e',
1667 'rarrhk;': '\u21aa',
1668 'rarrlp;': '\u21ac',
1669 'rarrpl;': '\u2945',
1670 'rarrsim;': '\u2974',
1671 'Rarrtl;': '\u2916',
1672 'rarrtl;': '\u21a3',
1673 'rarrw;': '\u219d',
1674 'rAtail;': '\u291c',
1675 'ratail;': '\u291a',
1676 'ratio;': '\u2236',
1677 'rationals;': '\u211a',
1678 'RBarr;': '\u2910',
1679 'rBarr;': '\u290f',
1680 'rbarr;': '\u290d',
1681 'rbbrk;': '\u2773',
1682 'rbrace;': '}',
1683 'rbrack;': ']',
1684 'rbrke;': '\u298c',
1685 'rbrksld;': '\u298e',
1686 'rbrkslu;': '\u2990',
1687 'Rcaron;': '\u0158',
1688 'rcaron;': '\u0159',
1689 'Rcedil;': '\u0156',
1690 'rcedil;': '\u0157',
1691 'rceil;': '\u2309',
1692 'rcub;': '}',
1693 'Rcy;': '\u0420',
1694 'rcy;': '\u0440',
1695 'rdca;': '\u2937',
1696 'rdldhar;': '\u2969',
1697 'rdquo;': '\u201d',
1698 'rdquor;': '\u201d',
1699 'rdsh;': '\u21b3',
1700 'Re;': '\u211c',
1701 'real;': '\u211c',
1702 'realine;': '\u211b',
1703 'realpart;': '\u211c',
1704 'reals;': '\u211d',
1705 'rect;': '\u25ad',
1706 'REG': '\xae',
1707 'reg': '\xae',
1708 'REG;': '\xae',
1709 'reg;': '\xae',
1710 'ReverseElement;': '\u220b',
1711 'ReverseEquilibrium;': '\u21cb',
1712 'ReverseUpEquilibrium;': '\u296f',
1713 'rfisht;': '\u297d',
1714 'rfloor;': '\u230b',
1715 'Rfr;': '\u211c',
1716 'rfr;': '\U0001d52f',
1717 'rHar;': '\u2964',
1718 'rhard;': '\u21c1',
1719 'rharu;': '\u21c0',
1720 'rharul;': '\u296c',
1721 'Rho;': '\u03a1',
1722 'rho;': '\u03c1',
1723 'rhov;': '\u03f1',
1724 'RightAngleBracket;': '\u27e9',
1725 'RightArrow;': '\u2192',
1726 'Rightarrow;': '\u21d2',
1727 'rightarrow;': '\u2192',
1728 'RightArrowBar;': '\u21e5',
1729 'RightArrowLeftArrow;': '\u21c4',
1730 'rightarrowtail;': '\u21a3',
1731 'RightCeiling;': '\u2309',
1732 'RightDoubleBracket;': '\u27e7',
1733 'RightDownTeeVector;': '\u295d',
1734 'RightDownVector;': '\u21c2',
1735 'RightDownVectorBar;': '\u2955',
1736 'RightFloor;': '\u230b',
1737 'rightharpoondown;': '\u21c1',
1738 'rightharpoonup;': '\u21c0',
1739 'rightleftarrows;': '\u21c4',
1740 'rightleftharpoons;': '\u21cc',
1741 'rightrightarrows;': '\u21c9',
1742 'rightsquigarrow;': '\u219d',
1743 'RightTee;': '\u22a2',
1744 'RightTeeArrow;': '\u21a6',
1745 'RightTeeVector;': '\u295b',
1746 'rightthreetimes;': '\u22cc',
1747 'RightTriangle;': '\u22b3',
1748 'RightTriangleBar;': '\u29d0',
1749 'RightTriangleEqual;': '\u22b5',
1750 'RightUpDownVector;': '\u294f',
1751 'RightUpTeeVector;': '\u295c',
1752 'RightUpVector;': '\u21be',
1753 'RightUpVectorBar;': '\u2954',
1754 'RightVector;': '\u21c0',
1755 'RightVectorBar;': '\u2953',
1756 'ring;': '\u02da',
1757 'risingdotseq;': '\u2253',
1758 'rlarr;': '\u21c4',
1759 'rlhar;': '\u21cc',
1760 'rlm;': '\u200f',
1761 'rmoust;': '\u23b1',
1762 'rmoustache;': '\u23b1',
1763 'rnmid;': '\u2aee',
1764 'roang;': '\u27ed',
1765 'roarr;': '\u21fe',
1766 'robrk;': '\u27e7',
1767 'ropar;': '\u2986',
1768 'Ropf;': '\u211d',
1769 'ropf;': '\U0001d563',
1770 'roplus;': '\u2a2e',
1771 'rotimes;': '\u2a35',
1772 'RoundImplies;': '\u2970',
1773 'rpar;': ')',
1774 'rpargt;': '\u2994',
1775 'rppolint;': '\u2a12',
1776 'rrarr;': '\u21c9',
1777 'Rrightarrow;': '\u21db',
1778 'rsaquo;': '\u203a',
1779 'Rscr;': '\u211b',
1780 'rscr;': '\U0001d4c7',
1781 'Rsh;': '\u21b1',
1782 'rsh;': '\u21b1',
1783 'rsqb;': ']',
1784 'rsquo;': '\u2019',
1785 'rsquor;': '\u2019',
1786 'rthree;': '\u22cc',
1787 'rtimes;': '\u22ca',
1788 'rtri;': '\u25b9',
1789 'rtrie;': '\u22b5',
1790 'rtrif;': '\u25b8',
1791 'rtriltri;': '\u29ce',
1792 'RuleDelayed;': '\u29f4',
1793 'ruluhar;': '\u2968',
1794 'rx;': '\u211e',
1795 'Sacute;': '\u015a',
1796 'sacute;': '\u015b',
1797 'sbquo;': '\u201a',
1798 'Sc;': '\u2abc',
1799 'sc;': '\u227b',
1800 'scap;': '\u2ab8',
1801 'Scaron;': '\u0160',
1802 'scaron;': '\u0161',
1803 'sccue;': '\u227d',
1804 'scE;': '\u2ab4',
1805 'sce;': '\u2ab0',
1806 'Scedil;': '\u015e',
1807 'scedil;': '\u015f',
1808 'Scirc;': '\u015c',
1809 'scirc;': '\u015d',
1810 'scnap;': '\u2aba',
1811 'scnE;': '\u2ab6',
1812 'scnsim;': '\u22e9',
1813 'scpolint;': '\u2a13',
1814 'scsim;': '\u227f',
1815 'Scy;': '\u0421',
1816 'scy;': '\u0441',
1817 'sdot;': '\u22c5',
1818 'sdotb;': '\u22a1',
1819 'sdote;': '\u2a66',
1820 'searhk;': '\u2925',
1821 'seArr;': '\u21d8',
1822 'searr;': '\u2198',
1823 'searrow;': '\u2198',
1824 'sect': '\xa7',
1825 'sect;': '\xa7',
1826 'semi;': ';',
1827 'seswar;': '\u2929',
1828 'setminus;': '\u2216',
1829 'setmn;': '\u2216',
1830 'sext;': '\u2736',
1831 'Sfr;': '\U0001d516',
1832 'sfr;': '\U0001d530',
1833 'sfrown;': '\u2322',
1834 'sharp;': '\u266f',
1835 'SHCHcy;': '\u0429',
1836 'shchcy;': '\u0449',
1837 'SHcy;': '\u0428',
1838 'shcy;': '\u0448',
1839 'ShortDownArrow;': '\u2193',
1840 'ShortLeftArrow;': '\u2190',
1841 'shortmid;': '\u2223',
1842 'shortparallel;': '\u2225',
1843 'ShortRightArrow;': '\u2192',
1844 'ShortUpArrow;': '\u2191',
1845 'shy': '\xad',
1846 'shy;': '\xad',
1847 'Sigma;': '\u03a3',
1848 'sigma;': '\u03c3',
1849 'sigmaf;': '\u03c2',
1850 'sigmav;': '\u03c2',
1851 'sim;': '\u223c',
1852 'simdot;': '\u2a6a',
1853 'sime;': '\u2243',
1854 'simeq;': '\u2243',
1855 'simg;': '\u2a9e',
1856 'simgE;': '\u2aa0',
1857 'siml;': '\u2a9d',
1858 'simlE;': '\u2a9f',
1859 'simne;': '\u2246',
1860 'simplus;': '\u2a24',
1861 'simrarr;': '\u2972',
1862 'slarr;': '\u2190',
1863 'SmallCircle;': '\u2218',
1864 'smallsetminus;': '\u2216',
1865 'smashp;': '\u2a33',
1866 'smeparsl;': '\u29e4',
1867 'smid;': '\u2223',
1868 'smile;': '\u2323',
1869 'smt;': '\u2aaa',
1870 'smte;': '\u2aac',
1871 'smtes;': '\u2aac\ufe00',
1872 'SOFTcy;': '\u042c',
1873 'softcy;': '\u044c',
1874 'sol;': '/',
1875 'solb;': '\u29c4',
1876 'solbar;': '\u233f',
1877 'Sopf;': '\U0001d54a',
1878 'sopf;': '\U0001d564',
1879 'spades;': '\u2660',
1880 'spadesuit;': '\u2660',
1881 'spar;': '\u2225',
1882 'sqcap;': '\u2293',
1883 'sqcaps;': '\u2293\ufe00',
1884 'sqcup;': '\u2294',
1885 'sqcups;': '\u2294\ufe00',
1886 'Sqrt;': '\u221a',
1887 'sqsub;': '\u228f',
1888 'sqsube;': '\u2291',
1889 'sqsubset;': '\u228f',
1890 'sqsubseteq;': '\u2291',
1891 'sqsup;': '\u2290',
1892 'sqsupe;': '\u2292',
1893 'sqsupset;': '\u2290',
1894 'sqsupseteq;': '\u2292',
1895 'squ;': '\u25a1',
1896 'Square;': '\u25a1',
1897 'square;': '\u25a1',
1898 'SquareIntersection;': '\u2293',
1899 'SquareSubset;': '\u228f',
1900 'SquareSubsetEqual;': '\u2291',
1901 'SquareSuperset;': '\u2290',
1902 'SquareSupersetEqual;': '\u2292',
1903 'SquareUnion;': '\u2294',
1904 'squarf;': '\u25aa',
1905 'squf;': '\u25aa',
1906 'srarr;': '\u2192',
1907 'Sscr;': '\U0001d4ae',
1908 'sscr;': '\U0001d4c8',
1909 'ssetmn;': '\u2216',
1910 'ssmile;': '\u2323',
1911 'sstarf;': '\u22c6',
1912 'Star;': '\u22c6',
1913 'star;': '\u2606',
1914 'starf;': '\u2605',
1915 'straightepsilon;': '\u03f5',
1916 'straightphi;': '\u03d5',
1917 'strns;': '\xaf',
1918 'Sub;': '\u22d0',
1919 'sub;': '\u2282',
1920 'subdot;': '\u2abd',
1921 'subE;': '\u2ac5',
1922 'sube;': '\u2286',
1923 'subedot;': '\u2ac3',
1924 'submult;': '\u2ac1',
1925 'subnE;': '\u2acb',
1926 'subne;': '\u228a',
1927 'subplus;': '\u2abf',
1928 'subrarr;': '\u2979',
1929 'Subset;': '\u22d0',
1930 'subset;': '\u2282',
1931 'subseteq;': '\u2286',
1932 'subseteqq;': '\u2ac5',
1933 'SubsetEqual;': '\u2286',
1934 'subsetneq;': '\u228a',
1935 'subsetneqq;': '\u2acb',
1936 'subsim;': '\u2ac7',
1937 'subsub;': '\u2ad5',
1938 'subsup;': '\u2ad3',
1939 'succ;': '\u227b',
1940 'succapprox;': '\u2ab8',
1941 'succcurlyeq;': '\u227d',
1942 'Succeeds;': '\u227b',
1943 'SucceedsEqual;': '\u2ab0',
1944 'SucceedsSlantEqual;': '\u227d',
1945 'SucceedsTilde;': '\u227f',
1946 'succeq;': '\u2ab0',
1947 'succnapprox;': '\u2aba',
1948 'succneqq;': '\u2ab6',
1949 'succnsim;': '\u22e9',
1950 'succsim;': '\u227f',
1951 'SuchThat;': '\u220b',
1952 'Sum;': '\u2211',
1953 'sum;': '\u2211',
1954 'sung;': '\u266a',
1955 'sup1': '\xb9',
1956 'sup1;': '\xb9',
1957 'sup2': '\xb2',
1958 'sup2;': '\xb2',
1959 'sup3': '\xb3',
1960 'sup3;': '\xb3',
1961 'Sup;': '\u22d1',
1962 'sup;': '\u2283',
1963 'supdot;': '\u2abe',
1964 'supdsub;': '\u2ad8',
1965 'supE;': '\u2ac6',
1966 'supe;': '\u2287',
1967 'supedot;': '\u2ac4',
1968 'Superset;': '\u2283',
1969 'SupersetEqual;': '\u2287',
1970 'suphsol;': '\u27c9',
1971 'suphsub;': '\u2ad7',
1972 'suplarr;': '\u297b',
1973 'supmult;': '\u2ac2',
1974 'supnE;': '\u2acc',
1975 'supne;': '\u228b',
1976 'supplus;': '\u2ac0',
1977 'Supset;': '\u22d1',
1978 'supset;': '\u2283',
1979 'supseteq;': '\u2287',
1980 'supseteqq;': '\u2ac6',
1981 'supsetneq;': '\u228b',
1982 'supsetneqq;': '\u2acc',
1983 'supsim;': '\u2ac8',
1984 'supsub;': '\u2ad4',
1985 'supsup;': '\u2ad6',
1986 'swarhk;': '\u2926',
1987 'swArr;': '\u21d9',
1988 'swarr;': '\u2199',
1989 'swarrow;': '\u2199',
1990 'swnwar;': '\u292a',
1991 'szlig': '\xdf',
1992 'szlig;': '\xdf',
1993 'Tab;': '\t',
1994 'target;': '\u2316',
1995 'Tau;': '\u03a4',
1996 'tau;': '\u03c4',
1997 'tbrk;': '\u23b4',
1998 'Tcaron;': '\u0164',
1999 'tcaron;': '\u0165',
2000 'Tcedil;': '\u0162',
2001 'tcedil;': '\u0163',
2002 'Tcy;': '\u0422',
2003 'tcy;': '\u0442',
2004 'tdot;': '\u20db',
2005 'telrec;': '\u2315',
2006 'Tfr;': '\U0001d517',
2007 'tfr;': '\U0001d531',
2008 'there4;': '\u2234',
2009 'Therefore;': '\u2234',
2010 'therefore;': '\u2234',
2011 'Theta;': '\u0398',
2012 'theta;': '\u03b8',
2013 'thetasym;': '\u03d1',
2014 'thetav;': '\u03d1',
2015 'thickapprox;': '\u2248',
2016 'thicksim;': '\u223c',
2017 'ThickSpace;': '\u205f\u200a',
2018 'thinsp;': '\u2009',
2019 'ThinSpace;': '\u2009',
2020 'thkap;': '\u2248',
2021 'thksim;': '\u223c',
2022 'THORN': '\xde',
2023 'thorn': '\xfe',
2024 'THORN;': '\xde',
2025 'thorn;': '\xfe',
2026 'Tilde;': '\u223c',
2027 'tilde;': '\u02dc',
2028 'TildeEqual;': '\u2243',
2029 'TildeFullEqual;': '\u2245',
2030 'TildeTilde;': '\u2248',
2031 'times': '\xd7',
2032 'times;': '\xd7',
2033 'timesb;': '\u22a0',
2034 'timesbar;': '\u2a31',
2035 'timesd;': '\u2a30',
2036 'tint;': '\u222d',
2037 'toea;': '\u2928',
2038 'top;': '\u22a4',
2039 'topbot;': '\u2336',
2040 'topcir;': '\u2af1',
2041 'Topf;': '\U0001d54b',
2042 'topf;': '\U0001d565',
2043 'topfork;': '\u2ada',
2044 'tosa;': '\u2929',
2045 'tprime;': '\u2034',
2046 'TRADE;': '\u2122',
2047 'trade;': '\u2122',
2048 'triangle;': '\u25b5',
2049 'triangledown;': '\u25bf',
2050 'triangleleft;': '\u25c3',
2051 'trianglelefteq;': '\u22b4',
2052 'triangleq;': '\u225c',
2053 'triangleright;': '\u25b9',
2054 'trianglerighteq;': '\u22b5',
2055 'tridot;': '\u25ec',
2056 'trie;': '\u225c',
2057 'triminus;': '\u2a3a',
2058 'TripleDot;': '\u20db',
2059 'triplus;': '\u2a39',
2060 'trisb;': '\u29cd',
2061 'tritime;': '\u2a3b',
2062 'trpezium;': '\u23e2',
2063 'Tscr;': '\U0001d4af',
2064 'tscr;': '\U0001d4c9',
2065 'TScy;': '\u0426',
2066 'tscy;': '\u0446',
2067 'TSHcy;': '\u040b',
2068 'tshcy;': '\u045b',
2069 'Tstrok;': '\u0166',
2070 'tstrok;': '\u0167',
2071 'twixt;': '\u226c',
2072 'twoheadleftarrow;': '\u219e',
2073 'twoheadrightarrow;': '\u21a0',
2074 'Uacute': '\xda',
2075 'uacute': '\xfa',
2076 'Uacute;': '\xda',
2077 'uacute;': '\xfa',
2078 'Uarr;': '\u219f',
2079 'uArr;': '\u21d1',
2080 'uarr;': '\u2191',
2081 'Uarrocir;': '\u2949',
2082 'Ubrcy;': '\u040e',
2083 'ubrcy;': '\u045e',
2084 'Ubreve;': '\u016c',
2085 'ubreve;': '\u016d',
2086 'Ucirc': '\xdb',
2087 'ucirc': '\xfb',
2088 'Ucirc;': '\xdb',
2089 'ucirc;': '\xfb',
2090 'Ucy;': '\u0423',
2091 'ucy;': '\u0443',
2092 'udarr;': '\u21c5',
2093 'Udblac;': '\u0170',
2094 'udblac;': '\u0171',
2095 'udhar;': '\u296e',
2096 'ufisht;': '\u297e',
2097 'Ufr;': '\U0001d518',
2098 'ufr;': '\U0001d532',
2099 'Ugrave': '\xd9',
2100 'ugrave': '\xf9',
2101 'Ugrave;': '\xd9',
2102 'ugrave;': '\xf9',
2103 'uHar;': '\u2963',
2104 'uharl;': '\u21bf',
2105 'uharr;': '\u21be',
2106 'uhblk;': '\u2580',
2107 'ulcorn;': '\u231c',
2108 'ulcorner;': '\u231c',
2109 'ulcrop;': '\u230f',
2110 'ultri;': '\u25f8',
2111 'Umacr;': '\u016a',
2112 'umacr;': '\u016b',
2113 'uml': '\xa8',
2114 'uml;': '\xa8',
2115 'UnderBar;': '_',
2116 'UnderBrace;': '\u23df',
2117 'UnderBracket;': '\u23b5',
2118 'UnderParenthesis;': '\u23dd',
2119 'Union;': '\u22c3',
2120 'UnionPlus;': '\u228e',
2121 'Uogon;': '\u0172',
2122 'uogon;': '\u0173',
2123 'Uopf;': '\U0001d54c',
2124 'uopf;': '\U0001d566',
2125 'UpArrow;': '\u2191',
2126 'Uparrow;': '\u21d1',
2127 'uparrow;': '\u2191',
2128 'UpArrowBar;': '\u2912',
2129 'UpArrowDownArrow;': '\u21c5',
2130 'UpDownArrow;': '\u2195',
2131 'Updownarrow;': '\u21d5',
2132 'updownarrow;': '\u2195',
2133 'UpEquilibrium;': '\u296e',
2134 'upharpoonleft;': '\u21bf',
2135 'upharpoonright;': '\u21be',
2136 'uplus;': '\u228e',
2137 'UpperLeftArrow;': '\u2196',
2138 'UpperRightArrow;': '\u2197',
2139 'Upsi;': '\u03d2',
2140 'upsi;': '\u03c5',
2141 'upsih;': '\u03d2',
2142 'Upsilon;': '\u03a5',
2143 'upsilon;': '\u03c5',
2144 'UpTee;': '\u22a5',
2145 'UpTeeArrow;': '\u21a5',
2146 'upuparrows;': '\u21c8',
2147 'urcorn;': '\u231d',
2148 'urcorner;': '\u231d',
2149 'urcrop;': '\u230e',
2150 'Uring;': '\u016e',
2151 'uring;': '\u016f',
2152 'urtri;': '\u25f9',
2153 'Uscr;': '\U0001d4b0',
2154 'uscr;': '\U0001d4ca',
2155 'utdot;': '\u22f0',
2156 'Utilde;': '\u0168',
2157 'utilde;': '\u0169',
2158 'utri;': '\u25b5',
2159 'utrif;': '\u25b4',
2160 'uuarr;': '\u21c8',
2161 'Uuml': '\xdc',
2162 'uuml': '\xfc',
2163 'Uuml;': '\xdc',
2164 'uuml;': '\xfc',
2165 'uwangle;': '\u29a7',
2166 'vangrt;': '\u299c',
2167 'varepsilon;': '\u03f5',
2168 'varkappa;': '\u03f0',
2169 'varnothing;': '\u2205',
2170 'varphi;': '\u03d5',
2171 'varpi;': '\u03d6',
2172 'varpropto;': '\u221d',
2173 'vArr;': '\u21d5',
2174 'varr;': '\u2195',
2175 'varrho;': '\u03f1',
2176 'varsigma;': '\u03c2',
2177 'varsubsetneq;': '\u228a\ufe00',
2178 'varsubsetneqq;': '\u2acb\ufe00',
2179 'varsupsetneq;': '\u228b\ufe00',
2180 'varsupsetneqq;': '\u2acc\ufe00',
2181 'vartheta;': '\u03d1',
2182 'vartriangleleft;': '\u22b2',
2183 'vartriangleright;': '\u22b3',
2184 'Vbar;': '\u2aeb',
2185 'vBar;': '\u2ae8',
2186 'vBarv;': '\u2ae9',
2187 'Vcy;': '\u0412',
2188 'vcy;': '\u0432',
2189 'VDash;': '\u22ab',
2190 'Vdash;': '\u22a9',
2191 'vDash;': '\u22a8',
2192 'vdash;': '\u22a2',
2193 'Vdashl;': '\u2ae6',
2194 'Vee;': '\u22c1',
2195 'vee;': '\u2228',
2196 'veebar;': '\u22bb',
2197 'veeeq;': '\u225a',
2198 'vellip;': '\u22ee',
2199 'Verbar;': '\u2016',
2200 'verbar;': '|',
2201 'Vert;': '\u2016',
2202 'vert;': '|',
2203 'VerticalBar;': '\u2223',
2204 'VerticalLine;': '|',
2205 'VerticalSeparator;': '\u2758',
2206 'VerticalTilde;': '\u2240',
2207 'VeryThinSpace;': '\u200a',
2208 'Vfr;': '\U0001d519',
2209 'vfr;': '\U0001d533',
2210 'vltri;': '\u22b2',
2211 'vnsub;': '\u2282\u20d2',
2212 'vnsup;': '\u2283\u20d2',
2213 'Vopf;': '\U0001d54d',
2214 'vopf;': '\U0001d567',
2215 'vprop;': '\u221d',
2216 'vrtri;': '\u22b3',
2217 'Vscr;': '\U0001d4b1',
2218 'vscr;': '\U0001d4cb',
2219 'vsubnE;': '\u2acb\ufe00',
2220 'vsubne;': '\u228a\ufe00',
2221 'vsupnE;': '\u2acc\ufe00',
2222 'vsupne;': '\u228b\ufe00',
2223 'Vvdash;': '\u22aa',
2224 'vzigzag;': '\u299a',
2225 'Wcirc;': '\u0174',
2226 'wcirc;': '\u0175',
2227 'wedbar;': '\u2a5f',
2228 'Wedge;': '\u22c0',
2229 'wedge;': '\u2227',
2230 'wedgeq;': '\u2259',
2231 'weierp;': '\u2118',
2232 'Wfr;': '\U0001d51a',
2233 'wfr;': '\U0001d534',
2234 'Wopf;': '\U0001d54e',
2235 'wopf;': '\U0001d568',
2236 'wp;': '\u2118',
2237 'wr;': '\u2240',
2238 'wreath;': '\u2240',
2239 'Wscr;': '\U0001d4b2',
2240 'wscr;': '\U0001d4cc',
2241 'xcap;': '\u22c2',
2242 'xcirc;': '\u25ef',
2243 'xcup;': '\u22c3',
2244 'xdtri;': '\u25bd',
2245 'Xfr;': '\U0001d51b',
2246 'xfr;': '\U0001d535',
2247 'xhArr;': '\u27fa',
2248 'xharr;': '\u27f7',
2249 'Xi;': '\u039e',
2250 'xi;': '\u03be',
2251 'xlArr;': '\u27f8',
2252 'xlarr;': '\u27f5',
2253 'xmap;': '\u27fc',
2254 'xnis;': '\u22fb',
2255 'xodot;': '\u2a00',
2256 'Xopf;': '\U0001d54f',
2257 'xopf;': '\U0001d569',
2258 'xoplus;': '\u2a01',
2259 'xotime;': '\u2a02',
2260 'xrArr;': '\u27f9',
2261 'xrarr;': '\u27f6',
2262 'Xscr;': '\U0001d4b3',
2263 'xscr;': '\U0001d4cd',
2264 'xsqcup;': '\u2a06',
2265 'xuplus;': '\u2a04',
2266 'xutri;': '\u25b3',
2267 'xvee;': '\u22c1',
2268 'xwedge;': '\u22c0',
2269 'Yacute': '\xdd',
2270 'yacute': '\xfd',
2271 'Yacute;': '\xdd',
2272 'yacute;': '\xfd',
2273 'YAcy;': '\u042f',
2274 'yacy;': '\u044f',
2275 'Ycirc;': '\u0176',
2276 'ycirc;': '\u0177',
2277 'Ycy;': '\u042b',
2278 'ycy;': '\u044b',
2279 'yen': '\xa5',
2280 'yen;': '\xa5',
2281 'Yfr;': '\U0001d51c',
2282 'yfr;': '\U0001d536',
2283 'YIcy;': '\u0407',
2284 'yicy;': '\u0457',
2285 'Yopf;': '\U0001d550',
2286 'yopf;': '\U0001d56a',
2287 'Yscr;': '\U0001d4b4',
2288 'yscr;': '\U0001d4ce',
2289 'YUcy;': '\u042e',
2290 'yucy;': '\u044e',
2291 'yuml': '\xff',
2292 'Yuml;': '\u0178',
2293 'yuml;': '\xff',
2294 'Zacute;': '\u0179',
2295 'zacute;': '\u017a',
2296 'Zcaron;': '\u017d',
2297 'zcaron;': '\u017e',
2298 'Zcy;': '\u0417',
2299 'zcy;': '\u0437',
2300 'Zdot;': '\u017b',
2301 'zdot;': '\u017c',
2302 'zeetrf;': '\u2128',
2303 'ZeroWidthSpace;': '\u200b',
2304 'Zeta;': '\u0396',
2305 'zeta;': '\u03b6',
2306 'Zfr;': '\u2128',
2307 'zfr;': '\U0001d537',
2308 'ZHcy;': '\u0416',
2309 'zhcy;': '\u0436',
2310 'zigrarr;': '\u21dd',
2311 'Zopf;': '\u2124',
2312 'zopf;': '\U0001d56b',
2313 'Zscr;': '\U0001d4b5',
2314 'zscr;': '\U0001d4cf',
2315 'zwj;': '\u200d',
2316 'zwnj;': '\u200c',
2317 }
2318
8c25f81b
PH
2319try:
2320 import http.client as compat_http_client
5f6a1245 2321except ImportError: # Python 2
8c25f81b
PH
2322 import httplib as compat_http_client
2323
2324try:
2325 from urllib.error import HTTPError as compat_HTTPError
2326except ImportError: # Python 2
2327 from urllib2 import HTTPError as compat_HTTPError
2328
2329try:
2330 from urllib.request import urlretrieve as compat_urlretrieve
2331except ImportError: # Python 2
2332 from urllib import urlretrieve as compat_urlretrieve
2333
8bb56eee
BF
2334try:
2335 from html.parser import HTMLParser as compat_HTMLParser
2336except ImportError: # Python 2
2337 from HTMLParser import HTMLParser as compat_HTMLParser
2338
72b40955
S
2339try: # Python 2
2340 from HTMLParser import HTMLParseError as compat_HTMLParseError
2341except ImportError: # Python <3.4
2342 try:
2343 from html.parser import HTMLParseError as compat_HTMLParseError
2344 except ImportError: # Python >3.4
2345
2346 # HTMLParseError has been deprecated in Python 3.3 and removed in
2347 # Python 3.5. Introducing dummy exception for Python >3.5 for compatible
2348 # and uniform cross-version exceptiong handling
2349 class compat_HTMLParseError(Exception):
2350 pass
2351
8c25f81b
PH
2352try:
2353 from subprocess import DEVNULL
2354 compat_subprocess_get_DEVNULL = lambda: DEVNULL
2355except ImportError:
2356 compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2357
83fda3c0
PH
2358try:
2359 import http.server as compat_http_server
2360except ImportError:
2361 import BaseHTTPServer as compat_http_server
2362
953fed28
PH
2363try:
2364 compat_str = unicode # Python 2
2365except NameError:
2366 compat_str = str
2367
8c25f81b 2368try:
55139679 2369 from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
8c25f81b 2370 from urllib.parse import unquote as compat_urllib_parse_unquote
aa99aa4e 2371 from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
55139679 2372except ImportError: # Python 2
22603348 2373 _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
ec85ded8 2374 else re.compile(r'([\x00-\x7f]+)'))
3cc8b4c3 2375
4d08161a 2376 # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
55139679 2377 # implementations from cpython 3.4.3's stdlib. Python 2's version
067aa17e 2378 # is apparently broken (see https://github.com/ytdl-org/youtube-dl/pull/6244)
55139679 2379
c9c854ce 2380 def compat_urllib_parse_unquote_to_bytes(string):
2381 """unquote_to_bytes('abc%20def') -> b'abc def'."""
2382 # Note: strings are encoded as UTF-8. This is only an issue if it contains
2383 # unescaped non-ASCII characters, which URIs should not.
2384 if not string:
2385 # Is it a string-like object?
2386 string.split
2387 return b''
953fed28 2388 if isinstance(string, compat_str):
c9c854ce 2389 string = string.encode('utf-8')
55139679 2390 bits = string.split(b'%')
c9c854ce 2391 if len(bits) == 1:
2392 return string
2393 res = [bits[0]]
2394 append = res.append
c9c854ce 2395 for item in bits[1:]:
2396 try:
55139679 2397 append(compat_urllib_parse._hextochr[item[:2]])
c9c854ce 2398 append(item[2:])
55139679 2399 except KeyError:
c9c854ce 2400 append(b'%')
2401 append(item)
2402 return b''.join(res)
2403
a0f28f90 2404 def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
c9c854ce 2405 """Replace %xx escapes by their single-character equivalent. The optional
2406 encoding and errors parameters specify how to decode percent-encoded
2407 sequences into Unicode characters, as accepted by the bytes.decode()
2408 method.
2409 By default, percent-encoded sequences are decoded with UTF-8, and invalid
2410 sequences are replaced by a placeholder character.
2411
2412 unquote('abc%20def') -> 'abc def'.
2413 """
c9c854ce 2414 if '%' not in string:
2415 string.split
2416 return string
2417 if encoding is None:
2418 encoding = 'utf-8'
2419 if errors is None:
2420 errors = 'replace'
3cc8b4c3 2421 bits = _asciire.split(string)
c9c854ce 2422 res = [bits[0]]
2423 append = res.append
2424 for i in range(1, len(bits), 2):
55139679
S
2425 append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2426 append(bits[i + 1])
c9c854ce 2427 return ''.join(res)
2428
aa99aa4e
S
2429 def compat_urllib_parse_unquote_plus(string, encoding='utf-8', errors='replace'):
2430 """Like unquote(), but also replace plus signs by spaces, as required for
2431 unquoting HTML form values.
2432
2433 unquote_plus('%7e/abc+def') -> '~/abc def'
2434 """
2435 string = string.replace('+', ' ')
2436 return compat_urllib_parse_unquote(string, encoding, errors)
2437
15707c7e
S
2438try:
2439 from urllib.parse import urlencode as compat_urllib_parse_urlencode
2440except ImportError: # Python 2
2441 # Python 2 will choke in urlencode on mixture of byte and unicode strings.
2442 # Possible solutions are to either port it from python 3 with all
2443 # the friends or manually ensure input query contains only byte strings.
2444 # We will stick with latter thus recursively encoding the whole query.
2445 def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'):
2446 def encode_elem(e):
2447 if isinstance(e, dict):
2448 e = encode_dict(e)
2449 elif isinstance(e, (list, tuple,)):
92d5477d
YCH
2450 list_e = encode_list(e)
2451 e = tuple(list_e) if isinstance(e, tuple) else list_e
15707c7e
S
2452 elif isinstance(e, compat_str):
2453 e = e.encode(encoding)
2454 return e
2455
2456 def encode_dict(d):
2457 return dict((encode_elem(k), encode_elem(v)) for k, v in d.items())
2458
2459 def encode_list(l):
2460 return [encode_elem(e) for e in l]
2461
2462 return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq)
2463
0a67a363
YCH
2464try:
2465 from urllib.request import DataHandler as compat_urllib_request_DataHandler
2466except ImportError: # Python < 3.4
2467 # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
2468 class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
2469 def data_open(self, req):
2470 # data URLs as specified in RFC 2397.
2471 #
2472 # ignores POSTed data
2473 #
2474 # syntax:
2475 # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
2476 # mediatype := [ type "/" subtype ] *( ";" parameter )
2477 # data := *urlchar
2478 # parameter := attribute "=" value
2479 url = req.get_full_url()
2480
611c1dd9
S
2481 scheme, data = url.split(':', 1)
2482 mediatype, data = data.split(',', 1)
0a67a363
YCH
2483
2484 # even base64 encoded data URLs might be quoted so unquote in any case:
2485 data = compat_urllib_parse_unquote_to_bytes(data)
611c1dd9 2486 if mediatype.endswith(';base64'):
0a67a363
YCH
2487 data = binascii.a2b_base64(data)
2488 mediatype = mediatype[:-7]
2489
2490 if not mediatype:
611c1dd9 2491 mediatype = 'text/plain;charset=US-ASCII'
0a67a363
YCH
2492
2493 headers = email.message_from_string(
611c1dd9 2494 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
0a67a363
YCH
2495
2496 return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2497
8f9312c3 2498try:
0196149c 2499 compat_basestring = basestring # Python 2
8f9312c3 2500except NameError:
0196149c 2501 compat_basestring = str
8f9312c3
PH
2502
2503try:
2504 compat_chr = unichr # Python 2
2505except NameError:
2506 compat_chr = chr
2507
2508try:
2509 from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2510except ImportError: # Python 2.6
2511 from xml.parsers.expat import ExpatError as compat_xml_parse_error
2512
eb7941e3
YCH
2513
2514etree = xml.etree.ElementTree
2515
2516
2517class _TreeBuilder(etree.TreeBuilder):
2518 def doctype(self, name, pubid, system):
2519 pass
2520
582be358 2521
399f7687
S
2522try:
2523 # xml.etree.ElementTree.Element is a method in Python <=2.6 and
2524 # the following will crash with:
2525 # TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
2526 isinstance(None, xml.etree.ElementTree.Element)
2527 from xml.etree.ElementTree import Element as compat_etree_Element
2528except TypeError: # Python <=2.6
2529 from xml.etree.ElementTree import _ElementInterface as compat_etree_Element
2530
36e6f62c 2531if sys.version_info[0] >= 3:
eb7941e3
YCH
2532 def compat_etree_fromstring(text):
2533 return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
36e6f62c 2534else:
ae37338e
JMF
2535 # python 2.x tries to encode unicode strings with ascii (see the
2536 # XMLParser._fixtext method)
f7854627
JMF
2537 try:
2538 _etree_iter = etree.Element.iter
2539 except AttributeError: # Python <=2.6
2540 def _etree_iter(root):
2541 for el in root.findall('*'):
2542 yield el
2543 for sub in _etree_iter(el):
2544 yield sub
2545
36e6f62c
JMF
2546 # on 2.6 XML doesn't have a parser argument, function copied from CPython
2547 # 2.7 source
2548 def _XML(text, parser=None):
2549 if not parser:
eb7941e3 2550 parser = etree.XMLParser(target=_TreeBuilder())
36e6f62c
JMF
2551 parser.feed(text)
2552 return parser.close()
2553
2554 def _element_factory(*args, **kwargs):
2555 el = etree.Element(*args, **kwargs)
2556 for k, v in el.items():
387db16a
JMF
2557 if isinstance(v, bytes):
2558 el.set(k, v.decode('utf-8'))
36e6f62c
JMF
2559 return el
2560
2561 def compat_etree_fromstring(text):
eb7941e3 2562 doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
f7854627
JMF
2563 for el in _etree_iter(doc):
2564 if el.text is not None and isinstance(el.text, bytes):
2565 el.text = el.text.decode('utf-8')
2566 return doc
8c25f81b 2567
c2d9c25f
RA
2568if hasattr(etree, 'register_namespace'):
2569 compat_etree_register_namespace = etree.register_namespace
2570else:
2571 def compat_etree_register_namespace(prefix, uri):
2572 """Register a namespace prefix.
2573 The registry is global, and any existing mapping for either the
2574 given prefix or the namespace URI will be removed.
2575 *prefix* is the namespace prefix, *uri* is a namespace uri. Tags and
2576 attributes in this namespace will be serialized with prefix if possible.
2577 ValueError is raised if prefix is reserved or is invalid.
2578 """
2579 if re.match(r"ns\d+$", prefix):
2580 raise ValueError("Prefix format reserved for internal use")
2581 for k, v in list(etree._namespace_map.items()):
2582 if k == uri or v == prefix:
2583 del etree._namespace_map[k]
2584 etree._namespace_map[uri] = prefix
2585
57f7e3c6
S
2586if sys.version_info < (2, 7):
2587 # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2588 # .//node does not match if a node is a direct child of . !
2589 def compat_xpath(xpath):
2590 if isinstance(xpath, compat_str):
2591 xpath = xpath.encode('ascii')
2592 return xpath
2593else:
2594 compat_xpath = lambda xpath: xpath
2595
8c25f81b
PH
2596try:
2597 from urllib.parse import parse_qs as compat_parse_qs
5f6a1245 2598except ImportError: # Python 2
8c25f81b
PH
2599 # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2600 # Python 2's version is apparently totally broken
2601
2602 def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
9e1a5b84 2603 encoding='utf-8', errors='replace'):
8f9312c3 2604 qs, _coerce_result = qs, compat_str
8c25f81b
PH
2605 pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2606 r = []
2607 for name_value in pairs:
2608 if not name_value and not strict_parsing:
2609 continue
2610 nv = name_value.split('=', 1)
2611 if len(nv) != 2:
2612 if strict_parsing:
611c1dd9 2613 raise ValueError('bad query field: %r' % (name_value,))
8c25f81b
PH
2614 # Handle case of a control-name with no equal sign
2615 if keep_blank_values:
2616 nv.append('')
2617 else:
2618 continue
2619 if len(nv[1]) or keep_blank_values:
2620 name = nv[0].replace('+', ' ')
2621 name = compat_urllib_parse_unquote(
2622 name, encoding=encoding, errors=errors)
2623 name = _coerce_result(name)
2624 value = nv[1].replace('+', ' ')
2625 value = compat_urllib_parse_unquote(
2626 value, encoding=encoding, errors=errors)
2627 value = _coerce_result(value)
2628 r.append((name, value))
2629 return r
2630
2631 def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
9e1a5b84 2632 encoding='utf-8', errors='replace'):
8c25f81b
PH
2633 parsed_result = {}
2634 pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
9e1a5b84 2635 encoding=encoding, errors=errors)
8c25f81b
PH
2636 for name, value in pairs:
2637 if name in parsed_result:
2638 parsed_result[name].append(value)
2639 else:
2640 parsed_result[name] = [value]
2641 return parsed_result
2642
b08e235f
S
2643
2644compat_os_name = os._name if os.name == 'java' else os.name
2645
2646
2647if compat_os_name == 'nt':
702ccf2d 2648 def compat_shlex_quote(s):
b08e235f
S
2649 return s if re.match(r'^[-_\w./]+$', s) else '"%s"' % s.replace('"', '\\"')
2650else:
2651 try:
2652 from shlex import quote as compat_shlex_quote
2653 except ImportError: # Python < 3.3
2654 def compat_shlex_quote(s):
2655 if re.match(r'^[-_\w./]+$', s):
2656 return s
2657 else:
2658 return "'" + s.replace("'", "'\"'\"'") + "'"
8c25f81b
PH
2659
2660
dfe5fa49 2661try:
ec351872 2662 args = shlex.split('中文')
3089bc74
S
2663 assert (isinstance(args, list)
2664 and isinstance(args[0], compat_str)
2665 and args[0] == '中文')
51f579b6 2666 compat_shlex_split = shlex.split
ec351872 2667except (AssertionError, UnicodeEncodeError):
51f579b6
S
2668 # Working around shlex issue with unicode strings on some python 2
2669 # versions (see http://bugs.python.org/issue1548891)
2670 def compat_shlex_split(s, comments=False, posix=True):
953fed28 2671 if isinstance(s, compat_str):
51f579b6 2672 s = s.encode('utf-8')
dfe5fa49 2673 return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
51f579b6
S
2674
2675
8c25f81b 2676def compat_ord(c):
5f6a1245
JW
2677 if type(c) is int:
2678 return c
2679 else:
2680 return ord(c)
8c25f81b
PH
2681
2682
2683if sys.version_info >= (3, 0):
2684 compat_getenv = os.getenv
2685 compat_expanduser = os.path.expanduser
fe40f9ee
S
2686
2687 def compat_setenv(key, value, env=os.environ):
2688 env[key] = value
8c25f81b
PH
2689else:
2690 # Environment variables should be decoded with filesystem encoding.
2691 # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2692
2693 def compat_getenv(key, default=None):
2694 from .utils import get_filesystem_encoding
2695 env = os.getenv(key, default)
2696 if env:
2697 env = env.decode(get_filesystem_encoding())
2698 return env
2699
fe40f9ee
S
2700 def compat_setenv(key, value, env=os.environ):
2701 def encode(v):
2702 from .utils import get_filesystem_encoding
2703 return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2704 env[encode(key)] = encode(value)
2705
8c25f81b
PH
2706 # HACK: The default implementations of os.path.expanduser from cpython do not decode
2707 # environment variables with filesystem encoding. We will work around this by
2708 # providing adjusted implementations.
2709 # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2710 # for different platforms with correct environment variables decoding.
2711
e9c0cdd3 2712 if compat_os_name == 'posix':
8c25f81b
PH
2713 def compat_expanduser(path):
2714 """Expand ~ and ~user constructions. If user or $HOME is unknown,
2715 do nothing."""
2716 if not path.startswith('~'):
2717 return path
2718 i = path.find('/', 1)
2719 if i < 0:
2720 i = len(path)
2721 if i == 1:
2722 if 'HOME' not in os.environ:
2723 import pwd
2724 userhome = pwd.getpwuid(os.getuid()).pw_dir
2725 else:
2726 userhome = compat_getenv('HOME')
2727 else:
2728 import pwd
2729 try:
2730 pwent = pwd.getpwnam(path[1:i])
2731 except KeyError:
2732 return path
2733 userhome = pwent.pw_dir
2734 userhome = userhome.rstrip('/')
2735 return (userhome + path[i:]) or '/'
40fcba5e 2736 elif compat_os_name in ('nt', 'ce'):
8c25f81b
PH
2737 def compat_expanduser(path):
2738 """Expand ~ and ~user constructs.
2739
2740 If user or $HOME is unknown, do nothing."""
2741 if path[:1] != '~':
2742 return path
2743 i, n = 1, len(path)
2744 while i < n and path[i] not in '/\\':
2745 i = i + 1
2746
2747 if 'HOME' in os.environ:
2748 userhome = compat_getenv('HOME')
2749 elif 'USERPROFILE' in os.environ:
2750 userhome = compat_getenv('USERPROFILE')
83e865a3 2751 elif 'HOMEPATH' not in os.environ:
8c25f81b
PH
2752 return path
2753 else:
2754 try:
2755 drive = compat_getenv('HOMEDRIVE')
2756 except KeyError:
2757 drive = ''
2758 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2759
5f6a1245 2760 if i != 1: # ~user
8c25f81b
PH
2761 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2762
2763 return userhome + path[i:]
2764 else:
2765 compat_expanduser = os.path.expanduser
2766
2767
b827ee92
AG
2768if compat_os_name == 'nt' and sys.version_info < (3, 8):
2769 # os.path.realpath on Windows does not follow symbolic links
2770 # prior to Python 3.8 (see https://bugs.python.org/issue9949)
2771 def compat_realpath(path):
2772 while os.path.islink(path):
2773 path = os.path.abspath(os.readlink(path))
2774 return path
2775else:
2776 compat_realpath = os.path.realpath
2777
2778
8c25f81b
PH
2779if sys.version_info < (3, 0):
2780 def compat_print(s):
2781 from .utils import preferredencoding
2782 print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2783else:
2784 def compat_print(s):
b061ea6e 2785 assert isinstance(s, compat_str)
8c25f81b
PH
2786 print(s)
2787
2788
8c25f81b
PH
2789if sys.version_info < (3, 0) and sys.platform == 'win32':
2790 def compat_getpass(prompt, *args, **kwargs):
2791 if isinstance(prompt, compat_str):
baa70803 2792 from .utils import preferredencoding
8c25f81b
PH
2793 prompt = prompt.encode(preferredencoding())
2794 return getpass.getpass(prompt, *args, **kwargs)
2795else:
2796 compat_getpass = getpass.getpass
2797
1ae6c83b
S
2798try:
2799 compat_input = raw_input
2800except NameError: # Python 3
2801 compat_input = input
2802
614db89a 2803# Python < 2.6.5 require kwargs to be bytes
c7b0add8 2804try:
c6973bd4
PH
2805 def _testfunc(x):
2806 pass
2807 _testfunc(**{'x': 0})
c7b0add8
PH
2808except TypeError:
2809 def compat_kwargs(kwargs):
2810 return dict((bytes(k), v) for k, v in kwargs.items())
2811else:
2812 compat_kwargs = lambda kwargs: kwargs
8c25f81b 2813
e07e9313 2814
83121729
S
2815try:
2816 compat_numeric_types = (int, float, long, complex)
2817except NameError: # Python 3
2818 compat_numeric_types = (int, float, complex)
28572a1a
S
2819
2820
075a13d3
S
2821try:
2822 compat_integer_types = (int, long)
2823except NameError: # Python 3
2824 compat_integer_types = (int, )
2825
2826
be4a824d
PH
2827if sys.version_info < (2, 7):
2828 def compat_socket_create_connection(address, timeout, source_address=None):
2829 host, port = address
2830 err = None
2831 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2832 af, socktype, proto, canonname, sa = res
2833 sock = None
2834 try:
2835 sock = socket.socket(af, socktype, proto)
2836 sock.settimeout(timeout)
2837 if source_address:
2838 sock.bind(source_address)
2839 sock.connect(sa)
2840 return sock
2841 except socket.error as _:
2842 err = _
2843 if sock is not None:
2844 sock.close()
2845 if err is not None:
2846 raise err
2847 else:
611c1dd9 2848 raise socket.error('getaddrinfo returns an empty list')
be4a824d
PH
2849else:
2850 compat_socket_create_connection = socket.create_connection
2851
2852
067aa17e 2853# Fix https://github.com/ytdl-org/youtube-dl/issues/4223
e07e9313
PH
2854# See http://bugs.python.org/issue9161 for what is broken
2855def workaround_optparse_bug9161():
07e378fa
PH
2856 op = optparse.OptionParser()
2857 og = optparse.OptionGroup(op, 'foo')
e07e9313 2858 try:
07e378fa 2859 og.add_option('-t')
b244b5c3 2860 except TypeError:
e07e9313
PH
2861 real_add_option = optparse.OptionGroup.add_option
2862
2863 def _compat_add_option(self, *args, **kwargs):
2864 enc = lambda v: (
2865 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2866 else v)
2867 bargs = [enc(a) for a in args]
2868 bkwargs = dict(
2869 (k, enc(v)) for k, v in kwargs.items())
2870 return real_add_option(self, *bargs, **bkwargs)
2871 optparse.OptionGroup.add_option = _compat_add_option
2872
582be358 2873
003c69a8
JMF
2874if hasattr(shutil, 'get_terminal_size'): # Python >= 3.3
2875 compat_get_terminal_size = shutil.get_terminal_size
2876else:
2877 _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2878
13118a50 2879 def compat_get_terminal_size(fallback=(80, 24)):
4810c48d 2880 columns = compat_getenv('COLUMNS')
003c69a8
JMF
2881 if columns:
2882 columns = int(columns)
2883 else:
2884 columns = None
4810c48d 2885 lines = compat_getenv('LINES')
003c69a8
JMF
2886 if lines:
2887 lines = int(lines)
2888 else:
2889 lines = None
2890
4810c48d 2891 if columns is None or lines is None or columns <= 0 or lines <= 0:
13118a50
YCH
2892 try:
2893 sp = subprocess.Popen(
2894 ['stty', 'size'],
2895 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2896 out, err = sp.communicate()
f2dbc540 2897 _lines, _columns = map(int, out.split())
13118a50
YCH
2898 except Exception:
2899 _columns, _lines = _terminal_size(*fallback)
2900
4810c48d 2901 if columns is None or columns <= 0:
13118a50 2902 columns = _columns
4810c48d 2903 if lines is None or lines <= 0:
13118a50 2904 lines = _lines
003c69a8
JMF
2905 return _terminal_size(columns, lines)
2906
a0e060ac
YCH
2907try:
2908 itertools.count(start=0, step=1)
2909 compat_itertools_count = itertools.count
2910except TypeError: # Python 2.6
2911 def compat_itertools_count(start=0, step=1):
2912 n = start
2913 while True:
2914 yield n
2915 n += step
e07e9313 2916
67134eab
JMF
2917if sys.version_info >= (3, 0):
2918 from tokenize import tokenize as compat_tokenize_tokenize
2919else:
2920 from tokenize import generate_tokens as compat_tokenize_tokenize
e07e9313 2921
dab0daee
YCH
2922
2923try:
2924 struct.pack('!I', 0)
2925except TypeError:
2926 # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2927 # See https://bugs.python.org/issue19099
edaa23f8 2928 def compat_struct_pack(spec, *args):
dab0daee
YCH
2929 if isinstance(spec, compat_str):
2930 spec = spec.encode('ascii')
2931 return struct.pack(spec, *args)
2932
edaa23f8 2933 def compat_struct_unpack(spec, *args):
dab0daee
YCH
2934 if isinstance(spec, compat_str):
2935 spec = spec.encode('ascii')
2936 return struct.unpack(spec, *args)
65220c3b
S
2937
2938 class compat_Struct(struct.Struct):
2939 def __init__(self, fmt):
2940 if isinstance(fmt, compat_str):
2941 fmt = fmt.encode('ascii')
2942 super(compat_Struct, self).__init__(fmt)
dab0daee 2943else:
edaa23f8
YCH
2944 compat_struct_pack = struct.pack
2945 compat_struct_unpack = struct.unpack
65220c3b
S
2946 if platform.python_implementation() == 'IronPython' and sys.version_info < (2, 7, 8):
2947 class compat_Struct(struct.Struct):
2948 def unpack(self, string):
9a340af3
S
2949 if not isinstance(string, buffer): # noqa: F821
2950 string = buffer(string) # noqa: F821
65220c3b
S
2951 return super(compat_Struct, self).unpack(string)
2952 else:
2953 compat_Struct = struct.Struct
2954
dab0daee 2955
2384f5a6
TI
2956try:
2957 from future_builtins import zip as compat_zip
2958except ImportError: # not 2.6+ or is 3.x
2959 try:
2960 from itertools import izip as compat_zip # < 2.5 or 3.x
2961 except ImportError:
2962 compat_zip = zip
dab0daee 2963
f206126d
S
2964
2965if sys.version_info < (3, 3):
2966 def compat_b64decode(s, *args, **kwargs):
2967 if isinstance(s, compat_str):
2968 s = s.encode('ascii')
2969 return base64.b64decode(s, *args, **kwargs)
2970else:
2971 compat_b64decode = base64.b64decode
2972
2973
d7cd9a9e
PH
2974if platform.python_implementation() == 'PyPy' and sys.pypy_version_info < (5, 4, 0):
2975 # PyPy2 prior to version 5.4.0 expects byte strings as Windows function
2976 # names, see the original PyPy issue [1] and the youtube-dl one [2].
2977 # 1. https://bitbucket.org/pypy/pypy/issues/2360/windows-ctypescdll-typeerror-function-name
067aa17e 2978 # 2. https://github.com/ytdl-org/youtube-dl/pull/4392
d7cd9a9e
PH
2979 def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2980 real = ctypes.WINFUNCTYPE(*args, **kwargs)
2981
2982 def resf(tpl, *args, **kwargs):
2983 funcname, dll = tpl
2984 return real((str(funcname), dll), *args, **kwargs)
2985
2986 return resf
2987else:
2988 def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2989 return ctypes.WINFUNCTYPE(*args, **kwargs)
2990
2991
8c25f81b 2992__all__ = [
b081f53b 2993 'compat_HTMLParseError',
8bb56eee 2994 'compat_HTMLParser',
8c25f81b 2995 'compat_HTTPError',
65220c3b 2996 'compat_Struct',
f206126d 2997 'compat_b64decode',
0196149c 2998 'compat_basestring',
8c25f81b
PH
2999 'compat_chr',
3000 'compat_cookiejar',
b827ee92 3001 'compat_cookiejar_Cookie',
799207e8 3002 'compat_cookies',
d7cd9a9e 3003 'compat_ctypes_WINFUNCTYPE',
399f7687 3004 'compat_etree_Element',
36e6f62c 3005 'compat_etree_fromstring',
da162c11 3006 'compat_etree_register_namespace',
8c25f81b 3007 'compat_expanduser',
003c69a8 3008 'compat_get_terminal_size',
8c25f81b
PH
3009 'compat_getenv',
3010 'compat_getpass',
3011 'compat_html_entities',
9631a94f 3012 'compat_html_entities_html5',
8c25f81b 3013 'compat_http_client',
83fda3c0 3014 'compat_http_server',
e67f6880 3015 'compat_input',
075a13d3 3016 'compat_integer_types',
a0e060ac 3017 'compat_itertools_count',
c7b0add8 3018 'compat_kwargs',
28572a1a 3019 'compat_numeric_types',
8c25f81b 3020 'compat_ord',
e9c0cdd3 3021 'compat_os_name',
8c25f81b
PH
3022 'compat_parse_qs',
3023 'compat_print',
b827ee92 3024 'compat_realpath',
fe40f9ee 3025 'compat_setenv',
702ccf2d 3026 'compat_shlex_quote',
51f579b6 3027 'compat_shlex_split',
be4a824d 3028 'compat_socket_create_connection',
987493ae 3029 'compat_str',
edaa23f8
YCH
3030 'compat_struct_pack',
3031 'compat_struct_unpack',
8c25f81b 3032 'compat_subprocess_get_DEVNULL',
67134eab 3033 'compat_tokenize_tokenize',
8c25f81b
PH
3034 'compat_urllib_error',
3035 'compat_urllib_parse',
3036 'compat_urllib_parse_unquote',
aa99aa4e 3037 'compat_urllib_parse_unquote_plus',
9fefc886 3038 'compat_urllib_parse_unquote_to_bytes',
15707c7e 3039 'compat_urllib_parse_urlencode',
8c25f81b
PH
3040 'compat_urllib_parse_urlparse',
3041 'compat_urllib_request',
0a67a363
YCH
3042 'compat_urllib_request_DataHandler',
3043 'compat_urllib_response',
8c25f81b
PH
3044 'compat_urlparse',
3045 'compat_urlretrieve',
3046 'compat_xml_parse_error',
57f7e3c6 3047 'compat_xpath',
2384f5a6 3048 'compat_zip',
e07e9313 3049 'workaround_optparse_bug9161',
8c25f81b 3050]