3
b`߃             %   @   s2  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZ
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZ d dl!Z!ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@ dd ZAeBejCdZDd	d
 ZEeE dddddZFddiZGeH ZIddddddddddddgZJeJddd d!d"d#d$d%d&d'd(d)gd*ZKdZLeMeNdPejOdQdRgdSdTgdUdVdWgdXdYgdZd[gd\d]gd^ZPdZQeReQZSeSjTddddddg eReQZUeUjTdddddg dZVdZWdd ZXdd ZYejZdkrdddZ[ndddZ[dd Z\ddeIfddZ]ddeIfddZ^ddeIfddZ_dd Z`dd Zad	ddZbdd Zcd
ddZdG dd de$Zedd Zfdd Zgdd Zhdd ZidddZjdd Zkdd Zldd Zmdd Zndd ZoddĄ ZpddƄ ZqddȄ ZrdddʄZsddd̄Ztdd΄ ZuddЄ Zvdd҄ ZwddԄ Zxddք Zydd؄ ZzG ddڄ de{Z|G dd܄ de|Z}G ddބ de}Z~G dd de}ZG dd de}ZG dd de|ZG dd de|ZG dd de|ZG dd de|ZG dd de|ZG dd de|ZG dd de|ZG dd de|Zdd Zdd ZG dd de;jZdd ZG dd de;jZG dd de'jZG dd  d e;jZG dd de;jZdd ZdddZddd	Zdd
dZdddZdddZdddZdd Zdd ZG dd deHZdd Zdd ZdddZdd  Zd!d" Zejd#krd dlZd dlZG d$d% d%ejZejjZejZejjejjejjejjejjejege_ejje_ejZejjejjejjejjejege_ejje_d&Zd'Zd(d) Zd*d+ ZnZy$d dlZd,d) Zd-d+ ZW n4 ek
r<   d.Zd/d) Zd0d+ ZY nX G d1d2 d2eHZd3d4 Zd5d6 Zd7d8 Zdd9d:Zd;d< Zd=d> Zd?d@ ZdAdB ZÐdCdD ZĐdEdF ZŐddHdIZƐdJdK ZǐdLdM ZȐdNdO ZɐdPdQ ZʐdRdS ZːdTdU Z̐dVdW Z͐dXdY ZΐdZd[ ZG d\d] d]e;jЃZG d^d_ d_e;jЃZҐdd`daZӐddbdcZԐddde ZՐddfdgZ֐ddhdiZאddjdkZؐdldm Zِdndo ZڐddpdqZېddrdsZg fdtduZݐdvgddwfdxdyZސddzd{ZG d|d} d}eHZG d~d deZG dd deZdd Zdd Zdd Zdd Zdd Zdd Zdd Zddi i fddZdd ZdddZd ddZd!ddZdd ZeX dfddZd dddddZd dd d dddZdd Zdd Zdd Zdd ZdZdd Zdd Zd"ddZdd Zdd Zdd Zdd Zdd Zdd Z ddÄ ZdĐdń ZdƐdǄ ZdȐdɄ Zdʐd˄ Zd̐d̈́ Zdΐdτ ZdАdф ZdҐdӄ Z	dԐdՄ Z
d֐dׄ Zdؐdل Zd#dܐd݄Zd$dސd߄Zg fddZG dd deHZG dd deHZG dd deHZG dd de;jZd%ddZdd Zdd Zdd Zd&ddZdd Zdd Zdd Zdd Zdd Zdd Zd d Z dd Z!dS ('      )unicode_literalsN   )compat_HTMLParseErrorcompat_HTMLParsercompat_basestring
compat_chrcompat_cookiejarcompat_ctypes_WINFUNCTYPEcompat_etree_fromstringcompat_expandusercompat_html_entitiescompat_html_entities_html5compat_http_clientcompat_integer_typescompat_kwargscompat_os_namecompat_parse_qscompat_shlex_quote
compat_strcompat_struct_packcompat_struct_unpackcompat_urllib_errorcompat_urllib_parsecompat_urllib_parse_urlencodecompat_urllib_parse_urlparse compat_urllib_parse_unquote_pluscompat_urllib_requestcompat_urlparsecompat_xpath)	ProxyTypesockssocketc              C   s(   x"dD ]} | t jkrt jj|  qW d S )Nsockssocks4socks4asocks5)r!   r"   r#   r$   )r   uses_netlocappend)scheme r(   AC:\Users\Broad\Desktop\BeinConnetFix\binaries\youtube_dl\utils.pyregister_socks_protocolsI   s    

r*    c           (  C   s   d} d*}| t j| S (+  NzhMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.3674.0.3729.12976.0.3780.376.0.3780.274.0.3729.12876.0.3780.176.0.3780.075.0.3770.1574.0.3729.12774.0.3729.12676.0.3779.176.0.3779.075.0.3770.1474.0.3729.12576.0.3778.176.0.3778.075.0.3770.1374.0.3729.12474.0.3729.12373.0.3683.12176.0.3777.176.0.3777.075.0.3770.1274.0.3729.12276.0.3776.475.0.3770.1174.0.3729.12176.0.3776.376.0.3776.273.0.3683.12074.0.3729.12074.0.3729.11974.0.3729.11876.0.3776.176.0.3776.076.0.3775.575.0.3770.1074.0.3729.11776.0.3775.476.0.3775.374.0.3729.11675.0.3770.976.0.3775.276.0.3775.176.0.3775.075.0.3770.874.0.3729.11574.0.3729.11476.0.3774.176.0.3774.075.0.3770.774.0.3729.11374.0.3729.11274.0.3729.11176.0.3773.176.0.3773.075.0.3770.674.0.3729.11074.0.3729.10976.0.3772.176.0.3772.075.0.3770.574.0.3729.10874.0.3729.10776.0.3771.176.0.3771.075.0.3770.474.0.3729.10674.0.3729.10575.0.3770.374.0.3729.10474.0.3729.10374.0.3729.10275.0.3770.274.0.3729.10175.0.3770.175.0.3770.074.0.3729.10075.0.3769.575.0.3769.474.0.3729.9975.0.3769.375.0.3769.275.0.3768.674.0.3729.9875.0.3769.175.0.3769.074.0.3729.9773.0.3683.11973.0.3683.11874.0.3729.9675.0.3768.575.0.3768.475.0.3768.375.0.3768.274.0.3729.9574.0.3729.9475.0.3768.175.0.3768.074.0.3729.9374.0.3729.9273.0.3683.11774.0.3729.9175.0.3766.374.0.3729.9075.0.3767.275.0.3767.175.0.3767.074.0.3729.8973.0.3683.11675.0.3766.274.0.3729.8875.0.3766.175.0.3766.074.0.3729.8773.0.3683.11574.0.3729.8675.0.3765.175.0.3765.074.0.3729.8573.0.3683.11474.0.3729.8475.0.3764.175.0.3764.074.0.3729.8373.0.3683.11375.0.3763.275.0.3761.474.0.3729.8275.0.3763.175.0.3763.074.0.3729.8173.0.3683.11275.0.3762.175.0.3762.074.0.3729.8075.0.3761.374.0.3729.7973.0.3683.11175.0.3761.274.0.3729.7874.0.3729.7775.0.3761.175.0.3761.073.0.3683.11074.0.3729.7674.0.3729.7575.0.3760.074.0.3729.7475.0.3759.875.0.3759.775.0.3759.674.0.3729.7375.0.3759.574.0.3729.7273.0.3683.10975.0.3759.475.0.3759.374.0.3729.7175.0.3759.274.0.3729.7073.0.3683.10874.0.3729.6975.0.3759.175.0.3759.074.0.3729.6873.0.3683.10774.0.3729.6775.0.3758.175.0.3758.074.0.3729.6673.0.3683.10674.0.3729.6575.0.3757.175.0.3757.074.0.3729.6473.0.3683.10574.0.3729.6375.0.3756.175.0.3756.074.0.3729.6273.0.3683.10475.0.3755.375.0.3755.273.0.3683.10375.0.3755.175.0.3755.074.0.3729.6173.0.3683.10274.0.3729.6075.0.3754.274.0.3729.5975.0.3753.474.0.3729.5875.0.3754.175.0.3754.074.0.3729.5773.0.3683.10175.0.3753.375.0.3752.275.0.3753.274.0.3729.5675.0.3753.175.0.3753.074.0.3729.5573.0.3683.10074.0.3729.5475.0.3752.175.0.3752.074.0.3729.5373.0.3683.9974.0.3729.5275.0.3751.175.0.3751.074.0.3729.5173.0.3683.9874.0.3729.5075.0.3750.074.0.3729.4974.0.3729.4874.0.3729.4775.0.3749.374.0.3729.4673.0.3683.9775.0.3749.274.0.3729.4575.0.3749.175.0.3749.074.0.3729.4473.0.3683.9674.0.3729.4374.0.3729.4275.0.3748.175.0.3748.074.0.3729.4175.0.3747.173.0.3683.9575.0.3746.474.0.3729.4074.0.3729.3975.0.3747.075.0.3746.375.0.3746.274.0.3729.3875.0.3746.175.0.3746.074.0.3729.3773.0.3683.9475.0.3745.575.0.3745.475.0.3745.375.0.3745.274.0.3729.3675.0.3745.175.0.3745.075.0.3744.274.0.3729.3573.0.3683.9374.0.3729.3475.0.3744.175.0.3744.074.0.3729.3373.0.3683.9274.0.3729.3274.0.3729.3173.0.3683.9175.0.3741.275.0.3740.574.0.3729.3075.0.3741.175.0.3741.074.0.3729.2975.0.3740.473.0.3683.9074.0.3729.2875.0.3740.373.0.3683.8975.0.3740.274.0.3729.2775.0.3740.175.0.3740.074.0.3729.2673.0.3683.8873.0.3683.8774.0.3729.2575.0.3739.175.0.3739.073.0.3683.8674.0.3729.2473.0.3683.8575.0.3738.475.0.3738.375.0.3738.275.0.3738.175.0.3738.074.0.3729.2373.0.3683.8474.0.3729.2274.0.3729.2175.0.3737.175.0.3737.074.0.3729.2073.0.3683.8374.0.3729.1975.0.3736.175.0.3736.074.0.3729.1873.0.3683.8274.0.3729.1775.0.3735.175.0.3735.074.0.3729.1673.0.3683.8175.0.3734.175.0.3734.074.0.3729.1573.0.3683.8074.0.3729.1475.0.3733.175.0.3733.075.0.3732.174.0.3729.1374.0.3729.1273.0.3683.7974.0.3729.1175.0.3732.074.0.3729.1073.0.3683.7874.0.3729.974.0.3729.874.0.3729.775.0.3731.375.0.3731.275.0.3731.074.0.3729.673.0.3683.7773.0.3683.7675.0.3730.575.0.3730.473.0.3683.7574.0.3729.573.0.3683.7475.0.3730.375.0.3730.274.0.3729.473.0.3683.7373.0.3683.7275.0.3730.175.0.3730.074.0.3729.373.0.3683.7174.0.3729.273.0.3683.7074.0.3729.174.0.3729.074.0.3726.473.0.3683.6974.0.3726.374.0.3728.074.0.3726.273.0.3683.6874.0.3726.174.0.3726.074.0.3725.473.0.3683.6773.0.3683.6674.0.3725.374.0.3725.274.0.3725.174.0.3724.874.0.3725.073.0.3683.6574.0.3724.774.0.3724.674.0.3724.574.0.3724.474.0.3724.374.0.3724.274.0.3724.174.0.3724.073.0.3683.6474.0.3723.174.0.3723.073.0.3683.6374.0.3722.174.0.3722.073.0.3683.6274.0.3718.974.0.3702.374.0.3721.374.0.3721.274.0.3721.174.0.3721.074.0.3720.673.0.3683.6172.0.3626.12273.0.3683.6074.0.3720.572.0.3626.12174.0.3718.874.0.3720.474.0.3720.374.0.3718.774.0.3720.274.0.3720.174.0.3720.074.0.3718.674.0.3719.573.0.3683.5974.0.3718.574.0.3718.474.0.3719.474.0.3719.374.0.3719.274.0.3719.173.0.3683.5874.0.3719.073.0.3683.5773.0.3683.5674.0.3718.373.0.3683.5574.0.3718.274.0.3718.174.0.3718.073.0.3683.5474.0.3717.273.0.3683.5374.0.3717.174.0.3717.073.0.3683.5274.0.3716.174.0.3716.073.0.3683.5174.0.3715.174.0.3715.073.0.3683.5074.0.3711.274.0.3714.274.0.3713.374.0.3714.174.0.3714.073.0.3683.4974.0.3713.174.0.3713.072.0.3626.12073.0.3683.4874.0.3712.274.0.3712.174.0.3712.073.0.3683.4772.0.3626.11973.0.3683.4674.0.3710.272.0.3626.11874.0.3711.174.0.3711.073.0.3683.4572.0.3626.11774.0.3710.174.0.3710.073.0.3683.4472.0.3626.11674.0.3709.174.0.3709.074.0.3704.973.0.3683.4372.0.3626.11574.0.3704.874.0.3704.774.0.3708.074.0.3706.774.0.3704.673.0.3683.4272.0.3626.11474.0.3706.672.0.3626.11374.0.3704.574.0.3706.574.0.3706.474.0.3706.374.0.3706.274.0.3706.174.0.3706.073.0.3683.4172.0.3626.11274.0.3705.174.0.3705.073.0.3683.4072.0.3626.11173.0.3683.3974.0.3704.473.0.3683.3874.0.3704.374.0.3704.274.0.3704.174.0.3704.073.0.3683.3772.0.3626.11072.0.3626.10974.0.3703.374.0.3703.273.0.3683.3674.0.3703.174.0.3703.073.0.3683.3572.0.3626.10874.0.3702.274.0.3699.374.0.3702.174.0.3702.073.0.3683.3472.0.3626.10773.0.3683.3374.0.3701.174.0.3701.073.0.3683.3273.0.3683.3172.0.3626.10574.0.3700.174.0.3700.073.0.3683.2972.0.3626.10374.0.3699.274.0.3699.174.0.3699.073.0.3683.2872.0.3626.10273.0.3683.2773.0.3683.2674.0.3698.074.0.3696.272.0.3626.10173.0.3683.2574.0.3696.174.0.3696.074.0.3694.872.0.3626.10074.0.3694.774.0.3694.674.0.3694.574.0.3694.472.0.3626.9972.0.3626.9874.0.3694.373.0.3683.2472.0.3626.9772.0.3626.9672.0.3626.9573.0.3683.2372.0.3626.9473.0.3683.2273.0.3683.2172.0.3626.9374.0.3694.272.0.3626.9274.0.3694.174.0.3694.074.0.3693.673.0.3683.2072.0.3626.9174.0.3693.574.0.3693.474.0.3693.374.0.3693.273.0.3683.1974.0.3693.174.0.3693.073.0.3683.1872.0.3626.9074.0.3692.174.0.3692.073.0.3683.1772.0.3626.8974.0.3687.374.0.3691.174.0.3691.073.0.3683.1672.0.3626.8872.0.3626.8773.0.3683.1574.0.3690.174.0.3690.073.0.3683.1472.0.3626.8673.0.3683.1373.0.3683.1274.0.3689.174.0.3689.073.0.3683.1172.0.3626.8573.0.3683.1072.0.3626.8473.0.3683.974.0.3688.174.0.3688.073.0.3683.872.0.3626.8374.0.3687.274.0.3687.174.0.3687.073.0.3683.772.0.3626.8274.0.3686.472.0.3626.8174.0.3686.374.0.3686.274.0.3686.174.0.3686.073.0.3683.672.0.3626.8074.0.3685.174.0.3685.073.0.3683.572.0.3626.7974.0.3684.174.0.3684.073.0.3683.472.0.3626.7872.0.3626.7773.0.3683.373.0.3683.272.0.3626.7673.0.3683.173.0.3683.072.0.3626.7571.0.3578.14173.0.3682.173.0.3682.072.0.3626.7471.0.3578.14073.0.3681.473.0.3681.373.0.3681.273.0.3681.173.0.3681.072.0.3626.7371.0.3578.13972.0.3626.7272.0.3626.7173.0.3680.173.0.3680.072.0.3626.7071.0.3578.13873.0.3678.273.0.3679.173.0.3679.072.0.3626.6971.0.3578.13773.0.3678.173.0.3678.071.0.3578.13673.0.3677.173.0.3677.072.0.3626.6872.0.3626.6771.0.3578.13573.0.3676.173.0.3676.073.0.3674.272.0.3626.6671.0.3578.13473.0.3674.173.0.3674.072.0.3626.6571.0.3578.13373.0.3673.273.0.3673.173.0.3673.072.0.3626.6471.0.3578.13272.0.3626.6372.0.3626.6272.0.3626.6172.0.3626.6073.0.3672.173.0.3672.072.0.3626.5971.0.3578.13173.0.3671.373.0.3671.273.0.3671.173.0.3671.072.0.3626.5871.0.3578.13073.0.3670.173.0.3670.072.0.3626.5771.0.3578.12973.0.3669.173.0.3669.072.0.3626.5671.0.3578.12873.0.3668.273.0.3668.173.0.3668.072.0.3626.5571.0.3578.12773.0.3667.273.0.3667.173.0.3667.072.0.3626.5471.0.3578.12673.0.3666.173.0.3666.072.0.3626.5371.0.3578.12573.0.3665.473.0.3665.372.0.3626.5273.0.3665.273.0.3664.473.0.3665.173.0.3665.072.0.3626.5171.0.3578.12472.0.3626.5073.0.3664.373.0.3664.273.0.3664.173.0.3664.073.0.3663.272.0.3626.4971.0.3578.12373.0.3663.173.0.3663.072.0.3626.4871.0.3578.12273.0.3662.173.0.3662.072.0.3626.4771.0.3578.12173.0.3661.172.0.3626.4673.0.3661.072.0.3626.4571.0.3578.12073.0.3660.273.0.3660.173.0.3660.072.0.3626.4471.0.3578.11973.0.3659.173.0.3659.072.0.3626.4371.0.3578.11873.0.3658.173.0.3658.072.0.3626.4271.0.3578.11773.0.3657.173.0.3657.072.0.3626.4171.0.3578.11673.0.3656.173.0.3656.072.0.3626.4071.0.3578.11573.0.3655.173.0.3655.072.0.3626.3971.0.3578.11473.0.3654.173.0.3654.072.0.3626.3871.0.3578.11373.0.3653.173.0.3653.072.0.3626.3771.0.3578.11273.0.3652.173.0.3652.072.0.3626.3671.0.3578.11173.0.3651.173.0.3651.072.0.3626.3571.0.3578.11073.0.3650.173.0.3650.072.0.3626.3471.0.3578.10973.0.3649.173.0.3649.072.0.3626.3371.0.3578.10873.0.3648.273.0.3648.173.0.3648.072.0.3626.3271.0.3578.10773.0.3647.273.0.3647.173.0.3647.072.0.3626.3171.0.3578.10673.0.3635.373.0.3646.273.0.3646.173.0.3646.072.0.3626.3071.0.3578.10572.0.3626.2973.0.3645.273.0.3645.173.0.3645.072.0.3626.2871.0.3578.10472.0.3626.2772.0.3626.2672.0.3626.2572.0.3626.2473.0.3644.073.0.3643.272.0.3626.2371.0.3578.10373.0.3643.173.0.3643.072.0.3626.2271.0.3578.10273.0.3642.173.0.3642.072.0.3626.2171.0.3578.10173.0.3641.173.0.3641.072.0.3626.2071.0.3578.10072.0.3626.1973.0.3640.173.0.3640.072.0.3626.1873.0.3639.171.0.3578.9973.0.3639.072.0.3626.1773.0.3638.272.0.3626.1673.0.3638.173.0.3638.072.0.3626.1571.0.3578.9873.0.3635.271.0.3578.9773.0.3637.173.0.3637.072.0.3626.1471.0.3578.9671.0.3578.9572.0.3626.1371.0.3578.9473.0.3636.271.0.3578.9373.0.3636.173.0.3636.072.0.3626.1271.0.3578.9273.0.3635.173.0.3635.072.0.3626.1171.0.3578.9173.0.3634.273.0.3634.173.0.3634.072.0.3626.1071.0.3578.9071.0.3578.8973.0.3633.273.0.3633.173.0.3633.072.0.3610.472.0.3626.971.0.3578.8873.0.3632.573.0.3632.473.0.3632.373.0.3632.273.0.3632.173.0.3632.072.0.3626.871.0.3578.8773.0.3631.273.0.3631.173.0.3631.072.0.3626.771.0.3578.8672.0.3626.673.0.3630.173.0.3630.072.0.3626.571.0.3578.8572.0.3626.473.0.3628.373.0.3628.273.0.3629.173.0.3629.072.0.3626.371.0.3578.8473.0.3628.173.0.3628.071.0.3578.8373.0.3627.173.0.3627.072.0.3626.271.0.3578.8271.0.3578.8171.0.3578.8072.0.3626.172.0.3626.071.0.3578.7970.0.3538.12471.0.3578.7872.0.3623.472.0.3625.272.0.3625.172.0.3625.071.0.3578.7770.0.3538.12372.0.3624.472.0.3624.372.0.3624.271.0.3578.7672.0.3624.172.0.3624.072.0.3623.371.0.3578.7570.0.3538.12271.0.3578.7472.0.3623.272.0.3610.372.0.3623.172.0.3623.072.0.3622.372.0.3622.271.0.3578.7370.0.3538.12172.0.3622.172.0.3622.071.0.3578.7270.0.3538.12072.0.3621.172.0.3621.071.0.3578.7170.0.3538.11972.0.3620.172.0.3620.071.0.3578.7070.0.3538.11871.0.3578.6972.0.3619.172.0.3619.071.0.3578.6870.0.3538.11771.0.3578.6772.0.3618.172.0.3618.071.0.3578.6670.0.3538.11672.0.3617.172.0.3617.071.0.3578.6570.0.3538.11572.0.3602.371.0.3578.6472.0.3616.172.0.3616.071.0.3578.6370.0.3538.11471.0.3578.6272.0.3615.172.0.3615.071.0.3578.6170.0.3538.11372.0.3614.172.0.3614.071.0.3578.6070.0.3538.11272.0.3613.172.0.3613.071.0.3578.5970.0.3538.11172.0.3612.272.0.3612.172.0.3612.070.0.3538.11071.0.3578.5870.0.3538.10972.0.3611.272.0.3611.172.0.3611.071.0.3578.5770.0.3538.10872.0.3610.271.0.3578.5671.0.3578.5572.0.3610.172.0.3610.071.0.3578.5470.0.3538.10771.0.3578.5372.0.3609.371.0.3578.5272.0.3609.271.0.3578.5172.0.3608.572.0.3609.172.0.3609.071.0.3578.5070.0.3538.10672.0.3608.472.0.3608.372.0.3608.271.0.3578.4972.0.3608.172.0.3608.070.0.3538.10571.0.3578.4872.0.3607.172.0.3607.071.0.3578.4770.0.3538.10472.0.3606.272.0.3606.172.0.3606.071.0.3578.4670.0.3538.10370.0.3538.10272.0.3605.372.0.3605.272.0.3605.172.0.3605.071.0.3578.4570.0.3538.10171.0.3578.4471.0.3578.4370.0.3538.10070.0.3538.9971.0.3578.4272.0.3604.172.0.3604.071.0.3578.4170.0.3538.9871.0.3578.4072.0.3603.272.0.3603.172.0.3603.071.0.3578.3970.0.3538.9772.0.3602.271.0.3578.3871.0.3578.3772.0.3602.172.0.3602.071.0.3578.3670.0.3538.9672.0.3601.172.0.3601.071.0.3578.3570.0.3538.9572.0.3600.172.0.3600.071.0.3578.3470.0.3538.9472.0.3599.372.0.3599.272.0.3599.172.0.3599.071.0.3578.3370.0.3538.9372.0.3598.172.0.3598.071.0.3578.3270.0.3538.8772.0.3597.172.0.3597.072.0.3596.271.0.3578.3170.0.3538.8671.0.3578.3071.0.3578.2972.0.3596.172.0.3596.071.0.3578.2870.0.3538.8572.0.3595.272.0.3591.372.0.3595.172.0.3595.071.0.3578.2770.0.3538.8472.0.3594.172.0.3594.071.0.3578.2670.0.3538.8372.0.3593.272.0.3593.172.0.3593.071.0.3578.2570.0.3538.8272.0.3589.372.0.3592.272.0.3592.172.0.3592.071.0.3578.2472.0.3589.270.0.3538.8170.0.3538.8072.0.3591.272.0.3591.172.0.3591.071.0.3578.2370.0.3538.7971.0.3578.2272.0.3590.172.0.3590.071.0.3578.2170.0.3538.7870.0.3538.7772.0.3589.172.0.3589.071.0.3578.2070.0.3538.7671.0.3578.1970.0.3538.7572.0.3588.172.0.3588.071.0.3578.1870.0.3538.7472.0.3586.272.0.3587.071.0.3578.1770.0.3538.7372.0.3586.172.0.3586.071.0.3578.1670.0.3538.7272.0.3585.172.0.3585.071.0.3578.1570.0.3538.7171.0.3578.1472.0.3584.172.0.3584.071.0.3578.1370.0.3538.7072.0.3583.271.0.3578.1272.0.3583.172.0.3583.071.0.3578.1170.0.3538.6971.0.3578.1072.0.3582.072.0.3581.471.0.3578.970.0.3538.6772.0.3581.372.0.3581.272.0.3581.172.0.3581.071.0.3578.870.0.3538.6672.0.3580.172.0.3580.071.0.3578.770.0.3538.6571.0.3578.672.0.3579.172.0.3579.071.0.3578.570.0.3538.6471.0.3578.471.0.3578.371.0.3578.271.0.3578.171.0.3578.070.0.3538.6369.0.3497.12870.0.3538.6270.0.3538.6170.0.3538.6070.0.3538.5971.0.3577.171.0.3577.070.0.3538.5869.0.3497.12771.0.3576.271.0.3576.171.0.3576.070.0.3538.5770.0.3538.5671.0.3575.270.0.3538.5569.0.3497.12670.0.3538.5471.0.3575.171.0.3575.071.0.3574.171.0.3574.070.0.3538.5369.0.3497.12570.0.3538.5271.0.3573.171.0.3573.070.0.3538.5169.0.3497.12471.0.3572.171.0.3572.070.0.3538.5069.0.3497.12371.0.3571.270.0.3538.4969.0.3497.12271.0.3571.171.0.3571.070.0.3538.4869.0.3497.12171.0.3570.171.0.3570.070.0.3538.4769.0.3497.12071.0.3568.271.0.3569.171.0.3569.070.0.3538.4669.0.3497.11970.0.3538.4571.0.3568.171.0.3568.070.0.3538.4469.0.3497.11870.0.3538.4370.0.3538.4271.0.3567.171.0.3567.070.0.3538.4169.0.3497.11771.0.3566.171.0.3566.070.0.3538.4069.0.3497.11671.0.3565.171.0.3565.070.0.3538.3969.0.3497.11571.0.3564.171.0.3564.070.0.3538.3869.0.3497.11471.0.3563.071.0.3562.270.0.3538.3769.0.3497.11370.0.3538.3670.0.3538.3571.0.3562.171.0.3562.070.0.3538.3469.0.3497.11270.0.3538.3371.0.3561.171.0.3561.070.0.3538.3269.0.3497.11171.0.3559.671.0.3560.171.0.3560.071.0.3559.571.0.3559.470.0.3538.3169.0.3497.11071.0.3559.370.0.3538.3069.0.3497.10971.0.3559.271.0.3559.171.0.3559.070.0.3538.2969.0.3497.10871.0.3558.271.0.3558.171.0.3558.070.0.3538.2869.0.3497.10771.0.3557.271.0.3557.171.0.3557.070.0.3538.2769.0.3497.10671.0.3554.470.0.3538.2671.0.3556.171.0.3556.070.0.3538.2571.0.3554.369.0.3497.10571.0.3554.270.0.3538.2469.0.3497.10471.0.3555.270.0.3538.2371.0.3555.171.0.3555.070.0.3538.2269.0.3497.10371.0.3554.171.0.3554.070.0.3538.2169.0.3497.10271.0.3553.370.0.3538.2069.0.3497.10171.0.3553.269.0.3497.10071.0.3553.171.0.3553.070.0.3538.1969.0.3497.9969.0.3497.9869.0.3497.9771.0.3552.671.0.3552.571.0.3552.471.0.3552.371.0.3552.271.0.3552.171.0.3552.070.0.3538.1869.0.3497.9671.0.3551.371.0.3551.271.0.3551.171.0.3551.070.0.3538.1769.0.3497.9571.0.3550.371.0.3550.271.0.3550.171.0.3550.070.0.3538.1669.0.3497.9471.0.3549.171.0.3549.070.0.3538.1569.0.3497.9369.0.3497.9271.0.3548.171.0.3548.070.0.3538.1469.0.3497.9171.0.3547.171.0.3547.070.0.3538.1369.0.3497.9071.0.3546.269.0.3497.8971.0.3546.171.0.3546.070.0.3538.1269.0.3497.8871.0.3545.471.0.3545.371.0.3545.271.0.3545.171.0.3545.070.0.3538.1169.0.3497.8771.0.3544.571.0.3544.471.0.3544.371.0.3544.271.0.3544.171.0.3544.069.0.3497.8670.0.3538.1069.0.3497.8570.0.3538.969.0.3497.8471.0.3543.470.0.3538.871.0.3543.371.0.3543.271.0.3543.171.0.3543.070.0.3538.769.0.3497.8371.0.3542.271.0.3542.171.0.3542.070.0.3538.669.0.3497.8269.0.3497.8171.0.3541.171.0.3541.070.0.3538.569.0.3497.8071.0.3540.171.0.3540.070.0.3538.469.0.3497.7970.0.3538.371.0.3539.171.0.3539.069.0.3497.7868.0.3440.13469.0.3497.7770.0.3538.270.0.3538.170.0.3538.069.0.3497.7668.0.3440.13369.0.3497.7570.0.3537.270.0.3537.170.0.3537.069.0.3497.7468.0.3440.13270.0.3536.070.0.3535.570.0.3535.470.0.3535.369.0.3497.7368.0.3440.13170.0.3532.870.0.3532.769.0.3497.7269.0.3497.7170.0.3535.270.0.3535.170.0.3535.069.0.3497.7068.0.3440.13069.0.3497.6968.0.3440.12970.0.3534.470.0.3534.370.0.3534.270.0.3534.170.0.3534.069.0.3497.6868.0.3440.12870.0.3533.270.0.3533.170.0.3533.069.0.3497.6768.0.3440.12770.0.3532.670.0.3532.570.0.3532.469.0.3497.6668.0.3440.12670.0.3532.370.0.3532.270.0.3532.169.0.3497.6069.0.3497.6569.0.3497.6470.0.3532.070.0.3531.070.0.3530.470.0.3530.370.0.3530.269.0.3497.5868.0.3440.12569.0.3497.5769.0.3497.5669.0.3497.5569.0.3497.5470.0.3530.170.0.3530.069.0.3497.5368.0.3440.12469.0.3497.5270.0.3529.370.0.3529.270.0.3529.170.0.3529.069.0.3497.5170.0.3528.468.0.3440.12370.0.3528.370.0.3528.270.0.3528.170.0.3528.069.0.3497.5068.0.3440.12270.0.3527.170.0.3527.069.0.3497.4968.0.3440.12170.0.3526.170.0.3526.068.0.3440.12069.0.3497.4869.0.3497.4768.0.3440.11968.0.3440.11870.0.3525.570.0.3525.470.0.3525.368.0.3440.11769.0.3497.4670.0.3525.270.0.3525.170.0.3525.069.0.3497.4568.0.3440.11670.0.3524.470.0.3524.369.0.3497.4470.0.3524.270.0.3524.170.0.3524.070.0.3523.269.0.3497.4368.0.3440.11570.0.3505.969.0.3497.4270.0.3505.870.0.3523.170.0.3523.069.0.3497.4168.0.3440.11470.0.3505.769.0.3497.4070.0.3522.170.0.3522.070.0.3521.269.0.3497.3968.0.3440.11370.0.3505.670.0.3521.170.0.3521.069.0.3497.3868.0.3440.11270.0.3520.170.0.3520.069.0.3497.3768.0.3440.11170.0.3519.370.0.3519.270.0.3519.170.0.3519.069.0.3497.3668.0.3440.11070.0.3518.170.0.3518.069.0.3497.3569.0.3497.3468.0.3440.10970.0.3517.170.0.3517.069.0.3497.3368.0.3440.10869.0.3497.3270.0.3516.370.0.3516.270.0.3516.170.0.3516.069.0.3497.3168.0.3440.10770.0.3515.468.0.3440.10670.0.3515.370.0.3515.270.0.3515.170.0.3515.069.0.3497.3068.0.3440.10568.0.3440.10470.0.3514.270.0.3514.170.0.3514.069.0.3497.2968.0.3440.10370.0.3513.170.0.3513.069.0.3497.28((  r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  )randomchoice)Z_USER_AGENT_TPLZ_CHROME_VERSIONSr(   r(   r)   random_user_agentV   sT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          rV  zISO-8859-1,utf-8;q=0.7,*;q=0.7z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zgzip, deflatezen-us,en;q=0.5)z
User-AgentzAccept-CharsetAcceptzAccept-EncodingzAccept-LanguageZSafarizqMozilla/5.0 (X11; Linux x86_64; rv:10.0) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27JanuaryFebruaryZMarchZAprilMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecemberZjanvieru   févrierZmarsZavrilmaiZjuinZjuilletu   aoûtZ	septembreZoctobreZnovembreu	   décembre)enfrmp4m4am4pm4bm4rm4vaacflvf4vf4af4bwebmoggogvogaogxspxopusmkvmkamk3davidivxmovasfwmvwma3gp3g2mp3flacapewavf4ff4mm3u8smilu   ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿZAAAAAAAEZCEEEEIIIIDNOOOOOOOZOEZUUUUUYTHssZaaaaaaaeZceeeeiiiionoooooooZoeZuuuuuythy%d %B %Y%d %b %Y%B %d %Y
%B %dst %Y
%B %dnd %Y
%B %drd %Y
%B %dth %Y%b %d %Y
%b %dst %Y
%b %dnd %Y
%b %drd %Y
%b %dth %Y%b %dst %Y %I:%M%b %dnd %Y %I:%M%b %drd %Y %I:%M%b %dth %Y %I:%M%Y %m %d%Y-%m-%d%Y/%m/%d%Y/%m/%d %H:%M%Y/%m/%d %H:%M:%S%Y-%m-%d %H:%M%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M:%S.%f%d.%m.%Y %H:%M%d.%m.%Y %H.%M%Y-%m-%dT%H:%M:%SZ%Y-%m-%dT%H:%M:%S.%fZ%Y-%m-%dT%H:%M:%S.%f0Z%Y-%m-%dT%H:%M:%S%Y-%m-%dT%H:%M:%S.%f%Y-%m-%dT%H:%M%b %d %Y at %H:%M%b %d %Y at %H:%M:%S%B %d %Y at %H:%M%B %d %Y at %H:%M:%Sz%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Sz.}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)zS(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>(?P<json_ld>.+?)</script>c              C   s4   yt j } dj|  W n tk
r.   d} Y nX | S )zGet preferred encoding.

    Returns the best encoding scheme for the system, based on
    locale.getpreferredencoding() and some further tweaks.
    ZTESTzUTF-8)localegetpreferredencodingencode	Exception)Zprefr(   r(   r)   preferredencoding  s    
r  c                s@  t tjdk r@tjdkr@t   fdd} fdd}ntjj}tjj}d|d |d	d
}tjdk r~d|d< n|j	ddd t
jf t|}y\| tj| | W dQ R X tjdkrytj W n tk
r   Y nX tj|j W n@ tk
r:   ytj|j W n tk
r2   Y nX  Y nX dS )z? Encode obj as JSON and write it to fn, atomically if possible    r   win32c                s   t jjj S )N)ospathbasenamedecode)f)encodingfnr(   r)   <lambda>
  s    z!write_json_file.<locals>.<lambda>c                s   t jjj S )N)r  r  dirnamer  )r  )r  r  r(   r)   r    s    z.tmp.F)suffixprefixdirdeletewbmodewzutf-8)r  r  N)r  r   )r  r   )encodeFilenamesysversion_infoplatformget_filesystem_encodingr  r  r  r  updatetempfileNamedTemporaryFiler   jsondumpunlinkOSErrorrenamenamer  remove)objr  Zpath_basenameZpath_dirnameargsZtfr(   )r  r  r)   write_json_file  s@    




r        c             C   s:   t jd|st||dkr"d| n
d||f  }| j|S )z  Find the xpath xpath[@key=val] z^[a-zA-Z_-]+$Nz[@%s]z
[@%s='%s'])rematchAssertionErrorfind)nodexpathkeyvalexprr(   r(   r)   find_xpath_attr8  s     r  c             C   sD   x>| j t|D ],}||jkr q|d ks8|jj||kr|S qW d S )N)findallr   attribget)r  r  r  r  r  r(   r(   r)   r  >  s    
c             C   sj   dd | j dD }g }xF|D ]>}t|dkr>|j|d  q|\}}|jd|| |f  qW dj|S )Nc             S   s   g | ]}|j d qS ):)split).0cr(   r(   r)   
<listcomp>K  s    z!xpath_with_ns.<locals>.<listcomp>/r   r   z{%s}%s)r  lenr&   join)r  ns_map
componentsZreplacedr  nstagr(   r(   r)   xpath_with_nsJ  s    
r  Fc                s    fdd}t |ttfr$||}n x|D ]}||}|d k	r*P q*W |d kr~|tk	rX|S |rz|d krh|n|}td| nd S |S )Nc                s    j t| S )N)r  r   )r  )r  r(   r)   _find_xpathW  s    z"xpath_element.<locals>._find_xpathzCould not find XML element %s)
isinstancestrr   
NO_DEFAULTExtractorError)r  r  r  fataldefaultr  nZxpr(   )r  r)   xpath_elementV  s    

r  c             C   sh   t | ||||d}|d ks"||kr&|S |jd krb|tk	r<|S |r^|d krL|n|}td| nd S |jS )N)r  r  z$Could not find XML element's text %s)r  textr  r  )r  r  r  r  r  r  r(   r(   r)   
xpath_textm  s    
r  c             C   sX   t | ||}|d krN|tk	r |S |rJ|d kr8d||f n|}td| nd S |j| S )Nz%s[@%s]zCould not find XML attribute %s)r  r  r  r  )r  r  r  r  r  r  r  r(   r(   r)   
xpath_attr|  s    r  c             C   s   t d| |S )zOReturn the content of the tag with the specified ID in the passed HTML documentid)get_element_by_attribute)r  htmlr(   r(   r)   get_element_by_id  s    r  c             C   s   t | |}|r|d S dS )zXReturn the content of the first tag with the specified class in the passed HTML documentr   N)get_elements_by_class)
class_namer  retvalr(   r(   r)   get_element_by_class  s    
r  Tc             C   s   t | |||}|r|d S d S )Nr   )get_elements_by_attribute)	attributevaluer  escape_valuer  r(   r(   r)   r     s    r   c             C   s   t ddtj|  |ddS )z]Return the content of all tags with the specified class in the passed HTML document as a listclassz[^\'"]*\b%s\b[^\'"]*F)r
  )r  r  escape)r  r  r(   r(   r)   r    s    r  c             C   sv   |rt j|n|}g }xZt jdt j| |f |D ]<}|jd}|jdsT|jdr`|dd }|jt| q2W |S )zVReturn the content of the tag with the specified attribute in the passed HTML documenta  (?xs)
        <([a-zA-Z0-9:._-]+)
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
         \s+%s=['"]?%s['"]?
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
        \s*>
        (?P<content>.*?)
        </\1>
    content"'r   )r  r  finditergroup
startswithr&   unescapeHTML)r  r	  r  r
  Zretlistmresr(   r(   r)   r    s    
r  c               @   s    e Zd ZdZdd Zdd ZdS )HTMLAttributeParserzATrivial HTML parser to gather the attributes for a single elementc             C   s   i | _ tj|  d S )N)attrsr   __init__)selfr(   r(   r)   r    s    zHTMLAttributeParser.__init__c             C   s   t || _d S )N)dictr  )r  r  r  r(   r(   r)   handle_starttag  s    z#HTMLAttributeParser.handle_starttagN)__name__
__module____qualname____doc__r  r  r(   r(   r(   r)   r    s   r  c             C   s8   t  }y|j|  |j  W n tk
r0   Y nX |jS )a  Given a string for an HTML element such as
    <el
         a="foo" B="bar" c="&98;az" d=boz
         empty= noval entity="&amp;"
         sq='"' dq="'"
    >
    Decode and return a dictionary of attributes.
    {
        'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
        'empty': '', 'noval': None, 'entity': '&',
        'sq': '"', 'dq': '''
    }.
    NB HTMLParser is stricter in Python 2.6 & 3.2 than in later versions,
    but the cases in the unit test will work for all of 2.6, 2.7, 3.2-3.5.
    )r  feedcloser   r  )Zhtml_elementparserr(   r(   r)   extract_attributes  s    
r$  c             C   sR   | dkr| S | j dd} tjdd| } tjdd| } tjdd| } t| } | j S )z,Clean an HTML snippet into a readable stringN
 z(?u)\s*<\s*br\s*/?\s*>\s*z(?u)<\s*/\s*p\s*>\s*<\s*p[^>]*>z<.*?>r+   )replacer  subr  strip)r  r(   r(   r)   
clean_html  s    r*  c             C   s   yb| dkrNt jdkr0ddl}|jt jj tj tt jdrDt jj	nt j| fS t
t| |}|| fS  ttfk
r } z@|jtjfkr t| }|| kr nt
t||}||fS W Y dd}~X nX dS )ao  Try to open the given filename, and slightly tweak it if this fails.

    Attempts to open the given filename. If this fails, it tries to change
    the filename slightly, step by step, until it's either able to open it
    or it fails and raises a final exception, like the standard open()
    function.

    It returns the tuple (stream, definitive_file_name).
    -r  r   Nbuffer)r  r  msvcrtsetmodestdoutfilenor  O_BINARYhasattrr,  openr  IOErrorr  errnoZEACCESsanitize_path)filenameZ	open_moder-  streamerrZalt_filenamer(   r(   r)   sanitize_open  s     

r:  c             C   s(   d}t jj| }|dk	r$t jj|}|S )z:Convert RFC 2822 defined time string into system timestampN)emailutilsparsedate_tz	mktime_tz)timestr	timestamp	timetupler(   r(   r)   timeconvert  s
    rB  c                s    fdd}t jddd | } djt|| }|sxd|krJ|jdd}q4W |jd} rp|jd	rp|d
d }|jdrd|tdd  }|jd}|sd}|S )zSanitizes a string so it could be used as part of a filename.
    If restricted is set, use a stricter subset of allowed characters.
    Set is_id if this is not an arbitrary string, but an ID that should be kept
    if possible.
    c                s    r| t krt |  S | dks4t| dk s4t| dkr8dS | dkrL rHdS dS | dkr` r\dS d	S | d
krldS  r| dks| j rdS  rt| dkrdS | S )N?       r+   r  r  r  z_-z -z\/|*<>_z!&'()[]{}$;`^,#)ACCENT_CHARSordisspace)char)
restrictedr(   r)   replace_insane  s     z)sanitize_filename.<locals>.replace_insanez[0-9]+(?::[0-9]+)+c             S   s   | j djddS )Nr   r  rF  )r  r'  )r  r(   r(   r)   r  /  s    z#sanitize_filename.<locals>.<lambda>r+   __rF  z-_r  Nr+  r  )	r  r(  r  mapr'  r)  r  r  lstrip)srK  Zis_idrL  resultr(   )rK  r)   sanitize_filename  s    



rR  c             C   s   t jdkr| S tjj| \}}t jdk r>| r>tjj| \}}tjjt| |j	tjj
}|rh|jd dd |D }|r|jd|tjj
  tjj| S )z(Sanitizes and normalizes path on Windowsr  r  r  r   c             S   s&   g | ]}|dkr|nt jdd|qS )r  ..z(?:[/<>:"\|\\?\*]|[\s.]$)#)r  rS  )r  r(  )r  Z	path_partr(   r(   r)   r  K  s   z!sanitize_path.<locals>.<listcomp>)r  r  )r  r  r  r  
splitdriver  splituncnormpathremove_startr  seppopinsertr  )rP  Zdrive_or_uncrF  Z	norm_pathZsanitized_pathr(   r(   r)   r6  @  s    

r6  c             C   sF   | j drd|  S d	}x*|D ]"\}}tj|| rtj||| S qW | S )
Nz//zhttp:%s
^httpss://https://^rmtp([es]?)://	rtmp\1://r\  r]  r^  r_  )r`  ra  )r  r  r  r(  )urlZCOMMON_TYPOSZmistakefixupr(   r(   r)   sanitize_urlR  s    
 rd  c             O   s   t jt| f||S )N)r   Requestrd  )rb  r  kwargsr(   r(   r)   sanitized_Requestd  s    rg  c             C   s   t jjt| S )zExpand shell variables and ~)r  r  
expandvarsr   )rP  r(   r(   r)   expand_pathh  s    ri  c             C   s(   g }x| D ]}||kr
|j | q
W |S )z/ Remove all duplicates from the input iterable )r&   )iterabler  elr(   r(   r)   
orderedSetm  s
    
rl  c             C   s   | dd	 }|t jkr$tt j| S | tkr4t|  S tjd|}|dk	r|jd}|jdrjd}d| }nd}ytt||S  t	k
r   Y nX d| S )
z)Transforms an HTML entity to a character.Nr   z#(x[0-9a-fA-F]+|[0-9]+)x   z0%s
   z&%s;r  )
r   name2codepointr   r   r  r  r  r  int
ValueError)Zentity_with_semicolonentitymobjZnumstrbaser(   r(   r)   _htmlentity_transformv  s"    



rv  c             C   s.   | d krd S t | tksttjddd | S )Nz
&([^&;]+;)c             S   s   t | jdS )Nr   )rv  r  )r  r(   r(   r)   r    s    zunescapeHTML.<locals>.<lambda>)typer   r  r  r(  )rP  r(   r(   r)   r    s
    r  c              C   s:   t jdkr"t j d dkr"t } nt j } | d kr6d} | S )Nr  r      zutf-8)r  r  getwindowsversionr  getfilesystemencoding)r  r(   r(   r)   get_subprocess_encoding  s    r{  c             C   s`   t | tksttjdkr| S | rBtjdkrBtj d dkrB| S tjjdrR| S | jt	 dS )z'
    @param s The name of the file
    r  r   r  rx  javaignore)r  r   )
rw  r   r  r  r  r  ry  r  r  r{  )rP  for_subprocessr(   r(   r)   r    s    
 r  c             C   s*   t jdkr| S t| ts| S | jt dS )Nr  r   r}  )r  r   )r  r  r  bytesr  r{  )br~  r(   r(   r)   decodeFilename  s
    

r  c             C   s   t | ts| jd} t| dS )NasciiT)r  r   r  r  )rP  r(   r(   r)   encodeArgument  s    

r  c             C   s
   t | dS )NT)r  )r  r(   r(   r)   decodeArgument  s    r  c             C   s4   | d kr| S t | tr"| jt } t | ts0t| S )N)r  r  r  r  r   r  )Zoptvalr(   r(   r)   decodeOption  s    
r  c             C   sN   | dkr&d| d | d d | d f S | dkrBd| d | d f S d|  S d S )Ni  z%d:%02d:%02d<   z%d:%02dz%dr(   )secsr(   r(   r)   formatSeconds  s
    r  c             K   s   | j dd}ttdr`tjtjj}|r6d|_tj|_yt	| fd|i|S  t
k
r^   Y nX tjdk rvt	| f|S tjtj}|rtjntj|_|j  t	| fd|i|S d S )NnocheckcertificateFcreate_default_contextcontextr  r  )r  r  )r  r2  sslr  PurposeSERVER_AUTHcheck_hostname	CERT_NONEverify_modeYoutubeDLHTTPSHandler	TypeErrorr  r  
SSLContextPROTOCOL_TLSv1CERT_REQUIREDset_default_verify_paths)paramsrf  Zopts_no_check_certificater  r(   r(   r)   make_HTTPS_handler  s"    


r  c              C   s,   t  rd} nd} d}|d|  7 }|d7 }|S )Nztype  youtube-dl -U  to updatez/see  https://yt-dl.org/update  on how to updatez5; please report this issue on https://yt-dl.org/bug .z0 Make sure you are using the latest version; %s.zT Be sure to call youtube-dl with the --verbose flag and include its complete output.)ytdl_is_updateable)Z
update_cmdmsgr(   r(   r)   bug_reports_message	  s    r  c               @   s   e Zd ZdZdS )YoutubeDLErrorz$Base exception for YoutubeDL errors.N)r  r  r  r   r(   r(   r(   r)   r  	  s   r  c                   s*   e Zd ZdZd fdd	Zdd Z  ZS )	r  zError during info extraction.NFc                s   t j d tjtjtfkrd}|dk	r2|d | }|rB|d| 7 }|sP|t 7 }tt	| j
| || _t j | _|| _|| _dS )z tb, if given, is the original traceback (so that it can be printed out).
        If expected is set, this is a normal error message and most likely not a bug in youtube-dl.
        r   TNz: z (caused by %r))r  exc_infor   URLErrorsockettimeoutUnavailableVideoErrorr  superr  r  	tracebackcausevideo_id)r  r  tbexpectedr  r  )	__class__r(   r)   r  	  s    

zExtractorError.__init__c             C   s    | j d krd S djt j| j S )Nr+   )r  r  	format_tb)r  r(   r(   r)   format_traceback-	  s    
zExtractorError.format_traceback)NFNN)r  r  r  r   r  r  __classcell__r(   r(   )r  r)   r  	  s   r  c                   s   e Zd Z fddZ  ZS )UnsupportedErrorc                s"   t t| jd| dd || _d S )NzUnsupported URL: %sT)r  )r  r  r  rb  )r  rb  )r  r(   r)   r  4	  s    
zUnsupportedError.__init__)r  r  r  r  r  r(   r(   )r  r)   r  3	  s   r  c               @   s   e Zd ZdZdS )RegexNotFoundErrorzError when a regex didn't matchN)r  r  r  r   r(   r(   r(   r)   r  :	  s   r  c                   s"   e Zd ZdZd fdd	Z  ZS )GeoRestrictedErrorzGeographic restriction Error exception.

    This exception may be thrown when a video is not available from your
    geographic location due to geographic restrictions imposed by a website.
    Nc                s$   t t| j|dd || _|| _d S )NT)r  )r  r  r  r  	countries)r  r  r  )r  r(   r)   r  E	  s    zGeoRestrictedError.__init__)N)r  r  r  r   r  r  r(   r(   )r  r)   r  ?	  s   r  c                   s"   e Zd ZdZd fdd	Z  ZS )DownloadErrorzDownload Error exception.

    This exception may be thrown by FileDownloader objects if they are not
    configured to continue on errors. They will contain the appropriate
    error message.
    Nc                s   t t| j| || _dS )zh exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). N)r  r  r  r  )r  r  r  )r  r(   r)   r  S	  s    zDownloadError.__init__)N)r  r  r  r   r  r  r(   r(   )r  r)   r  K	  s   r  c               @   s   e Zd ZdZdS )SameFileErrorzSame File exception.

    This exception will be thrown by FileDownloader objects if they detect
    multiple files would have to be downloaded to the same file on disk.
    N)r  r  r  r   r(   r(   r(   r)   r  Y	  s   r  c                   s    e Zd ZdZ fddZ  ZS )PostProcessingErrorzPost Processing exception.

    This exception may be raised by PostProcessor's .run() method to
    indicate an error in the postprocessing task.
    c                s   t t| j| || _d S )N)r  r  r  r  )r  r  )r  r(   r)   r  i	  s    zPostProcessingError.__init__)r  r  r  r   r  r  r(   r(   )r  r)   r  b	  s   r  c               @   s   e Zd ZdZdS )MaxDownloadsReachedz) --max-downloads limit has been reached. N)r  r  r  r   r(   r(   r(   r)   r  n	  s   r  c               @   s   e Zd ZdZdS )r  zUnavailable Format exception.

    This exception will be thrown when a video is requested
    in a format that is not available for that video.
    N)r  r  r  r   r(   r(   r(   r)   r  s	  s   r  c                   s    e Zd ZdZ fddZ  ZS )ContentTooShortErrorzContent Too Short exception.

    This exception may be raised by FileDownloader objects when a file they
    download is too small for what the server announced first, indicating
    the connection was probably interrupted.
    c                s(   t t| jdj|| || _|| _d S )Nz(Downloaded {0} bytes, expected {1} bytes)r  r  r  format
downloadedr  )r  r  r  )r  r(   r)   r  	  s    
zContentTooShortError.__init__)r  r  r  r   r  r  r(   r(   )r  r)   r  |	  s   r  c                   s   e Zd Zd fdd	Z  ZS )XAttrMetadataErrorNUnknown errorc                sr   t t| j| || _|| _| jtjtjfksBd| jksBd| jkrJd| _n$| jtj	ks`d| jkrhd| _nd| _d S )NzNo space leftzDisk quota exceddedZNO_SPACEzArgument list too longZVALUE_TOO_LONGZNOT_SUPPORTED)
r  r  r  coder  r5  ZENOSPCZEDQUOTreasonZE2BIG)r  r  r  )r  r(   r)   r  	  s    zXAttrMetadataError.__init__)Nr  )r  r  r  r  r  r(   r(   )r  r)   r  	  s   r  c               @   s   e Zd ZdS )XAttrUnavailableErrorN)r  r  r  r(   r(   r(   r)   r  	  s   r  c                s   t jdk rd|d< ||t|}| jjd}|d k	rtjd fdd t|drT |_|dft|drn|_	n fd	d
}t
j|||_|S )Nr  r   Tstrictsource_addressc                s4  | \}}d }t j||dt j}d|d kr0t jnt j  fdd|D }|rz| rz t jkr`dnd}t jd||d f x|D ]}	|	\ }
}}}d }y>t j  |
|}|t jk	r|j| |j| |j	| d }|S  t jk
r } z|}|d k	r |j
  W Y d d }~X qX qW |d k	r&|n
t jdd S )	Nr   r  c                s   g | ]}|d   kr|qS )r   r(   )r  addr)afr(   r)   r  	  s    zG_create_http_connection.<locals>._create_connection.<locals>.<listcomp>Zv4Zv6zPNo remote IP%s addresses available for connect, can't use '%s' as source addressz!getaddrinfo returns an empty list)r  getaddrinfoSOCK_STREAMAF_INETAF_INET6error_GLOBAL_DEFAULT_TIMEOUT
settimeoutbindconnectr"  )addressr  r  hostportr9  addrsZip_addrsZ
ip_versionr  socktypeproto	canonnamesasockrF  r(   )r  r)   _create_connection	  s8    







z3_create_http_connection.<locals>._create_connectionr  c                s@    | j | jf| j}r6tj|| j| jtjd| _n|| _d S )N)ssl_version)	r  r  r  r  wrap_socketkey_file	cert_filer  r  )r  r  rf  r  )r  is_httpsr  r(   r)   _hc_connect	  s    
z,_create_http_connection.<locals>._hc_connect)r  r   )r  r  r   _paramsr  r  r  r2  r  r  	functoolspartialr  )Zydl_handler
http_classr  r  rf  Zhcr  r  r(   )r  r  r  r)   _create_http_connection	  s    


	r  c             C   s,   | }d|kr(t dd |j D }|d= |S )NzYoutubedl-no-compressionc             s   s&   | ]\}}|j  d kr||fV  qdS )zaccept-encodingN)lower)r  kvr(   r(   r)   	<genexpr>	  s    z+handle_youtubedl_headers.<locals>.<genexpr>)r  items)headersZfiltered_headersr(   r(   r)   handle_youtubedl_headers	  s
    r  c               @   sD   e Zd ZdZdd Zdd Zedd Zdd	 Zd
d Z	eZ
e	ZdS )YoutubeDLHandlera  Handler for HTTP requests and responses.

    This class, when installed with an OpenerDirector, automatically adds
    the standard headers to every HTTP request and handles gzipped and
    deflated responses from web servers. If compression is to be avoided in
    a particular request, the original request in the program code only has
    to include the HTTP header "Youtubedl-no-compression", which will be
    removed before making the real request.

    Part of this code was copied from:

    http://techknack.net/python-urllib2-handlers/

    Andrew Rowls, the author of that code, agreed to release it to the
    public domain.
    c             O   s   t jj| f|| || _d S )N)r   HTTPHandlerr  r  )r  r  r  rf  r(   r(   r)   r  	  s    zYoutubeDLHandler.__init__c             C   s@   t j}|jjd}|r(t||}|jd= | jtjt| |d|S )NzYtdl-socks-proxyF)	r   HTTPConnectionr  r  make_socks_conn_classdo_openr  r  r  )r  req
conn_classsocks_proxyr(   r(   r)   	http_open
  s    

zYoutubeDLHandler.http_openc             C   s2   yt j| t j S  t jk
r,   t j| S X d S )N)zlib
decompress	MAX_WBITSr  )datar(   r(   r)   deflate
  s    zYoutubeDLHandler.deflatec             C   s   |j  }t|}||kr$t||d}x.tj D ]"\}}|j |jkr.|j|| q.W t|j|_t	j
dk rd|j  kr|jjdd |_|jjdd |_|S )N)rb  r  r  rT  r   )r  r  )get_full_url
escape_urlupdate_Requeststd_headersr  
capitalizer  
add_headerr  r  r  Z_Request__original	partitionZ_Request__r_type)r  r  rb  Zurl_escapedhr  r(   r(   r)   http_request
  s    	zYoutubeDLHandler.http_requestc             C   s  |}|j jdddkr|j }tjtj|dd}ytj|j }W n tk
r } zhx`tddD ]N}y0tjtj|d |  dd}tj|j }W n tk
r   wbY nX P qbW |W Y d d }~X nX t	j
||j |j|j}|j|_|j d= |j jdddkr>tj| j|j }t	j
||j |j|j}|j|_|j d= d	|j  koTd
k n  r|j jd}	|	rtjdkr|	jdjd}	n
|	jd}	t|	}
|	|
kr|j d= tjdk r|
jd}
|
|j d< |S )NzContent-encodingr+   gziprb)fileobjr  r   i   r  i,  i  Locationr  r   z
iso-8859-1zutf-8)r  r   )r  r   )r  r  readr  ZGzipFileioBytesIOr4  ranger   
addinfourlrb  r  r  r  r  r  r  r  r  )r  r  respZold_respr  gzZuncompressedZoriginal_ioerrorilocationZlocation_escapedr(   r(   r)   http_response4
  sH    



zYoutubeDLHandler.http_responseN)r  r  r  r   r  r  staticmethodr  r  r
  https_requesthttps_responser(   r(   r(   r)   r  	  s   /r  c                s   t | tjtjfsttj|}|jj dkr6t	j
}n*|jj dkrLt	j}n|jj dkr`t	j}dd }||j|jpvdd||j||jf G  fd	d
d
| }|S )Nr$   r!   r"   r#   c             S   s   | s| S t | S )N)r   )rP  r(   r(   r)   unquote_if_non_emptys
  s    z3make_socks_conn_class.<locals>.unquote_if_non_emptyi8  Tc                   s   e Zd Z fddZdS )z.make_socks_conn_class.<locals>.SocksConnectionc                s   t  | _| jj   t| jttfkr4| jj| j | jj| j	| j
f t| tjrt| drv| jj| j| j	d| _ntj| j| _d S )N_context)server_hostname)r    r  Zsetproxyrw  r  rq  floatr  r  r  r  r  r   HTTPSConnectionr2  r  r  r  )r  )
proxy_argsr(   r)   r  
  s    
z6make_socks_conn_class.<locals>.SocksConnection.connectN)r  r  r  r  r(   )r  r(   r)   SocksConnection
  s   r  )r!   r"   )
issubclassr   r  r  r  r   urlparser'   r  r   ZSOCKS5ZSOCKS4ZSOCKS4Ahostnamer  usernamepassword)Z
base_classr  Zurl_componentsZ
socks_typer  r  r(   )r  r)   r  g
  s"    
r  c               @   s   e Zd ZdddZdd ZdS )r  Nc             O   s*   t jj| f|| |ptj| _|| _d S )N)r   HTTPSHandlerr  r   r  _https_conn_classr  )r  r  Zhttps_conn_classr  rf  r(   r(   r)   r  
  s    zYoutubeDLHTTPSHandler.__init__c             C   sp   i }| j }t| dr| j|d< t| dr2| j|d< |jjd}|rTt||}|jd= | jtj	t
| |d|f|S )Nr  r  _check_hostnamer  zYtdl-socks-proxyT)r  r2  r  r  r  r  r  r  r  r  r  )r  r  rf  r  r  r(   r(   r)   
https_open
  s    





z YoutubeDLHTTPSHandler.https_open)N)r  r  r  r  r  r(   r(   r(   r)   r  
  s   
r  c               @   s(   e Zd ZdZdZd	ddZd
ddZdS )YoutubeDLCookieJarz]
    See [1] for cookie file format.

    1. https://curl.haxx.se/docs/http-cookies.html
    z
#HttpOnly_NFc             C   s4   x| D ]}|j d krd|_ qW tjj| ||| d S )Nr   )expiresr   MozillaCookieJarsave)r  r7  ignore_discardignore_expirescookier(   r(   r)   r!  
  s    


zYoutubeDLCookieJar.savec             C   s   |dkr$| j dk	r| j }n
ttjtj }t|@}x8|D ]0}|j| jr^|t	| jd }|j
t| q<W W dQ R X |jd | j|||| x"| D ]}|jdkrd|_d|_qW dS )zLoad cookies from a file.Nr   T)r7  rr  r   MISSING_FILENAME_TEXTr  StringIOr3  r  _HTTPONLY_PREFIXr  writer   seek_really_loadr  discard)r  r7  r"  r#  Zcfr  liner$  r(   r(   r)   load
  s     







zYoutubeDLCookieJar.load)NFF)NFF)r  r  r  r   r'  r!  r-  r(   r(   r(   r)   r  
  s   
r  c               @   s*   e Zd ZdddZdd ZejjZeZ	dS )YoutubeDLCookieProcessorNc             C   s   t jj| | d S )N)r   HTTPCookieProcessorr  )r  	cookiejarr(   r(   r)   r  
  s    z!YoutubeDLCookieProcessor.__init__c             C   s   t jj| ||S )N)r   r/  r
  )r  requestresponser(   r(   r)   r
  
  s    z&YoutubeDLCookieProcessor.http_response)N)
r  r  r  r  r
  r   r/  r  r  r  r(   r(   r(   r)   r.  
  s   
r.  c               @   s"   e Zd Zejd dk rdd ZdS )YoutubeDLRedirectHandlerr   r  c          	   C   s   t jj| |||||t|S )N)r   HTTPRedirectHandlerredirect_requestr   )r  r  fpr  r  r  newurlr(   r(   r)   r5  
  s    z)YoutubeDLRedirectHandler.redirect_requestN)r  r  r  r  r  r5  r(   r(   r(   r)   r3  
  s   r3  c             C   s   t jd| }|stj }nl| d t|jd  } |jdsFtj }n@|jddkrXdnd	}tj|t|jd |t|jd d}|| fS )
NzM^.{8,}?(?P<tz>Z$| ?(?P<sign>\+|-)(?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})$)tzsign+r   hoursminutes)r;  r<  r  )r  searchdatetime	timedeltar  r  rq  )date_strr  timezoner9  r(   r(   r)   extract_timezone
  s    


rB  Tc             C   sr   | dkrdS t jdd| } |dkr.t| \}} y*dj|}tjj| || }tj|j S  t	k
rl   Y nX dS )z- Return a UNIX timestamp from the given date Nz\.[0-9]+r+   z%Y-%m-%d{0}%H:%M:%S)
r  r(  rB  r  r>  strptimecalendartimegmrA  rr  )r@  	delimiterrA  Zdate_formatdtr(   r(   r)   parse_iso8601  s    
rI  c             C   s   | rt S tS )N)DATE_FORMATS_DAY_FIRSTDATE_FORMATS_MONTH_FIRST)	day_firstr(   r(   r)   date_formats!  s    rM  c             C   s   | dkrdS d}| j dd} tjdd| } t| \}} x>t|D ]2}ytjj| |jd}W q@ tk
rp   Y q@X q@W |dkrt	j
j| }|rytj|dd  jd}W n tk
r   Y nX |dk	rt|S dS )z4Return a string with the date in the format YYYYMMDDN,r&  z(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r+   z%Y%m%d   )r'  r  r(  rB  rM  r>  rD  strftimerr  r;  r<  r=  r   )r@  rL  Zupload_daterF  
expressionrA  r(   r(   r)   unified_strdate%  s(    
rR  c             C   s  | d krd S t jdd| } t jd| r*dnd}t| \}} t jdd| } t jd| }|rp| d t|jd  } t jd	| }|r|jd
} xRt|D ]F}y,tjj| || tj	|d }t
j|j S  tk
r   Y qX qW tjj| }|rt
j||d  S d S )Nz[,|]r+   z(?i)PM   r   z(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?z+\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$r8  zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r   )r;  i  )r  r(  r=  rB  r  r  rM  r>  rD  r?  rE  rF  rA  rr  r;  r<  r=  )r@  rL  Zpm_deltarA  r  rQ  rH  rA  r(   r(   r)   unified_timestampA  s*    

rT  unknown_videoc             C   s\   | d ksd| kr|S | j dd jdd }tjd|r<|S |jdtkrT|jdS |S d S )Nr  rC  r   r  z^[A-Za-z0-9]+$r  )r  
rpartitionr  r  rstripKNOWN_EXTENSIONS)rb  default_extZguessr(   r(   r)   determine_extb  s    
rZ  c             C   s   t | |d | |S )Nr  )replace_extension)r7  Zsub_langZ
sub_formatexpected_real_extr(   r(   r)   subtitles_filenameo  s    r]  c             C   s   t jj }| dkr|S | dkr.|t jdd S tjd| }|dk	r|jd}t|jd	}|d
krh| }|jd}|dkrd}|d9 }n|dkrd}|d9 }|d7 }t jf ||i}|| S t j j| dj S )zw
    Return a datetime object from a string in the format YYYYMMDD or
    (now|today)[+-][0-9](day|week|month|year)(s)?nowtodayZ	yesterdayr   )dayszG(now|today)(?P<sign>[+-])(?P<time>\d+)(?P<unit>day|week|month|year)(s)?Nr9  timer+  unitmonthday   yearim  rP  z%Y%m%d)r^  r_  )	r>  dater_  r?  r  r  r  rq  rD  )r@  r_  r  r9  ra  rb  deltar(   r(   r)   date_from_strs  s,    



ri  c             C   s*   t jd| }|dk	r"dj|j S | S dS )z?
    Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$Nr+  )r  r  r  groups)r@  r  r(   r(   r)   hyphenate_date  s    rk  c               @   s6   e Zd ZdZdddZedd Zdd Zd	d
 ZdS )	DateRangez,Represents a time interval between two datesNc             C   s`   |dk	rt || _ntjjj | _|dk	r6t || _ntjjj | _| j| jkr\td|  dS )z<start and end must be strings in the format accepted by dateNz=Date range: "%s" , the start date must be before the end date)ri  startr>  minrg  endmaxrr  )r  rm  ro  r(   r(   r)   r    s    zDateRange.__init__c             C   s
   | ||S )z0Returns a range that only contains the given dayr(   )clsrd  r(   r(   r)   rd    s    zDateRange.dayc             C   s0   t |tjst|}| j|  ko*| jkS   S )z!Check if the date is in the range)r  r>  rg  ri  rm  ro  )r  rg  r(   r(   r)   __contains__  s    zDateRange.__contains__c             C   s   d| j j | jj f S )Nz%s - %s)rm  	isoformatro  )r  r(   r(   r)   __str__  s    zDateRange.__str__)NN)	r  r  r  r   r  classmethodrd  rr  rt  r(   r(   r(   r)   rl    s
   
rl  c              C   s0   t j  } t| tr| jt } t| ts,t| S )z+ Returns the platform name as a compat_str )r  r  r  r  r  r   r  )r  r(   r(   r)   platform_name  s
    
rv  c                s  ddl ddlddd}y|j }W n( tk
r:   dS  tjk
rN   dS X ||kr\dS tjjjj	dj
jf}||| }tjjjjjjjj	jjj	jjdj
jf}jj	d}tjj	jj	d	j
jfd
 dtjjjjjjj	dj
jfjj	dj fdd}||rPdS dd }	x| rt|	| d}
||| |
r~|
nd
j|d}|dkrtd|
s|jd
kst| dd } n|jdkst| |jd } qZW dS )zi Returns True if the string was written using special methods,
    False if it has yet to be written out.r   N   rS  )r   r  FGetStdHandleWriteConsoleWGetFileTyper  i   GetConsoleModer   c                s@   | ks| d krdS |  @  kp>| j jj dkS )NTr   )byrefwintypesDWORD)handle)FILE_TYPE_CHARFILE_TYPE_REMOTEr{  rz  INVALID_HANDLE_VALUEctypesr(   r)   not_a_console  s    z,_windows_write_string.<locals>.not_a_consolec             S   s4   yt dd t| D S  tk
r.   t| S X d S )Nc             s   s"   | ]\}}t |d kr|V  qdS )i  N)rH  )r  r  r  r(   r(   r)   r    s    zA_windows_write_string.<locals>.next_nonbmp_pos.<locals>.<genexpr>)next	enumerateStopIterationr  )rP  r(   r(   r)   next_nonbmp_pos  s    z._windows_write_string.<locals>.next_nonbmp_posi   zFailed to write stringTiir  )r  ctypes.wintypesr0  AttributeErrorr  UnsupportedOperationr	   r}  HANDLEr~  windllkernel32BOOLZLPWSTRPOINTERLPVOIDr	  rn  r|  r  r  )rP  outZWIN_OUTPUT_IDSr0  rx  r  ry  Zwrittenr  r  countretr(   )r  r  r{  rz  r  r  r)   _windows_write_string  sZ    

r  c             C   s   |d krt j}t| tkstt jdkrH|d krHt|drHt| |rHd S dt|ddksft j	d dk r| j
|prt d}|j| nDt|d	r|pt|d
d pt }| j
|d}|jj| n
|j|  |j  d S )Nr  r0  r  r  r+   r   r  r}  r,  r  )r  stderrrw  r   r  r  r2  r  getattrr  r  r  r(  r,  flush)rP  r  r  Zbytencr(   r(   r)   write_string  s     


r  c             C   s0   | sg S t | d trt| S dd | D S d S )Nr   c             S   s   g | ]}t |qS r(   )rH  )r  r  r(   r(   r)   r  *  s    z$bytes_to_intlist.<locals>.<listcomp>)r  rq  list)bsr(   r(   r)   bytes_to_intlist$  s
    r  c             C   s   | sdS t dt|  f|  S )N    z%dB)r   r  )xsr(   r(   r)   intlist_to_bytes-  s    r  r  c               @   sB   e Zd ZdejjfdejjfdejjfdejjfdejjfgZdS )
OVERLAPPEDZInternalZInternalHighOffset
OffsetHighhEventN)	r  r  r  r  r}  r  r~  r  _fields_r(   r(   r(   r)   r  8  s
   



r  l    ic             C   sb   t  }d|_d|_d|_tj|| _tj| j	 }t
||r>dnddtt| js^tdtj  d S )Nr   r  zLocking file failed: %r)r  r  r  r  r  pointer_lock_file_overlapped_pr-  get_osfhandler0  
LockFileEx	whole_low
whole_highr  FormatError)r  	exclusiveZ
overlappedr  r(   r(   r)   
_lock_fileX  s    r  c             C   s>   | j s
ttj| j }t|dtt| j s:tdt	j
  d S )Nr   zUnlocking file failed: %r)r  r  r-  r  r0  UnlockFileExr  r  r  r  r  )r  r  r(   r(   r)   _unlock_filec  s
    
r  c             C   s   t j| |rt jnt j d S )N)fcntlflockZLOCK_EXZLOCK_SH)r  r  r(   r(   r)   r  o  s    c             C   s   t j| t j d S )N)r  r  ZLOCK_UN)r  r(   r(   r)   r  r  s    z.file locking is not supported on this platformc             C   s   t td S )N)r4  UNSUPPORTED_MSG)r  r  r(   r(   r)   r  w  s    c             C   s   t td S )N)r4  r  )r  r(   r(   r)   r  z  s    c               @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )locked_fileNc             C   s(   |dkst tj|||d| _|| _d S )Nrar  )r  )r  r  r  )r  r  r3  r  r  )r  r7  r  r  r(   r(   r)   r    s    zlocked_file.__init__c             C   s@   | j dk}yt| j| W n  tk
r:   | jj   Y nX | S )Nr  )r  r  r  r4  r"  )r  r  r(   r(   r)   	__enter__  s    

zlocked_file.__enter__c          
   C   s    zt | j W d | jj  X d S )N)r  r  r"  )r  etyper	  r  r(   r(   r)   __exit__  s    zlocked_file.__exit__c             C   s
   t | jS )N)iterr  )r  r(   r(   r)   __iter__  s    zlocked_file.__iter__c             G   s   | j j| S )N)r  r(  )r  r  r(   r(   r)   r(    s    zlocked_file.writec             G   s   | j j| S )N)r  r  )r  r  r(   r(   r)   r    s    zlocked_file.read)N)	r  r  r  r  r  r  r  r(  r  r(   r(   r(   r)   r  ~  s   
	r  c              C   s   t j } | d k	r| S dS )Nzutf-8)r  rz  )r  r(   r(   r)   r    s    r  c             C   sD   g }t  }x.| D ]&}t|tr(|j|}|jt| qW dj|S )Nr&  )r  r  r  r  r&   r   r  )r  Zquoted_argsr  r  r(   r(   r)   shell_quote  s    


r  c             C   s6   t | i \} }|j| tdtj|i}| d | S )z1 Pass additional data in a URL for internal use. __youtubedl_smugglerT  )unsmuggle_urlr  r   r  dumps)rb  r  Zidatasdatar(   r(   r)   smuggle_url  s
    
r  c             C   sB   d| kr| |fS | j d\}}}t|d d }tj|}||fS )Nz#__youtubedl_smugglerT  r  r   )rV  r   r  loads)Zsmug_urlr  rb  rF  r  Zjsondr  r(   r(   r)   r    s    
r  c          	   C   sx   | d krdS t | tkr t| } | dkr.d}nttj| d}ddddd	d
dddg	| }t| td|  }d||f S )NzN/Ag        r   g      @BKiBMiBGiBTiBPiBEiBZiBYiBi   z%.2f%s)rw  r  r  rq  mathlog)r  exponentr  Z	convertedr(   r(   r)   format_bytes  s    r  c             C   s\   dj dd | D }tjd| |}|s,d S |jdjdd}| |jd }tt|| S )	N|c             s   s   | ]}t j|V  qd S )N)r  r  )r  ur(   r(   r)   r    s    z$lookup_unit_table.<locals>.<genexpr>z/(?P<num>[0-9]+(?:[,.][0-9]*)?)\s*(?P<unit>%s)\bnumrN  r  rb  )r  r  r  r  r'  rq  r  )Z
unit_tablerP  Zunits_rer  Znum_strZmultr(   r(   r)   lookup_unit_table  s    r  c          <   C   s   | d krd S ddddddddddddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d;}t || S )=Nr   i   i  r  r     rx  rO  r     );r  r  r  r  ZKBZkBZKbZkbZ	kilobytesZ	kibibytesr  ZMBZmBZMbZmbZ	megabytesZ	mebibytesr  GBZgBZGbZgbZ	gigabytesZ	gibibytesr  ZTBZtBZTbr  Z	terabytesZ	tebibytesr  ZPBZpBZPbpbZ	petabytesZ	pebibytesr  ZEBZeBZEbZebZexabytesZ	exbibytesr  ZZBZzBZZbZzbZ
zettabytesZ	zebibytesr  ZYBZyBZYbZybZ
yottabytesZ	yobibytesi   i@B i   i@B i@B i@B i   i   @i ʚ;i   @i ʚ;i ʚ;i ʚ;i   @l        l    J)l        l    J)l    J)l    J)l        l           l     I5 l           l     I5 l     I5 l     I5 l           l            l     NZol            l     NZol     NZol     NZol            l            l     @=7M.cl            l     @=7M.cl     @=7M.cl     @=7M.cl            l               l      B3v^!< l               l      B3v^!< l      B3v^!< l      B3v^!< l               )r  )rP  _UNIT_TABLEr(   r(   r)   parse_filesize  s|    r  c             C   sD   | d krd S | j  } tjd| r(t| S ddddddd}t|| S )	Nz	^[\d,.]+$i  r  )r  Kr  MkkZKKi@B i@B i@B i@B )r)  r  r  
str_to_intr  )rP  r  r(   r(   r)   parse_count   s    r  c             C   s   | d kri S t jd| }|r:t|jdt|jddS t jd| }|r\dt|jdiS t jd| }|rdt|jdd	 iS i S )
Nu$   \b(?P<w>\d+)\s*[xX×]\s*(?P<h>\d+)\br  r  )widthheightz\b(\d+)[pPiI]\br  r   z\b([48])[kK]\bi  )r  r=  rq  r  )rP  rt  r(   r(   r)   parse_resolution5  s    r  c             C   s0   t | tsd S tjd| }|r,t|jdS d S )Nz\b(\d+)\s*kbpsr   )r  r   r  r=  rq  r  )rP  rt  r(   r(   r)   parse_bitrateK  s
    
r  r\  c             C   s8   t j|t d }y|j| d S  tk
r2   dS X dS )zE Return the number of a month by (locale-independently) English name r\  r   N)MONTH_NAMESr  indexrr  )r  langZmonth_namesr(   r(   r)   month_by_nameS  s
    r  c             C   s2   ydd t D j| d S  tk
r,   dS X dS )zV Return the number of a month by (locale-independently) English
        abbreviations c             S   s   g | ]}|d d qS )Nr  r(   )r  rP  r(   r(   r)   r  c  s    z)month_by_abbreviation.<locals>.<listcomp>r   N)ENGLISH_MONTH_NAMESr  rr  )Zabbrevr(   r(   r)   month_by_abbreviation^  s    r  c             C   s   t jdd| S )z%Replace all the '&' by '&amp;' in XMLz<&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)z&amp;)r  r(  )Zxml_strr(   r(   r)   fix_xml_ampersandsh  s    r  c             C   s   t | tsttjjdrd S ytjjd}W n& t	k
rB   d S  t
k
rT   d S X | jd}tjt|}||_y|jd|ddd W n tk
r   d S X d S )Nr|  z	libc.so.6zutf-8   r   )r  r   r  r  r  r  r  cdllLoadLibraryr  r  r  create_string_bufferr  r	  Zprctlr  )titlelibcZtitle_bytesbufr(   r(   r)   setproctitlep  s     
r  c             C   s&   | d k	r"| j |r"| t|d  S | S )N)r  r  )rP  rm  r(   r(   r)   rX    s    rX  c             C   s(   | d k	r$| j |r$| d t|  S | S )N)endswithr  )rP  ro  r(   r(   r)   
remove_end  s    r  c             C   sN   | d kst | dk r| S x0dD ](}| d |kr| d |kr| dd S qW | S )	Nr  r  r  r   r   )r  r  r  r  )r  )rP  quoter(   r(   r)   remove_quotes  s    
r  c             C   s    t j| j}|jdjdd S )Nr  r   r  )r   r  r  r)  r  )rb  r  r(   r(   r)   url_basename  s    r  c             C   s   t jd| j S )Nzhttps?://[^?#&]+/)r  r  r  )rb  r(   r(   r)   base_url  s    r  c             C   sx   t |tr|jd}t |t s&| r*d S tjd|r:|S t | trN| jd} t | t shtjd|  rld S tj| |S )Nzutf-8z ^(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)r  r  r  r   r  r  r   urljoin)ru  r  r(   r(   r)   r    s    




r  c               @   s   e Zd Zdd ZdS )HEADRequestc             C   s   dS )NHEADr(   )r  r(   r(   r)   
get_method  s    zHEADRequest.get_methodN)r  r  r  r  r(   r(   r(   r)   r    s   r  c               @   s   e Zd Zdd ZdS )
PUTRequestc             C   s   dS )NPUTr(   )r  r(   r(   r)   r    s    zPUTRequest.get_methodN)r  r  r  r  r(   r(   r(   r)   r    s   r  c             C   s^   |r| d k	rt | |d } | dkr$d } | d kr0|S yt| | | S  ttfk
rX   |S X d S )Nr+   )r  rq  rr  r  )r  scaler  Zget_attrinvscaler(   r(   r)   int_or_none  s    r 	  c             C   s   | d kr|S t | S )N)r   )r  r  r(   r(   r)   str_or_none  s    r	  c             C   s2   t | tr| S t | tr.tjdd| } t| S dS )z' A more relaxed version of int_or_none z[,\.\+]r+   N)r  r   r   r  r(  r 	  )Zint_strr(   r(   r)   r    s
    

r  c             C   s:   | d kr|S yt | | | S  ttfk
r4   |S X d S )N)r  rr  r  )r  r  r  r  r(   r(   r)   float_or_none  s    r	  c             C   s   t | tr| S |S )N)r  bool)r  r  r(   r(   r)   bool_or_none  s    r	  c             C   s   t | tr| j S |S )N)r  r   r)  )r  r  r(   r(   r)   strip_or_none  s    r	  c             C   s2   |  st | t rd S | j } tjd| r.| S d S )Nz^(?:[a-zA-Z][\da-zA-Z.+-]*:)?//)r  r   r)  r  r  )rb  r(   r(   r)   url_or_none  s    r	  c             C   s  t | tsd S | j } d gd \}}}}}tjd| }|rN|j \}}}}}nFtjd| }|rr|j \}}}}}n"tjd| }|r|j \}}nd S d}|r|t|7 }|r|t|d 7 }|r|t|d d 7 }|r|t|d d d 7 }|r|t|7 }|S )Nrx  zg(?:(?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?(?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?Z?$a  (?ix)(?:P?
                (?:
                    [0-9]+\s*y(?:ears?)?\s*
                )?
                (?:
                    [0-9]+\s*m(?:onths?)?\s*
                )?
                (?:
                    [0-9]+\s*w(?:eeks?)?\s*
                )?
                (?:
                    (?P<days>[0-9]+)\s*d(?:ays?)?\s*
                )?
                T)?
                (?:
                    (?P<hours>[0-9]+)\s*h(?:ours?)?\s*
                )?
                (?:
                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?\s*
                )?
                (?:
                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s*
                )?Z?$zW(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$r   r     )r  r   r)  r  r  rj  r  )rP  r`  r;  minsr  msr  Zdurationr(   r(   r)   parse_duration  s6    
r
	  c             C   s@   t jj| \}}| s&|dd  |kr4dj|||S dj| |S )Nr   z
{0}.{1}{2}z{0}.{1})r  r  splitextr  )r7  extr\  r  real_extr(   r(   r)   prepend_extension*  s    $r	  c             C   s6   t jj| \}}dj| s*|dd  |kr.|n| |S )Nz{0}.{1}r   )r  r  r	  r  )r7  r	  r\  r  r	  r(   r(   r)   r[  2  s    r[  c             C   s<   y"t j| g| t jt jdj  W n tk
r6   dS X | S )z Checks if the given binary is installed somewhere in PATH, and returns its name.
    args can be a list of arguments for a short output (like -version) )r/  r  F)
subprocessPopenPIPEcommunicater  )exer  r(   r(   r)   check_executable9  s
    "r	  z	--versionpresentc             C   sf   y.t jt| g| t jt jt jdj \}}W n tk
rB   dS X t|trZ|j	dd}t
|||S )z` Returns the version of the specified executable,
    or False if the executable is not present )stdinr/  r  Fr  r}  )r	  r	  r  r	  STDOUTr	  r  r  r  r  detect_exe_version)r	  r  
version_reunrecognizedr  rF  r(   r(   r)   get_exe_versionC  s    
r	  c             C   s<   t | tst|d krd}tj|| }|r4|jdS |S d S )Nzversion\s+([-0-9._a-zA-Z]+)r   )r  r   r  r  r=  r  )outputr	  r	  r  r(   r(   r)   r	  V  s    
r	  c               @   s   e Zd Zdd ZdS )	PagedListc             C   s   t | j S )N)r  getslice)r  r(   r(   r)   __len__b  s    zPagedList.__len__N)r  r  r  r	  r(   r(   r(   r)   r	  a  s   r	  c               @   s    e Zd ZdddZd	ddZdS )
OnDemandPagedListTc             C   s    || _ || _|| _|ri | _d S )N)	_pagefunc	_pagesize
_use_cache_cache)r  pagefuncpagesizeZ	use_cacher(   r(   r)   r  h  s
    zOnDemandPagedList.__init__r   Nc       
      C   s(  g }xt j|| j D ]}|| j }|| j | j }||krBqd }| jrX| jj|}|d krnt| j|}| jr~|| j|< ||  ko|k n  r|| j nd}|d k	r||  ko|kn  r|d | j d nd }	|dks|	d k	r|||	 }|j| t	|| | jk rP ||krP qW |S )Nr   r   )
	itertoolsr  r"	  r#	  r$	  r  r  r!	  extendr  )
r  rm  ro  r  pagenumZfirstidZnextfirstidZpage_resultsZstartvZendvr(   r(   r)   r	  o  s2    

"2
zOnDemandPagedList.getslice)T)r   N)r  r  r  r  r	  r(   r(   r(   r)   r 	  g  s   
r 	  c               @   s   e Zd Zdd ZdddZdS )InAdvancePagedListc             C   s   || _ || _|| _d S )N)r!	  
_pagecountr"	  )r  r%	  Z	pagecountr&	  r(   r(   r)   r    s    zInAdvancePagedList.__init__r   Nc       
      C   s   g }|| j  }|d kr| jn|| j  d }||| j   }|d krDd n|| }xxt||D ]j}t| j|}	|r~|	|d  }	d }|d k	rt|	|k r|t|	8 }n|	d | }	|j|	 P |j|	 qXW |S )Nr   )r"	  r+	  r  r  r!	  r  r(	  )
r  rm  ro  r  Z
start_pageZend_pageZ
skip_elemsZ	only_morer)	  Zpager(   r(   r)   r	    s$    

zInAdvancePagedList.getslice)r   N)r  r  r  r  r	  r(   r(   r(   r)   r*	    s   r*	  c                s    t jd tjd fdd| S )Nunicode_escapez\\U[0-9a-fA-F]{8}c                s    | j dd S )Nr   )r  )r  )r,	  r(   r)   r    s    z"uppercase_escape.<locals>.<lambda>)codecs
getdecoderr  r(  )rP  r(   )r,	  r)   uppercase_escape  s
    

r/	  c                s    t jd tjd fdd| S )Nr,	  z\\u[0-9a-fA-F]{4}c                s    | j dd S )Nr   )r  )r  )r,	  r(   r)   r    s    z"lowercase_escape.<locals>.<lambda>)r-	  r.	  r  r(  )rP  r(   )r,	  r)   lowercase_escape  s
    

r0	  c             C   s*   t jdk rt| tr| jd} tj| dS )z4Escape non-ASCII characters as suggested by RFC 3986r  r   zutf-8s   %/;:@&=+$,!~*'()?#[])r  r   )r  r  r  r   r  r   r  )rP  r(   r(   r)   escape_rfc3986  s    
r1	  c             C   sF   t | }|j|jjdjdt|jt|jt|jt|j	dj
 S )z#Escape URL as suggested by RFC 3986idnar  )netlocr  r  queryfragment)r   _replacer3	  r  r  r1	  r  r  r4	  r5	  geturl)rb  Z
url_parsedr(   r(   r)   r    s    r  c             C   s2   dd }t j| }dd t||D S Q R X d S )Nc             S   sN   t | ts| jdd} d}| j|r4| t|d  } | j } | jdrJdS | S )	Nzutf-8r'  u   ï»¿rT  ;]F)rT  r8	  r9	  )r  r   r  r  r  r)  )rb  BOM_UTF8r(   r(   r)   rc    s    


zread_batch_urls.<locals>.fixupc             S   s   g | ]}|r|qS r(   r(   )r  rb  r(   r(   r)   r    s    z#read_batch_urls.<locals>.<listcomp>)
contextlibclosingrN  )Zbatch_fdrc  fdr(   r(   r)   read_batch_urls  s    r>	  c              O   s   t | |jdS )Nr  )r   r  )r  kargsr(   r(   r)   urlencode_postdata  s    r@	  c             C   s>   |s| S t j| }t|j}|j| t j|jt|ddS )NT)r4	  )r   r  r   r4	  r  
urlunparser6	  r   )rb  r4	  Z
parsed_urlqsr(   r(   r)   update_url_query  s    


rC	  c             C   s   | j j }|j| |p| j}t|p*| j |}| j }|dkrFt}	n|dkrTt}	nt	j
}	|	|||| j| jd}
t| dr| j|
_|
S )Nr  r  )r  r  origin_req_hostunverifiabler  )r  copyr  r  rC	  r  r  r  r  r   re  rD	  rE	  r2  r  )r  rb  r  r  r4	  Zreq_headersZreq_dataZreq_urlZreq_get_methodZreq_typeZnew_reqr(   r(   r)   r    s     



r  c             C   s   d| }d}x| j  D ]x\}}|d|jd d 7 }t|trH|jd}t|tr\|jd}d| d | d }|jd|krtd	||7 }qW |d|jd d
 7 }||fS )Nz multipart/form-data; boundary=%sr  s   --r  s   
zutf-8s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)r  r  r  r   rr  )r  boundarycontent_typer  r  r  r  r(   r(   r)   _multipart_encode_impl  s    



rI	  c             C   sf   |dk	}xT|dkr&dt tjdd }yt| |\}}P W q
 tk
rX   |rP d}Y q
X q
W ||fS )aR  
    Encode a dict to RFC 7578-compliant form-data

    data:
        A dict where keys and values can be either Unicode or bytes-like
        objects.
    boundary:
        If specified a Unicode object, it's used as the boundary. Otherwise
        a random boundary is generated.

    Reference: https://tools.ietf.org/html/rfc7578
    Nz---------------il    )r  rT  	randrangerI	  rr  )r  rG	  Zhas_specified_boundaryr  rH	  r(   r(   r)   multipart_encode#  s    rK	  c             C   sV   t |ttfrJx6|D ].}|| ks| | d ks|r<| |  r<q| | S W |S | j||S )N)r  r  tupler  )dZkey_or_keysr  Zskip_false_valuesr  r(   r(   r)   dict_getA  s    
"
rN	  c             C   sf   t |ttfs|g}xL|D ]D}y|| }W n ttttfk
rF   Y qX |d ksZt ||r|S qW d S )N)r  r  rL	  r  KeyErrorr  
IndexError)srcgetterZexpected_typer  r  r(   r(   r)   try_getK  s    
rS	  c              G   sl   i }xb| D ]Z}xT|j  D ]H\}}|d kr*q||ksXt|tr|rt|| tr||  r|||< qW q
W |S )N)r  r  r   )ZdictsZmergedZa_dictr  r  r(   r(   r)   merge_dictsX  s    

rT	  r  c             C   s   t | tr| S t| ||S )N)r  r   )stringr  errorsr(   r(   r)   encode_compat_strf  s    rW	  ro     rn     )GPGzPG-13RNC      )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc             C   s   t | tkr,d|   kodkn  r(| S d S t| ts:d S tjd| }|rXt|jdS | tkrht|  S tjddjdd t	D  | }|rt	d	|jd
  S d S )Nr      z^(?P<age>\d{1,2})\+?$Zagez^TV[_-]?(%s)$r  c             s   s   | ]}|d d V  qdS )r  Nr(   )r  r  r(   r(   r)   r    s    z"parse_age_limit.<locals>.<genexpr>zTV-r   )
rw  rq  r  r   r  r  r  
US_RATINGSr  TV_PARENTAL_GUIDELINES)rP  r  r(   r(   r)   parse_age_limit}  s     
 rc	  c             C   s   t jdd| S )Nz(?sx)^
            (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*)
            (?:\s*&&\s*(?P=func_name))?
            \s*\(\s*(?P<callback_data>.*)\);?
            \s*?(?://[^\n]*)*$z\g<callback_data>)r  r(  )r  r(   r(   r)   strip_jsonp  s    rd	  c                sT   d}dj |d}dj |ddfdj |ddff  fd	d
}tjdj ||d|| S )Nz/\*(?:(?!\*/).)*?\*/|//[^\n]*z\s*(?:{comment})?\s*)commentz!(?s)^(0[xX][0-9a-fA-F]+){skip}:?$)skiprn  z(?s)^(0+[0-7]+){skip}:?$r  c                s   | j d}|dkr|S |jds2|jds2|dkr6dS |d dkr\tjddd |dd }xJ D ]B\}}tj||}|rbt|j d|}|jdrd| S d| S qbW d| S )Nr   truefalsenullz/*z//rN  r+   r  r  z	(?s)\\.|"c             S   s"   dddddj | jd| jdS )Nz\"r  r+   z\u00)r  z\'z\
z\xr   )r  r  )r  r(   r(   r)   r    s
    z,js_to_json.<locals>.fix_kv.<locals>.<lambda>r   r  z"%d":z%dz"%s")rg	  rh	  ri	  )r  r  r  )r  r  r  r(  r  rq  r  )r  r  Zregexru  Zimr  )INTEGER_TABLEr(   r)   fix_kv  s    
zjs_to_json.<locals>.fix_kva-  (?sx)
        "(?:[^"\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^"\\]*"|
        '(?:[^'\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^'\\]*'|
        {comment}|,(?={skip}[\]}}])|
        (?:(?<![0-9])[eE]|[a-df-zA-DF-Z_])[.a-zA-Z_0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:{skip}:)?|
        [0-9]+(?={skip}:)
        )re	  rf	  )r  r  r(  )r  Z
COMMENT_REZSKIP_RErk	  r(   )rj	  r)   
js_to_json  s    rl	  c                s    fdd}|S )z> Get a numeric quality value out of a list of possible values c                s$   y
 j | S  tk
r   dS X d S )Nr   r  )r  rr  )Zqid)quality_idsr(   r)   q  s    
zqualities.<locals>.qr(   )rm	  rn	  r(   )rm	  r)   	qualities  s    ro	  z%(title)s-%(id)s.%(ext)sc             C   s8   | dkrdS d}t | |kr4| d|t |  | S | S )z% Add ellipses to overly long strings Nz...)r  )rP  lengthZELLIPSESr(   r(   r)   limit_length  s    rq	  c             C   s   t dd tjd| D S )Nc             s   s   | ]}t |V  qd S )N)rq  )r  er(   r(   r)   r    s    z version_tuple.<locals>.<genexpr>z[-.])rL	  r  r  )r  r(   r(   r)   version_tuple  s    rs	  c             C   s6   | s
| S yt | t |k S  tk
r0   | S X d S )N)rs	  rr  )versionlimitZ
assume_newr(   r(   r)   is_outdated_version  s    rv	  c              C   s(   ddl m}  tt jd| p&ttdS )z. Returns if youtube-dl can be updated with -U r   )zipimporter
__loader__frozen)Z	zipimportrw	  r  globalsr  r2  r  )rw	  r(   r(   r)   r    s    r  c             C   s   dj dd | D S )Nr&  c             s   s   | ]}t |V  qd S )N)r   )r  r  r(   r(   r)   r    s    zargs_to_str.<locals>.<genexpr>)r  )r  r(   r(   r)   args_to_str  s    r{	  c             C   s&   t | }tjd dk r"|jt }|S )Nr   r  )r  r  r  r  r  )r9  Zerr_strr(   r(   r)   error_to_compat_str  s    r|	  c             C   s~   | d krd S dddj | }|d k	r(|S | jd\}}}|jdd j j }ddd	d
ddddddddddddddj ||S )Nr_  r{  )z	audio/mp4z
audio/mpegr  r8	  r   ry  ttdfxpttmlre  r^  Zsamirw  r  Zmpdr  ismru  ts)Z3gppzsmptett+xmlzttaf+xmlzttml+xmlzx-flvzx-mp4-fragmentedz	x-ms-samizx-ms-wmvZmpegurlz	x-mpegurlzvnd.apple.mpegurlzdash+xmlzf4m+xmlzhds+xmlzvnd.ms-sstr+xmlZ	quicktimeZmp2t)r  rV  r  r)  r  )mtr	  rF  r  r(   r(   r)   mimetype2ext  s6    r	  c             C   s   | si S t td tdd | j jdjd}d%\}}xN|D ]F}|jdd }|d&krb|s|}q>|d'krt|s|}q>td | tj q>W | r| rt|d!kr|d |d" d#S n|pd$|pd$d#S i S )(Nc             S   s   | j  S )N)r)  )r  r(   r(   r)   r  #  s    zparse_codecs.<locals>.<lambda>rN  r  r   avc1avc2avc3avc4vp9vp8hev1hev2h263h264mp4vhvc1av01theoramp4aro  vorbisr{  rd  ac-3ec-3eac3dtscdtsedtshdtslzWARNING: Unknown codec %s
r  r   )vcodecacodecnone)NN)r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  )r	  ro  r	  r{  rd  r	  r	  r	  r	  r	  r	  r	  )	r  filterrN  r)  r  r  r  r  r  )Z
codecs_strZsplited_codecsr	  r	  Z
full_codeccodecr(   r(   r)   parse_codecs  s*     
r	  c             C   sJ   | j j}|d}|r>tjd|}|r>t|jdd d}|r>|S t|dS )NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"r7  )rY  zContent-Type)r  r  r  r  rZ  r  r	  )Z
url_handle	getheaderZcdr  rr	  r(   r(   r)   urlhandle_detect_ext=  s    r	  c             C   s   d|t j| jdf S )Nzdata:%s;base64,%sr  )base64	b64encoder  )r  Z	mime_typer(   r(   r)   encode_data_uriK  s    r	  c             C   s    |dkrdS | dkrdS || k S )z0 Returns True iff the content should be blocked NFr(   )Zcontent_limit	age_limitr(   r(   r)   age_restrictedO  s
    r	  c             C   s\   dddddg}x@|D ],\}}| j |r| t|d j|d}P qW | jdd}tjd|S )zC Detect whether a file contains HTML by examining its first bytes.    ﻿utf-8     	utf-32-be     	utf-32-le   	utf-16-le   	utf-16-beNr'  z^\s*<)r	  r	  )r	  r	  )r	  r	  )r	  r	  )r	  r	  )r  r  r  r  r  )Zfirst_bytesZBOMSZbomr  rP  r(   r(   r)   is_htmlY  s    
r	  c             C   sr   | j d}|d k	r|S | d }|jdr,dS |jdr:dS |jdrHdS t|}|dkr\dS |dkrhdS t|jS )Nprotocolrb  rtmpmmsrtspr  r  )r  r  rZ  r   r'   )	info_dictr	  rb  r	  r(   r(   r)   determine_protocolm  s     



r	  c                sT   | g| }dd t | D }djdd |dd D d  d	j fd
d|D S )z1 Render a list of rows, each as a list of values c             S   s   g | ]}t d d |D qS )c             s   s   | ]}t t|V  qd S )N)r  r   )r  r  r(   r(   r)   r    s    z*render_table.<locals>.<listcomp>.<genexpr>)rp  )r  colr(   r(   r)   r    s    z render_table.<locals>.<listcomp>r&  c             s   s"   | ]}d t |d  d V  qdS )z%-r   rP  N)r   )r  mlr(   r(   r)   r    s    zrender_table.<locals>.<genexpr>Nr   z%sr%  c             3   s   | ]} t | V  qd S )N)rL	  )r  row)
format_strr(   r)   r    s    r  )zipr  )Z
header_rowr  tableZmax_lensr(   )r	  r)   render_table  s    
 r	  c       
      C   s  t jt jt jt jt jt jd}tjddj	t
tj|j  }|j| }|r||jd }|j|jd}|jdd k	s|jdd k	s|d k	o|jdd k	ot|tr|jddkrtd|jd |jdp|jdp|jd}|jd}|d k	r|jd| |}ntyt|jd}W n` tk
r   t|jd}|d kr\t|jdd }|d kr|td|jd| f Y nX |d kr|jdS |||S dd dd d}	tjddj	t
tj|	j  }|j| }|r|	|jd }|j|jd}||S td|  d S )N)<z<=>z>==z!=aC  (?x)\s*
        (?P<key>[a-z_]+)
        \s*(?P<op>%s)(?P<none_inclusive>\s*\?)?\s*
        (?:
            (?P<intval>[0-9.]+(?:[kKmMgGtTpPeEzZyY]i?[Bb]?)?)|
            (?P<quote>["\'])(?P<quotedstrval>(?:\\.|(?!(?P=quote)|\\).)+?)(?P=quote)|
            (?P<strval>(?![0-9.])[a-z0-9A-Z]*)
        )
        \s*$
        r  opr  ZquotedstrvalstrvalZintvalr	  !=z+Operator %s does not support string values!r  z\%sr  z*Invalid integer value %r in filter part %rZnone_inclusivec             S   s   t | tr| dkS | d k	S )NT)r  r	  )r  r(   r(   r)   r    s    z_match_one.<locals>.<lambda>c             S   s   t | tr| dkS | d kS )NF)r  r	  )r  r(   r(   r)   r    s    )r+   !zC(?x)\s*
        (?P<op>%s)\s*(?P<key>[a-z_]+)
        \s*$
        zInvalid filter part %r)r	  r	  )operatorltlegtgeeqner  compiler  rN  r  keysr=  r  r  r  r   rr  r'  rq  r  )
filter_partdctZCOMPARISON_OPERATORSZoperator_rexr  r	  Zactual_valueZcomparison_valuer  ZUNARY_OPERATORSr(   r(   r)   
_match_one  s\    
	








r	  c                s   t  fdd| jdD S )zY Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false c             3   s   | ]}t | V  qd S )N)r	  )r  r	  )r	  r(   r)   r    s    zmatch_str.<locals>.<genexpr>&)allr  )
filter_strr	  r(   )r	  r)   	match_str  s    r	  c                s    fdd}|S )Nc                s2   t  | rd S | jd| jdd}d| f S d S )Nr  r  Zvideoz'%s does not pass filter %s, skipping ..)r	  r  )r	  Zvideo_title)r	  r(   r)   _match_func  s    
z&match_filter_func.<locals>._match_funcr(   )r	  r	  r(   )r	  r)   match_filter_func  s    r	  c             C   st   | sd S t jd| }|r&t|jdS t jd| }|rpdt|jd dt|jd  t|jdjd	d
 S d S )Nz"^(?P<time_offset>\d+(?:\.\d+)?)s?$Ztime_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$i  r   r  r  r  r  r  )r  r  r  r  rq  r'  )Z	time_exprrt  r(   r(   r)   parse_dfxp_time_expr  s    r	  c             C   s(   d| d | d d | d | d d f S )Nz%02d:%02d:%02d,%03di  r  r   i  r(   )secondsr(   r(   r)   srt_subtitles_timecode  s    r	  c                s~  ddddgfddgff}ddd	d
ddg t jtdddddi i G  fdddtfdd}x*|D ]"\}}x|D ]}| j||} qW qrW t| }g }|jdp|jd}|stdd}	xx|jdD ]}
|
jdp|
jd}|sq|
jd}|r2|kr"d}	qވ| j	 |< x6 D ].}|
jd| }|r8|j
|i |< q8W qW |	rzd}	qP qW xZd+D ]R}t|d"| d#| g}|d$krqj|jd}
|
s̐qj|
 qW xt|tjd%D ]\}}t|jjd&}t|jjd'}t|jjd(}|d$kr4q|sL|sDq|| }|jd)|t|t|||f  qW d*j|S ),z
    @param dfxp_data A bytes-like object containing DFXP data
    @returns A unicode object containing converted SRT data
    s   http://www.w3.org/ns/ttmls   http://www.w3.org/2004/11/ttaf1s   http://www.w3.org/2006/04/ttaf1s   http://www.w3.org/2006/10/ttaf1s!   http://www.w3.org/ns/ttml#stylings   http://www.w3.org/ns/ttml#stylecolor
fontFamilyfontSize	fontStyle
fontWeighttextDecorationz$http://www.w3.org/XML/1998/namespacezhttp://www.w3.org/ns/ttmlz!http://www.w3.org/ns/ttml#styling)xmlr	  Ztts)r  c                   sF   e Zd ZdZg Zg Z fddZfddZdd Zdd	 Z	d
S )z$dfxp2srt.<locals>.TTMLPElementParserr+   c                s  |ddfkr"|  j d7  _ ng }i }|jd}rB|j |rX|jj|i  x* D ]"}|jd| }|r^|||< q^W |rd} xt|j D ]\}	}
| jr| jd j|	|
krq|	dkr|d	|
 7 }q|	d
kr|d|
 7 }q|	dkr|d|
 7 }q|	dkr4|
dkr4|  j d7  _ |jd q|	dkrb|
dkrb|  j d7  _ |jd q|	dkr|
dkr|  j d7  _ |jd qW |r|  j d| d 7  _ |jd i }| jr|j| jd  |j| | jj| | jj| d S )Nzttml:brbrr%  styleztts:r+   r   r	  z color="%s"r	  z
 size="%s"r	  z
 face="%s"r	  Zboldz<b>r  r	  Zitalicz<i>r  r	  Z	underlinez<u>r  z<fontr	  fontr  r  )_outr  r  sortedr  _applied_stylesr&   _unclosed_elements)r  r  r  unclosed_elementsr	  Zelement_style_idpropprop_valr	  r  r  Zapplied_style)SUPPORTED_STYLING_xdefault_stylestylesr(   r)   rm    sT    





z*dfxp2srt.<locals>.TTMLPElementParser.startc                sV   | ddfkrR| j j }x"t|D ]}|  jd| 7  _q$W |rR| jrR| jj  d S )Nzttml:brr	  z</%s>)r	  rZ  reversedr	  r	  )r  r  r	  element)r	  r(   r)   ro  G  s    

z(dfxp2srt.<locals>.TTMLPElementParser.endc             S   s   |  j |7  _ d S )N)r	  )r  r  r(   r(   r)   r  O  s    z)dfxp2srt.<locals>.TTMLPElementParser.datac             S   s
   | j j S )N)r	  r)  )r  r(   r(   r)   r"  R  s    z*dfxp2srt.<locals>.TTMLPElementParser.closeN)
r  r  r  r	  r	  r	  rm  ro  r  r"  r(   )r	  r	  r	  r	  r(   r)   TTMLPElementParser  s   -r	  c                s2     }t jjj|d}|jt jjj|  |j S )N)target)r	  etreeElementTree	XMLParserr!  tostringr"  )r  r	  r#  )r	  r(   r)   
parse_nodeU  s    zdfxp2srt.<locals>.parse_nodez	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFz.//ttml:styler  zxml:idr	  Tztts:bodydivz.//ttml:z.//Nr   beginro  durz%d
%s --> %s
%s

r+   )r	  r	  )r  r  r  objectr'  r
   r  rr  r  rF	  
setdefaultr  r  r	  r'	  r  r	  r  r&   r	  r  )Z	dfxp_dataZLEGACY_NAMESPACESr	  r  r  r  r~	  r  Zparasrepeatr	  Zstyle_idZparent_style_idr	  r	  pZeleparar  Z
begin_timeZend_timer	  r(   )r	  r	  r	  r	  r	  r)   dfxp2srt  s    
@






r
  c             C   s*   | j |}|rt|}|d k	r&||gS g S )N)r  r   )r  command_optionparamr(   r(   r)   
cli_option  s    
r
  rg	  rh	  c             C   sN   | j |}|d krg S t|ts$t|r>|| |r6|n| gS ||rH|n|gS )N)r  r  r	  r  )r  r
  r
  Z
true_valueZfalse_value	separatorr(   r(   r)   cli_bool_option  s    
r
  c             C   s   | j |}||kr|gS g S )N)r  )r  r
  r
  Zexpected_valuer(   r(   r)   cli_valueless_option  s    
r	
  c             C   s(   | j |}|d kr|S t|ts$t|S )N)r  r  r  r  )r  r
  r  Zex_argsr(   r(   r)   cli_configuration_args  s
    
r

  c               @   s  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d9d:d;d<d=d>d?d@dAdBdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd Zedd ZdS )ISO639UtilsZaarZabkZaveZafrZakaZamhargZaraZasmZavaZaymZazeZbakZbelZbulZbihZbisZbamZbenZbodZbreZboscatZcheZchacosZcreZcesZchuZchvZcymZdanZdeur	  ZdzoZeweZellZengZepoZspaZestZeusZfasZfulZfinZfijZfaoZfraZfryZgleZglaZglgZgrnZgujZglvZhauZhebZhinZhmoZhrvZhatZhunZhyeZherZinaZindZileZiboZiiiZipkZidoZislZitaZikuZjpnZjavZkatZkonZkikZkuaZkazZkalZkhmZkanZkorZkauZkasZkurZkomZcorZkirZlatZltzZlugZlimZlinZlaoZlitZlubZlavZmlgZmahZmriZmkdZmalmonmarZmsaZmltZmyaZnauZnobZndeZnepZndoZnldZnnoZnorZnblZnavZnyaZociZojiZormZoriZossZpanZpliZpolZpusZporZqueZrohrunZronZrusZkinsanZsrdZsndZsmeZsagsinZslkZslvZsmoZsnaZsomZsqiZsrpZsswZsotsunZsweZswaZtamtelZtgkZthaZtirZtukZtglZtsnZtonZturZtsoZtatZtwiZtahZuigZukrZurdZuzbZvenZvieZvolZwlnZwolZxhoZyidZyorZzhaZzhoZzul)Zaaabr  r  ZakamZanarasavZayazZbabebgZbhZbiZbmZbnZbor	  r  caZcechcoZcrcsZcuZcvcydadeZdvZdzeerk  r\  eoeseteufaZfffifjfor]  ZfygagdglZgnZgugvZhaheiwhiZhohrhthuZhyhziar  inieZigiiZikr  isitiujaZjvkaZkgZkiZkjr  klZkmknkoZkrksZkuZkvkwkyZlaZlbZlgZliZlnlor	  ZlulvZmgZmhmimkr	  Zmnmrr		  r	  ZmyZnanbZndr	  ZngnlnnnonrnvnyocZojZomorr  papiplZpsptZquZrmZrnrorurwr  ZscsdZseZsgsiskslZsmZsnsosqsrr  stZsusvswtatetgr  ZtiZtktltnZtotrr	  r}	  ZtwtyZugukuruzveviZvowaZwoxhyiZjiZyoZzazhzuc             C   s   | j j|dd S )z3Convert language code from ISO 639-1 to ISO 639-2/TNr  )	_lang_mapr  )rq  r  r(   r(   r)   
short2longu  s    zISO639Utils.short2longc             C   s(   x"| j j D ]\}}||kr|S qW dS )z3Convert language code from ISO 639-2/T to ISO 639-1N)rx
  r  )rq  r  Z
short_nameZ	long_namer(   r(   r)   
long2shortz  s    zISO639Utils.long2shortN)r  r  r  rx
  ru  ry
  rz
  r(   r(   r(   r)   r
    sz  r
  c               @   s  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd ZdS )ISO3166UtilsZAfghanistanu   Åland IslandsZAlbaniaZAlgeriazAmerican SamoaZAndorraZAngolaZAnguillaZ
AntarcticazAntigua and BarbudaZ	ArgentinaZArmeniaZArubaZ	AustraliaZAustriaZ
AzerbaijanZBahamasZBahrainZ
BangladeshZBarbadosZBelarusZBelgiumZBelizeZBeninZBermudaZBhutanzBolivia, Plurinational State ofz Bonaire, Sint Eustatius and SabazBosnia and HerzegovinaZBotswanazBouvet IslandZBrazilzBritish Indian Ocean TerritoryzBrunei DarussalamZBulgariazBurkina FasoZBurundiZCambodiaZCameroonZCanadaz
Cape VerdezCayman IslandszCentral African RepublicZChadZChileZChinazChristmas IslandzCocos (Keeling) IslandsZColombiaZComorosZCongoz%Congo, the Democratic Republic of thezCook Islandsz
Costa Ricau   Côte d'IvoireZCroatiaZCubau   CuraçaoZCypruszCzech RepublicZDenmarkZDjiboutiZDominicazDominican RepublicZEcuadorZEgyptzEl SalvadorzEquatorial GuineaZEritreaZEstoniaZEthiopiazFalkland Islands (Malvinas)zFaroe IslandsZFijiZFinlandZFrancezFrench GuianazFrench PolynesiazFrench Southern TerritoriesZGabonZGambiaZGeorgiaZGermanyZGhanaZ	GibraltarZGreeceZ	GreenlandZGrenadaZ
GuadeloupeZGuamZ	GuatemalaZGuernseyZGuineazGuinea-BissauZGuyanaZHaitiz!Heard Island and McDonald IslandszHoly See (Vatican City State)ZHondurasz	Hong KongZHungaryZIcelandZIndiaZ	IndonesiazIran, Islamic Republic ofZIraqZIrelandzIsle of ManZIsraelZItalyZJamaicaZJapanZJerseyZJordanZ
KazakhstanZKenyaZKiribatiz&Korea, Democratic People's Republic ofzKorea, Republic ofZKuwaitZ
Kyrgyzstanz Lao People's Democratic RepublicZLatviaZLebanonZLesothoZLiberiaZLibyaZLiechtensteinZ	LithuaniaZ
LuxembourgZMacaoz*Macedonia, the Former Yugoslav Republic ofZ
MadagascarZMalawiZMalaysiaZMaldivesZMaliZMaltazMarshall IslandsZ
MartiniqueZ
MauritaniaZ	MauritiusZMayotteZMexicozMicronesia, Federated States ofzMoldova, Republic ofZMonacoZMongoliaZ
MontenegroZ
MontserratZMoroccoZ
MozambiqueZMyanmarZNamibiaZNauruZNepalZNetherlandszNew CaledoniazNew ZealandZ	NicaraguaZNigerZNigeriaZNiuezNorfolk IslandzNorthern Mariana IslandsZNorwayZOmanZPakistanZPalauzPalestine, State ofZPanamazPapua New GuineaZParaguayZPeruZPhilippinesZPitcairnZPolandZPortugalzPuerto RicoZQataru   RéunionZRomaniazRussian FederationZRwandau   Saint Barthélemyz,Saint Helena, Ascension and Tristan da CunhazSaint Kitts and NeviszSaint LuciazSaint Martin (French part)zSaint Pierre and Miquelonz Saint Vincent and the GrenadinesZSamoaz
San MarinozSao Tome and PrincipezSaudi ArabiaZSenegalZSerbiaZ
SeychelleszSierra LeoneZ	SingaporezSint Maarten (Dutch part)ZSlovakiaZSloveniazSolomon IslandsZSomaliazSouth Africaz,South Georgia and the South Sandwich IslandszSouth SudanZSpainz	Sri LankaZSudanZSurinamezSvalbard and Jan MayenZ	SwazilandZSwedenZSwitzerlandzSyrian Arab RepubliczTaiwan, Province of ChinaZ
TajikistanzTanzania, United Republic ofZThailandzTimor-LesteZTogoZTokelauZTongazTrinidad and TobagoZTunisiaZTurkeyZTurkmenistanzTurks and Caicos IslandsZTuvaluZUgandaZUkrainezUnited Arab EmirateszUnited KingdomzUnited Statesz$United States Minor Outlying IslandsZUruguayZ
UzbekistanZVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaZYemenZZambiaZZimbabwe)AFAXALDZASADAOAIAQAGARAMAWAUATAZBSBHBDBBBYBEBZBJBMBTBOBQBABWZBVBRIOBNBGBFBIKHCMCACVKYCFTDCLCNZCXZCCCOKMCGCDCKCRCIHRCUCWCYCZDKDJDMDOECEGSVGQEREEETFKFOFJFIFRGFPFZTFGAGMGEDEGHGIGRGLGDGPGUGTGGGNGWGYHTZHMVAHNHKHUISINIDIRIQIEIMILITJMJPJEJOKZKEKIKPKRKWKGLALVLBLSLRLYLILTLUMOMKMGMWMYMVMLMTMHMQMRMUYTMXFMMDMCMNMEMSMAMZMMNANRNPNLr]	  NZNINENGNUNFMPNOOMPKPWPSPAr[	  PYPEPHZPNPLPTPRQARERORURWBLZSHKNLCMFPMVCWSSMSTSASNRSSCSLSGSXSKSISBSOZAZGSSSESLKSDSRZSJSZSECHSYTWTJTZr  TLTGTKTOTTTNTRTMTCTVUGUAr  r  USZUMUYUZVUVEVNVGVIWFZEHYEZMZWc             C   s   | j j|j S )zAConvert an ISO 3166-2 country code to the corresponding full name)_country_mapr  upper)rq  r  r(   r(   r)   
short2full  s    zISO3166Utils.short2fullN)r  r  r  re  ru  rg  r(   r(   r(   r)   r{
    s  r{
  c               @   s  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd ZdS )GeoUtilsz46.172.224.0/19z94.200.0.0/13z149.54.0.0/17z209.59.64.0/18z204.14.248.0/21z46.99.0.0/16z46.70.0.0/15z105.168.0.0/13z182.50.184.0/21z23.154.160.0/24z181.0.0.0/12z202.70.112.0/20z77.116.0.0/14z1.128.0.0/11z181.41.0.0/18z185.217.4.0/22z5.197.0.0/16z31.176.128.0/17z65.48.128.0/17z114.130.0.0/16z
57.0.0.0/8z102.178.0.0/15z95.42.0.0/15z37.131.0.0/17z154.117.192.0/18z137.255.0.0/16z185.212.72.0/23z196.12.64.0/18z156.31.0.0/16z161.56.0.0/16z161.0.80.0/20z191.128.0.0/12z24.51.64.0/18z119.2.96.0/19z168.167.0.0/16z178.120.0.0/13z179.42.192.0/18z99.224.0.0/11z41.243.0.0/16z197.242.176.0/21z160.113.0.0/16z85.0.0.0/13z102.136.0.0/14z202.65.32.0/19z152.172.0.0/14z102.244.0.0/14z36.128.0.0/10z181.240.0.0/12z201.192.0.0/12z152.206.0.0/15z165.90.96.0/19z190.88.128.0/17z31.153.0.0/16z88.100.0.0/14z
53.0.0.0/8z197.241.0.0/17z87.48.0.0/12z192.243.48.0/20z152.166.0.0/15z41.96.0.0/12z186.68.0.0/15z90.190.0.0/15z156.160.0.0/11z196.200.96.0/20z88.0.0.0/11z196.188.0.0/14z2.16.0.0/13z91.152.0.0/13z144.120.0.0/16z80.73.208.0/21z119.252.112.0/20z88.85.32.0/19z
90.0.0.0/9z41.158.0.0/15z
25.0.0.0/8z74.122.88.0/21z31.146.0.0/16z161.22.64.0/18z62.68.160.0/19z154.160.0.0/12z95.164.0.0/16z88.83.0.0/19z160.182.0.0/15z197.149.192.0/18z104.250.0.0/19z105.235.224.0/20z94.64.0.0/13z168.234.0.0/16z168.123.0.0/16z197.214.80.0/20z181.41.64.0/18z113.252.0.0/14z181.210.0.0/16z93.136.0.0/13z148.102.128.0/17z84.0.0.0/14z39.192.0.0/10z87.32.0.0/12z79.176.0.0/13z5.62.80.0/20z117.192.0.0/10z203.83.48.0/21z37.236.0.0/14z2.176.0.0/12z82.221.0.0/16z79.0.0.0/10z87.244.64.0/18z72.27.0.0/17z176.29.0.0/16z133.0.0.0/8z105.48.0.0/12z158.181.128.0/17z36.37.128.0/17z103.25.140.0/22z197.255.224.0/20z198.167.192.0/19z175.45.176.0/22z175.192.0.0/10z37.36.0.0/14z64.96.0.0/15z2.72.0.0/13z115.84.64.0/18z178.135.0.0/16z24.92.144.0/20z82.117.0.0/19z112.134.0.0/15z102.183.0.0/16z129.232.0.0/17z78.56.0.0/13z188.42.0.0/16z46.109.0.0/16z41.252.0.0/14z105.128.0.0/11z88.209.64.0/18z37.246.0.0/16z178.175.0.0/17z74.112.232.0/21z154.126.0.0/17z117.103.88.0/21z77.28.0.0/15z154.118.128.0/18z37.111.0.0/17z49.0.128.0/17z60.246.0.0/16z202.88.64.0/20z109.203.224.0/19z41.188.64.0/18z208.90.112.0/22z46.11.0.0/16z105.16.0.0/12z27.114.128.0/18z102.70.0.0/15z187.192.0.0/11z175.136.0.0/13z197.218.0.0/15z41.182.0.0/16z101.101.0.0/18z197.214.0.0/18z203.17.240.0/22z105.112.0.0/12z186.76.0.0/15z145.96.0.0/11z84.208.0.0/13z36.252.0.0/15z203.98.224.0/19z49.156.48.0/22z49.224.0.0/14z5.36.0.0/15z186.72.0.0/15z186.160.0.0/14z123.50.64.0/18z124.240.192.0/19z49.144.0.0/13z39.32.0.0/11z83.0.0.0/11z70.36.0.0/20z66.50.0.0/16z188.161.0.0/16z85.240.0.0/13z202.124.224.0/20z181.120.0.0/14z37.210.0.0/15z102.35.0.0/16z79.112.0.0/13z93.86.0.0/15z5.136.0.0/13z41.186.0.0/16z188.48.0.0/13z202.1.160.0/19z154.192.0.0/11z102.120.0.0/13z78.64.0.0/12z8.128.0.0/10z188.196.0.0/14z78.98.0.0/15z102.143.0.0/17z89.186.32.0/19z41.82.0.0/15z154.115.192.0/18z186.179.128.0/17z105.235.208.0/21z197.159.160.0/19z168.243.0.0/16z190.102.0.0/20z
5.0.0.0/16z41.84.224.0/19z65.255.48.0/20z154.68.128.0/19z196.168.0.0/14z171.96.0.0/13z85.9.128.0/18z27.96.24.0/21z180.189.160.0/20z95.85.96.0/19z197.0.0.0/11z175.176.144.0/21z78.160.0.0/11z186.44.0.0/15z202.2.96.0/19z120.96.0.0/11z156.156.0.0/14z37.52.0.0/14z102.80.0.0/13z	6.0.0.0/8z167.56.0.0/13z84.54.64.0/18z212.77.0.0/19z207.191.240.0/21z186.88.0.0/13z66.81.192.0/20z146.226.0.0/16z14.160.0.0/11z202.80.32.0/20z117.20.32.0/21z202.4.32.0/19z134.35.0.0/16z41.242.116.0/22z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)r
  r  r|
  r
  r
  r~
  r
  r
  ZAPr
  r
  r
  r
  r
  r
  r}
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r,  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  rH  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  rB  r
  ZEUr
  r
  r
  r  r
  r
  r
  r  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r-  r
  r
  r
  r
  r
  r
  r
  r.  r
  rC  r
  r
  r
  r
  r
  r
  r  r	  r  r  r/  r
  r  r
  r
  r  r
  r
  r  r  r  r  r   r  r
  r
  r  r
  r  r  r]	  r  r  r  r  r  r  r  r  r  r  r  r   r"  r
  r[	  r#  r  r$  r0  r&  r  r%  r  r!  r'  r(  r)  r7  r*  r+  r5  r>  r8  rD  rG  r:  r=  r<  r9  r3  r6  r?  rE  rA  r4  r
  r;  rI  rF  rU  r
  rN  r  rK  rO  rM  rT  rR  rP  rS  rQ  rV  rJ  rL  rX  rW  rY  rZ  r[  r
  r1  r]  r_  r`  r^  r\  ra  r2  rb  r  r@  rc  rd  c             C   sx   t |dkr&| jj|j }|s*d S n|}|jd\}}tdtj|d }|dt|? B }t	tj
tdtj||S )Nr  r  z!Lr   l    )r  _country_ip_mapr  rf  r  r   r  	inet_atonrq  r   	inet_ntoar   rT  randint)rq  Zcode_or_blockblockr  ZpreflenZaddr_minZaddr_maxr(   r(   r)   random_ipv4{  s    zGeoUtils.random_ipv4N)r  r  r  ri  ru  rn  r(   r(   r(   r)   rh    s  rh  c               @   s   e Zd ZdddZdd ZdS )PerRequestProxyHandlerNc             C   s>   x*dD ]"}t | d| d|| jfdd qW tjj| | d S )Nhttphttpsz%s_open__noproxy__c             S   s   || ||S )Nr(   )r  proxyrw  methr(   r(   r)   r    s    z1PerRequestProxyHandler.__init__.<locals>.<lambda>)rp  rq  )setattr
proxy_openr   ProxyHandlerr  )r  proxiesrw  r(   r(   r)   r    s    

zPerRequestProxyHandler.__init__c             C   sb   |j jd}|d k	r |}|j d= |dkr,d S tj|jj dkrP|jd| d S tjj	| |||S )	NzYtdl-request-proxyrr  r!   r"   r#   r$   zYtdl-socks-proxy)r!   r"   r#   r$   )
r  r  r   r  r'   r  r  r   rw  rv  )r  r  rs  rw  Z	req_proxyr(   r(   r)   rv    s    z!PerRequestProxyHandler.proxy_open)N)r  r  r  r  rv  r(   r(   r(   r)   ro    s   
ro  c             C   s   d}t | } x&| dkr2td| d@ | }| d? } qW x*tt|D ]}|| dkrBP qBW d}d}||d }|dkrt|| r|t||  d | }|S )	a  long_to_bytes(n:long, blocksize:int) : string
    Convert a long integer to a byte string.

    If optional blocksize is given and greater than zero, pad the front of the
    byte string with binary zeros so that the length is a multiple of
    blocksize.
    r  r   z>Il    rD      Nr   )rq  r   r  r  )r  	blocksizerP  r  r(   r(   r)   long_to_bytes  s    	
r{  c             C   sp   d}t | }|d r4d|d  }d| |  } || }x6td|dD ]&}|d> td| ||d  d  }qBW |S )zbytes_to_long(string) : long
    Convert a byte string to a long integer.

    This is (essentially) the inverse of long_to_bytes().
    r   r  ry  rD  z>I)r  r  r   )rP  accrp	  extrar  r(   r(   r)   bytes_to_long  s    &r~  c             C   s.   t tj| ddd d}t|||}d| S )a0  
    Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/

    Input:
        data: data to encrypt, bytes-like object
        exponent, modulus: parameter e and N of RSA algorithm, both integer
    Output: hex string of encrypted data

    Limitation: supports one block encryption only
    Nr   rn  z%xr  )rq  binasciihexlifypow)r  r  moduluspayloadZ	encryptedr(   r(   r)   ohdave_rsa_encrypt  s    r  c             C   sL   t | |d krtddd t|t |  d D }ddg| dg |  S )z
    Padding input data with PKCS#1 scheme

    @param {int[]} data        input data
    @param {int}   length      target length
    @returns {int[]}           padded data
    rw  z&Input data too long for PKCS#1 paddingc             S   s   g | ]}t jd dqS )r      )rT  rl  )r  rF  r(   r(   r)   r    s    zpkcs1pad.<locals>.<listcomp>r  r   r  )r  rr  r  )r  rp	  Zpseudo_randomr(   r(   r)   pkcs1pad  s    r  c             C   sn   d}|s|d | }|t |kr4td|t |f | dkrD|d S d}x | rh|| |  | }| | } qJW |S )NZ>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase %d exceeds table length %dr   r+   )r  rr  )r  r  r	  Z
FULL_TABLEr  r(   r(   r)   encode_base_n  s    r  c                s|   t jt| }|j \}}}}t|}t|}|jd}i  x*|rd|d8 }t||}|| p\| |< q<W t jd fdd|S )Nr  r   z	\b(\w+)\bc                s    | j d S )Nr   )r  )rt  )symbol_tabler(   r)   r    s    z%decode_packed_codes.<locals>.<lambda>)r  r=  PACKED_CODES_RErj  rq  r  r  r(  )r  rt  Zobfucasted_coderu  r  ZsymbolsZbase_n_countr(   )r  r)   decode_packed_codes  s    

r  c                s0   dkr| S t  dj fdd| D S )Nr   r+   c             3   s0   | ](}| kr$  j |   n|V  qd S )N)r  )r  r  )alphabetlshiftr(   r)   r    s   zcaesar.<locals>.<genexpr>)r  r  )rP  r  r  r(   )r  r  r  r)   caesar  s    r  c             C   s   t | ddS )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/   )r  )rP  r(   r(   r)   rot47#  s    r  c             C   s@   i }x6t jd| D ]&\}}|jdr0|dd }|||< qW |S )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r  r   r  )r  r  r  )r  infor  r  r(   r(   r)   parse_m3u8_attributes'  s    
r  c             C   s   | dkr| |? S | d |? S )Nr   l        r(   )r  r  r(   r(   r)   urshift0  s    r  c                s  | dd  }| d d dks,|dd dkr4t ddddd	  fd
d}g }xr|r||d d }|dd  }|d d }|dd  }|d | }||d  }|dd  }|j|||d qRW |d d }||d d }||dd }	d}
x$|D ]}|d dkr|
|d 7 }
qW |
s(t dttj|
}|d g fdd}xt|	D ]}|d  }|| }g }j| xntD ]`}|d| |  }| | }d}d}|dkr||d }|dkr|| }|dkr|| d@ }n|dkr|| d@ }n|dkr6||| d?  d@ }n|dkr|}|}d}|dkrp|dkrp|| d }|| | }t|| }t|| }t|| }||kr||kr|| d@ }n$||kr|| d@ }n|| d@ }|j| qW q\W ||	fS )Nr  s   PNG

r  s   IHDRzNot a valid PNG file.z>Bz>Hz>I)r   r  r  c                s   t  t|  | d S )Nr   )r   r  )rm  )int_mapr(   r)   r  >  s    zdecode_png.<locals>.<lambda>)rw  rp	  r  r   r  r  rw  s   IDATzUnable to read PNG data.r  c                s   |  }|  } | | S )Nr(   )idxrm  r  )pixelsstrider(   r)   
_get_pixelg  s    zdecode_png.<locals>._get_pixelr   r     )r4  r&   	bytearrayr  r  r  abs)Zpng_dataheaderZunpack_integerchunksrp	  Z
chunk_typeZ
chunk_dataZihdrr  r  ZidatchunkZdecompressed_datar  r  ZbasePosZfilter_typeZcurrent_rowrm  r	  ZbasexleftZupr  r  r  r
  rV
  r  Zpcr(   )r  r  r  r)   
decode_png6  s     








r  c             C   s\  ydd l }t|drDd}t|jt|k r<td||jf |j}n|j}y|| || W n0 tk
r } zt|j	|j
W Y d d }~X nX W n tk
rV   tdkr0d|ksttjj| st| d | }y$t|d}|j| W d Q R X W n2 tk
r* } zt|j	|j
W Y d d }~X nX n"tdd	g}	td
dg}
|	sT|
r2|jd}|	rvd}d|d|g}n|
rd
}d||g}t|dgdd |D  t| dg }ytj|tjtjtjd}W n2 tk
r } zt|j	|j
W Y d d }~X nX |j \}}|jdd}|jdkrRt|j|n tjjdrJtdntdY nX d S )Nr   setz0.5.0zpython-pyxattr is detected but is too old. youtube-dl requires %s or above while your version is %s. Falling back to other xattr implementationsntr  r  Zsetfattrz	--versionxattrz-hzutf-8z-nz-vz-wTc             S   s   g | ]}t |qS r(   )r  )r  or(   r(   r)   r    s    zwrite_xattr.<locals>.<listcomp>)r/  r  r	  r'  linuxzCouldn't find a tool to set the xattrs. Install either the python 'pyxattr' or 'xattr' modules, or the GNU 'attr' package (which contains the 'setfattr' tool).zhCouldn't find a tool to set the xattrs. Install either the python 'xattr' module, or the 'xattr' binary.)r  r2  rs	  __version__r  r  setxattrEnvironmentErrorr  r5  strerrorImportErrorr   r  r  r  existsr3  r(  r	  r  r  r	  r	  r	  r	  
returncoder  r  r  )r  r  r	  r  Zpyxattr_required_versionr  rr	  Zads_fnr  Zuser_has_setfattrZuser_has_xattr
executableoptscmdr
  r/  r  r(   r(   r)   write_xattr  sb    
&
$

& r  c             C   s^   t jddd}t jddd}tjd|| j}|t j| }| t|j|t|j|t|j	iS )Ni  r   i  rS     r   )
r>  rg  rT  rl  r`  r?  r  rf  rc  rd  )Z
year_fieldZmonth_fieldZ	day_fieldZ
start_dateZend_dateoffsetZrandom_dater(   r(   r)   random_birthday  s    

r  )%r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  )$r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r  )N)N)T)T)FF)F)F)rC  N)T)T)T)rU  )N)NN)N)r\  )r   NNr   )N)r   r   N)N)N)N)N)Nr	  )N)NT)N)T)rg	  rh	  N)T)r   )N("  
__future__r   r	  r  rE  r-	  r;	  r  r>  email.utilsr;  Zemail.headerr5  r  r  r  r'	  r  r  r  r	  r  r  rT  r  r  r  r	  r  r  r  xml.etree.ElementTreer	  r  compatr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r   r    r*   rw  r	  Zcompiled_regex_typerV  r  ZUSER_AGENTSr	  r  r  r  rX  r  r	  chainrG  ZDATE_FORMATSr  rJ  r(	  rK  r  Z
JSON_LD_REr  r  r  r  r  r  r  r  r  r  r   r  r  r  r$  r*  r:  rB  rR  r6  rd  rg  ri  rl  rv  r  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r/  r.  r4  r3  rB  rI  rM  rR  rT  rZ  r]  ri  rk  rl  rv  r  r  r  r  r  r-  	Structurer  r  r  r  r}  r  r~  r  argtypesr  restyper  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rX  r  r  r  r  r  re  r  r  r 	  r	  r  r	  r	  r	  r	  r
	  r	  r[  r	  r	  r	  r	  r 	  r*	  r/	  r0	  r1	  r  r>	  r@	  rC	  r  rI	  rK	  rN	  rS	  rT	  rW	  ra	  rb	  rc	  rd	  rl	  ro	  DEFAULT_OUTTMPLrq	  rs	  rv	  r  r{	  r|	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r
  r
  r
  r	
  r

  r
  r{
  rh  rw  ro  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r(   r(   r(   r)   <module>   s  t
            <                                               6
 	)			
			A
{+0	!

K		

	
	G
			:
4


)

		%
F
 %
 N    		iT