[ChangeLog] Actualize
[youtube-dl] / youtube_dl / compat.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import base64
5 import binascii
6 import collections
7 import ctypes
8 import email
9 import getpass
10 import io
11 import itertools
12 import optparse
13 import os
14 import platform
15 import re
16 import shlex
17 import shutil
18 import socket
19 import struct
20 import subprocess
21 import sys
22 import xml.etree.ElementTree
23
24
25 try:
26     import urllib.request as compat_urllib_request
27 except ImportError:  # Python 2
28     import urllib2 as compat_urllib_request
29
30 try:
31     import urllib.error as compat_urllib_error
32 except ImportError:  # Python 2
33     import urllib2 as compat_urllib_error
34
35 try:
36     import urllib.parse as compat_urllib_parse
37 except ImportError:  # Python 2
38     import urllib as compat_urllib_parse
39
40 try:
41     from urllib.parse import urlparse as compat_urllib_parse_urlparse
42 except ImportError:  # Python 2
43     from urlparse import urlparse as compat_urllib_parse_urlparse
44
45 try:
46     import urllib.parse as compat_urlparse
47 except ImportError:  # Python 2
48     import urlparse as compat_urlparse
49
50 try:
51     import urllib.response as compat_urllib_response
52 except ImportError:  # Python 2
53     import urllib as compat_urllib_response
54
55 try:
56     import http.cookiejar as compat_cookiejar
57 except ImportError:  # Python 2
58     import cookielib as compat_cookiejar
59
60 if 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)
68 else:
69     compat_cookiejar_Cookie = compat_cookiejar.Cookie
70
71 try:
72     import http.cookies as compat_cookies
73 except ImportError:  # Python 2
74     import Cookie as compat_cookies
75
76 try:
77     import html.entities as compat_html_entities
78 except ImportError:  # Python 2
79     import htmlentitydefs as compat_html_entities
80
81 try:  # Python >= 3.3
82     compat_html_entities_html5 = compat_html_entities.html5
83 except AttributeError:
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
2319 try:
2320     import http.client as compat_http_client
2321 except ImportError:  # Python 2
2322     import httplib as compat_http_client
2323
2324 try:
2325     from urllib.error import HTTPError as compat_HTTPError
2326 except ImportError:  # Python 2
2327     from urllib2 import HTTPError as compat_HTTPError
2328
2329 try:
2330     from urllib.request import urlretrieve as compat_urlretrieve
2331 except ImportError:  # Python 2
2332     from urllib import urlretrieve as compat_urlretrieve
2333
2334 try:
2335     from html.parser import HTMLParser as compat_HTMLParser
2336 except ImportError:  # Python 2
2337     from HTMLParser import HTMLParser as compat_HTMLParser
2338
2339 try:  # Python 2
2340     from HTMLParser import HTMLParseError as compat_HTMLParseError
2341 except 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
2352 try:
2353     from subprocess import DEVNULL
2354     compat_subprocess_get_DEVNULL = lambda: DEVNULL
2355 except ImportError:
2356     compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2357
2358 try:
2359     import http.server as compat_http_server
2360 except ImportError:
2361     import BaseHTTPServer as compat_http_server
2362
2363 try:
2364     compat_str = unicode  # Python 2
2365 except NameError:
2366     compat_str = str
2367
2368 try:
2369     from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
2370     from urllib.parse import unquote as compat_urllib_parse_unquote
2371     from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
2372 except ImportError:  # Python 2
2373     _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
2374                 else re.compile(r'([\x00-\x7f]+)'))
2375
2376     # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
2377     # implementations from cpython 3.4.3's stdlib. Python 2's version
2378     # is apparently broken (see https://github.com/ytdl-org/youtube-dl/pull/6244)
2379
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''
2388         if isinstance(string, compat_str):
2389             string = string.encode('utf-8')
2390         bits = string.split(b'%')
2391         if len(bits) == 1:
2392             return string
2393         res = [bits[0]]
2394         append = res.append
2395         for item in bits[1:]:
2396             try:
2397                 append(compat_urllib_parse._hextochr[item[:2]])
2398                 append(item[2:])
2399             except KeyError:
2400                 append(b'%')
2401                 append(item)
2402         return b''.join(res)
2403
2404     def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
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         """
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'
2421         bits = _asciire.split(string)
2422         res = [bits[0]]
2423         append = res.append
2424         for i in range(1, len(bits), 2):
2425             append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2426             append(bits[i + 1])
2427         return ''.join(res)
2428
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
2438 try:
2439     from urllib.parse import urlencode as compat_urllib_parse_urlencode
2440 except 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,)):
2450                 list_e = encode_list(e)
2451                 e = tuple(list_e) if isinstance(e, tuple) else list_e
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
2464 try:
2465     from urllib.request import DataHandler as compat_urllib_request_DataHandler
2466 except 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
2481             scheme, data = url.split(':', 1)
2482             mediatype, data = data.split(',', 1)
2483
2484             # even base64 encoded data URLs might be quoted so unquote in any case:
2485             data = compat_urllib_parse_unquote_to_bytes(data)
2486             if mediatype.endswith(';base64'):
2487                 data = binascii.a2b_base64(data)
2488                 mediatype = mediatype[:-7]
2489
2490             if not mediatype:
2491                 mediatype = 'text/plain;charset=US-ASCII'
2492
2493             headers = email.message_from_string(
2494                 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
2495
2496             return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2497
2498 try:
2499     compat_basestring = basestring  # Python 2
2500 except NameError:
2501     compat_basestring = str
2502
2503 try:
2504     compat_chr = unichr  # Python 2
2505 except NameError:
2506     compat_chr = chr
2507
2508 try:
2509     from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2510 except ImportError:  # Python 2.6
2511     from xml.parsers.expat import ExpatError as compat_xml_parse_error
2512
2513
2514 etree = xml.etree.ElementTree
2515
2516
2517 class _TreeBuilder(etree.TreeBuilder):
2518     def doctype(self, name, pubid, system):
2519         pass
2520
2521
2522 try:
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
2528 except TypeError:  # Python <=2.6
2529     from xml.etree.ElementTree import _ElementInterface as compat_etree_Element
2530
2531 if sys.version_info[0] >= 3:
2532     def compat_etree_fromstring(text):
2533         return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
2534 else:
2535     # python 2.x tries to encode unicode strings with ascii (see the
2536     # XMLParser._fixtext method)
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
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:
2550             parser = etree.XMLParser(target=_TreeBuilder())
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():
2557             if isinstance(v, bytes):
2558                 el.set(k, v.decode('utf-8'))
2559         return el
2560
2561     def compat_etree_fromstring(text):
2562         doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
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
2567
2568 if hasattr(etree, 'register_namespace'):
2569     compat_etree_register_namespace = etree.register_namespace
2570 else:
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
2586 if 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
2593 else:
2594     compat_xpath = lambda xpath: xpath
2595
2596 try:
2597     from urllib.parse import parse_qs as compat_parse_qs
2598 except ImportError:  # Python 2
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,
2603                    encoding='utf-8', errors='replace'):
2604         qs, _coerce_result = qs, compat_str
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:
2613                     raise ValueError('bad query field: %r' % (name_value,))
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,
2632                         encoding='utf-8', errors='replace'):
2633         parsed_result = {}
2634         pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
2635                            encoding=encoding, errors=errors)
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
2643
2644 compat_os_name = os._name if os.name == 'java' else os.name
2645
2646
2647 if compat_os_name == 'nt':
2648     def compat_shlex_quote(s):
2649         return s if re.match(r'^[-_\w./]+$', s) else '"%s"' % s.replace('"', '\\"')
2650 else:
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("'", "'\"'\"'") + "'"
2659
2660
2661 try:
2662     args = shlex.split('中文')
2663     assert (isinstance(args, list)
2664             and isinstance(args[0], compat_str)
2665             and args[0] == '中文')
2666     compat_shlex_split = shlex.split
2667 except (AssertionError, UnicodeEncodeError):
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):
2671         if isinstance(s, compat_str):
2672             s = s.encode('utf-8')
2673         return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
2674
2675
2676 def compat_ord(c):
2677     if type(c) is int:
2678         return c
2679     else:
2680         return ord(c)
2681
2682
2683 if sys.version_info >= (3, 0):
2684     compat_getenv = os.getenv
2685     compat_expanduser = os.path.expanduser
2686
2687     def compat_setenv(key, value, env=os.environ):
2688         env[key] = value
2689 else:
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
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
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
2712     if compat_os_name == 'posix':
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 '/'
2736     elif compat_os_name in ('nt', 'ce'):
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')
2751             elif 'HOMEPATH' not in os.environ:
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
2760             if i != 1:  # ~user
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
2768 if 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
2775 else:
2776     compat_realpath = os.path.realpath
2777
2778
2779 if sys.version_info < (3, 0):
2780     def compat_print(s):
2781         from .utils import preferredencoding
2782         print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2783 else:
2784     def compat_print(s):
2785         assert isinstance(s, compat_str)
2786         print(s)
2787
2788
2789 if sys.version_info < (3, 0) and sys.platform == 'win32':
2790     def compat_getpass(prompt, *args, **kwargs):
2791         if isinstance(prompt, compat_str):
2792             from .utils import preferredencoding
2793             prompt = prompt.encode(preferredencoding())
2794         return getpass.getpass(prompt, *args, **kwargs)
2795 else:
2796     compat_getpass = getpass.getpass
2797
2798 try:
2799     compat_input = raw_input
2800 except NameError:  # Python 3
2801     compat_input = input
2802
2803 # Python < 2.6.5 require kwargs to be bytes
2804 try:
2805     def _testfunc(x):
2806         pass
2807     _testfunc(**{'x': 0})
2808 except TypeError:
2809     def compat_kwargs(kwargs):
2810         return dict((bytes(k), v) for k, v in kwargs.items())
2811 else:
2812     compat_kwargs = lambda kwargs: kwargs
2813
2814
2815 try:
2816     compat_numeric_types = (int, float, long, complex)
2817 except NameError:  # Python 3
2818     compat_numeric_types = (int, float, complex)
2819
2820
2821 try:
2822     compat_integer_types = (int, long)
2823 except NameError:  # Python 3
2824     compat_integer_types = (int, )
2825
2826
2827 if 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:
2848             raise socket.error('getaddrinfo returns an empty list')
2849 else:
2850     compat_socket_create_connection = socket.create_connection
2851
2852
2853 # Fix https://github.com/ytdl-org/youtube-dl/issues/4223
2854 # See http://bugs.python.org/issue9161 for what is broken
2855 def workaround_optparse_bug9161():
2856     op = optparse.OptionParser()
2857     og = optparse.OptionGroup(op, 'foo')
2858     try:
2859         og.add_option('-t')
2860     except TypeError:
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
2873
2874 if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3
2875     compat_get_terminal_size = shutil.get_terminal_size
2876 else:
2877     _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2878
2879     def compat_get_terminal_size(fallback=(80, 24)):
2880         columns = compat_getenv('COLUMNS')
2881         if columns:
2882             columns = int(columns)
2883         else:
2884             columns = None
2885         lines = compat_getenv('LINES')
2886         if lines:
2887             lines = int(lines)
2888         else:
2889             lines = None
2890
2891         if columns is None or lines is None or columns <= 0 or lines <= 0:
2892             try:
2893                 sp = subprocess.Popen(
2894                     ['stty', 'size'],
2895                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2896                 out, err = sp.communicate()
2897                 _lines, _columns = map(int, out.split())
2898             except Exception:
2899                 _columns, _lines = _terminal_size(*fallback)
2900
2901             if columns is None or columns <= 0:
2902                 columns = _columns
2903             if lines is None or lines <= 0:
2904                 lines = _lines
2905         return _terminal_size(columns, lines)
2906
2907 try:
2908     itertools.count(start=0, step=1)
2909     compat_itertools_count = itertools.count
2910 except 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
2916
2917 if sys.version_info >= (3, 0):
2918     from tokenize import tokenize as compat_tokenize_tokenize
2919 else:
2920     from tokenize import generate_tokens as compat_tokenize_tokenize
2921
2922
2923 try:
2924     struct.pack('!I', 0)
2925 except 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
2928     def compat_struct_pack(spec, *args):
2929         if isinstance(spec, compat_str):
2930             spec = spec.encode('ascii')
2931         return struct.pack(spec, *args)
2932
2933     def compat_struct_unpack(spec, *args):
2934         if isinstance(spec, compat_str):
2935             spec = spec.encode('ascii')
2936         return struct.unpack(spec, *args)
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)
2943 else:
2944     compat_struct_pack = struct.pack
2945     compat_struct_unpack = struct.unpack
2946     if platform.python_implementation() == 'IronPython' and sys.version_info < (2, 7, 8):
2947         class compat_Struct(struct.Struct):
2948             def unpack(self, string):
2949                 if not isinstance(string, buffer):  # noqa: F821
2950                     string = buffer(string)  # noqa: F821
2951                 return super(compat_Struct, self).unpack(string)
2952     else:
2953         compat_Struct = struct.Struct
2954
2955
2956 try:
2957     from future_builtins import zip as compat_zip
2958 except 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
2963
2964
2965 if 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)
2970 else:
2971     compat_b64decode = base64.b64decode
2972
2973
2974 if 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
2978     # 2. https://github.com/ytdl-org/youtube-dl/pull/4392
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
2987 else:
2988     def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2989         return ctypes.WINFUNCTYPE(*args, **kwargs)
2990
2991
2992 __all__ = [
2993     'compat_HTMLParseError',
2994     'compat_HTMLParser',
2995     'compat_HTTPError',
2996     'compat_Struct',
2997     'compat_b64decode',
2998     'compat_basestring',
2999     'compat_chr',
3000     'compat_cookiejar',
3001     'compat_cookiejar_Cookie',
3002     'compat_cookies',
3003     'compat_ctypes_WINFUNCTYPE',
3004     'compat_etree_Element',
3005     'compat_etree_fromstring',
3006     'compat_etree_register_namespace',
3007     'compat_expanduser',
3008     'compat_get_terminal_size',
3009     'compat_getenv',
3010     'compat_getpass',
3011     'compat_html_entities',
3012     'compat_html_entities_html5',
3013     'compat_http_client',
3014     'compat_http_server',
3015     'compat_input',
3016     'compat_integer_types',
3017     'compat_itertools_count',
3018     'compat_kwargs',
3019     'compat_numeric_types',
3020     'compat_ord',
3021     'compat_os_name',
3022     'compat_parse_qs',
3023     'compat_print',
3024     'compat_realpath',
3025     'compat_setenv',
3026     'compat_shlex_quote',
3027     'compat_shlex_split',
3028     'compat_socket_create_connection',
3029     'compat_str',
3030     'compat_struct_pack',
3031     'compat_struct_unpack',
3032     'compat_subprocess_get_DEVNULL',
3033     'compat_tokenize_tokenize',
3034     'compat_urllib_error',
3035     'compat_urllib_parse',
3036     'compat_urllib_parse_unquote',
3037     'compat_urllib_parse_unquote_plus',
3038     'compat_urllib_parse_unquote_to_bytes',
3039     'compat_urllib_parse_urlencode',
3040     'compat_urllib_parse_urlparse',
3041     'compat_urllib_request',
3042     'compat_urllib_request_DataHandler',
3043     'compat_urllib_response',
3044     'compat_urlparse',
3045     'compat_urlretrieve',
3046     'compat_xml_parse_error',
3047     'compat_xpath',
3048     'compat_zip',
3049     'workaround_optparse_bug9161',
3050 ]