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