require "pool/connection" CHROME_VERSIONS = [ "68.0.3440.103", "68.0.3440.104", "68.0.3440.105", "68.0.3440.106", "68.0.3440.107", "68.0.3440.108", "68.0.3440.109", "68.0.3440.110", "68.0.3440.111", "68.0.3440.112", "68.0.3440.113", "68.0.3440.114", "68.0.3440.115", "68.0.3440.116", "68.0.3440.117", "68.0.3440.118", "68.0.3440.119", "68.0.3440.120", "68.0.3440.121", "68.0.3440.122", "68.0.3440.123", "68.0.3440.124", "68.0.3440.125", "68.0.3440.126", "68.0.3440.127", "68.0.3440.128", "68.0.3440.129", "68.0.3440.130", "68.0.3440.131", "68.0.3440.132", "68.0.3440.133", "68.0.3440.134", "69.0.3497.100", "69.0.3497.101", "69.0.3497.102", "69.0.3497.103", "69.0.3497.104", "69.0.3497.105", "69.0.3497.106", "69.0.3497.107", "69.0.3497.108", "69.0.3497.109", "69.0.3497.110", "69.0.3497.111", "69.0.3497.112", "69.0.3497.113", "69.0.3497.114", "69.0.3497.115", "69.0.3497.116", "69.0.3497.117", "69.0.3497.118", "69.0.3497.119", "69.0.3497.120", "69.0.3497.121", "69.0.3497.122", "69.0.3497.123", "69.0.3497.124", "69.0.3497.125", "69.0.3497.126", "69.0.3497.127", "69.0.3497.128", "69.0.3497.28", "69.0.3497.29", "69.0.3497.30", "69.0.3497.31", "69.0.3497.32", "69.0.3497.33", "69.0.3497.34", "69.0.3497.35", "69.0.3497.36", "69.0.3497.37", "69.0.3497.38", "69.0.3497.39", "69.0.3497.40", "69.0.3497.41", "69.0.3497.42", "69.0.3497.43", "69.0.3497.44", "69.0.3497.45", "69.0.3497.46", "69.0.3497.47", "69.0.3497.48", "69.0.3497.49", "69.0.3497.50", "69.0.3497.51", "69.0.3497.52", "69.0.3497.53", "69.0.3497.54", "69.0.3497.55", "69.0.3497.56", "69.0.3497.57", "69.0.3497.58", "69.0.3497.60", "69.0.3497.64", "69.0.3497.65", "69.0.3497.66", "69.0.3497.67", "69.0.3497.68", "69.0.3497.69", "69.0.3497.70", "69.0.3497.71", "69.0.3497.72", "69.0.3497.73", "69.0.3497.74", "69.0.3497.75", "69.0.3497.76", "69.0.3497.77", "69.0.3497.78", "69.0.3497.79", "69.0.3497.80", "69.0.3497.81", "69.0.3497.82", "69.0.3497.83", "69.0.3497.84", "69.0.3497.85", "69.0.3497.86", "69.0.3497.87", "69.0.3497.88", "69.0.3497.89", "69.0.3497.90", "69.0.3497.91", "69.0.3497.92", "69.0.3497.93", "69.0.3497.94", "69.0.3497.95", "69.0.3497.96", "69.0.3497.97", "69.0.3497.98", "69.0.3497.99", "70.0.3505.6", "70.0.3505.7", "70.0.3505.8", "70.0.3505.9", "70.0.3513.0", "70.0.3513.1", "70.0.3514.0", "70.0.3514.1", "70.0.3514.2", "70.0.3515.0", "70.0.3515.1", "70.0.3515.2", "70.0.3515.3", "70.0.3515.4", "70.0.3516.0", "70.0.3516.1", "70.0.3516.2", "70.0.3516.3", "70.0.3517.0", "70.0.3517.1", "70.0.3518.0", "70.0.3518.1", "70.0.3519.0", "70.0.3519.1", "70.0.3519.2", "70.0.3519.3", "70.0.3520.0", "70.0.3520.1", "70.0.3521.0", "70.0.3521.1", "70.0.3521.2", "70.0.3522.0", "70.0.3522.1", "70.0.3523.0", "70.0.3523.1", "70.0.3523.2", "70.0.3524.0", "70.0.3524.1", "70.0.3524.2", "70.0.3524.3", "70.0.3524.4", "70.0.3525.0", "70.0.3525.1", "70.0.3525.2", "70.0.3525.3", "70.0.3525.4", "70.0.3525.5", "70.0.3526.0", "70.0.3526.1", "70.0.3527.0", "70.0.3527.1", "70.0.3528.0", "70.0.3528.1", "70.0.3528.2", "70.0.3528.3", "70.0.3528.4", "70.0.3529.0", "70.0.3529.1", "70.0.3529.2", "70.0.3529.3", "70.0.3530.0", "70.0.3530.1", "70.0.3530.2", "70.0.3530.3", "70.0.3530.4", "70.0.3531.0", "70.0.3532.0", "70.0.3532.1", "70.0.3532.2", "70.0.3532.3", "70.0.3532.4", "70.0.3532.5", "70.0.3532.6", "70.0.3532.7", "70.0.3532.8", "70.0.3533.0", "70.0.3533.1", "70.0.3533.2", "70.0.3534.0", "70.0.3534.1", "70.0.3534.2", "70.0.3534.3", "70.0.3534.4", "70.0.3535.0", "70.0.3535.1", "70.0.3535.2", "70.0.3535.3", "70.0.3535.4", "70.0.3535.5", "70.0.3536.0", "70.0.3537.0", "70.0.3537.1", "70.0.3537.2", "70.0.3538.0", "70.0.3538.1", "70.0.3538.10", "70.0.3538.100", "70.0.3538.101", "70.0.3538.102", "70.0.3538.103", "70.0.3538.104", "70.0.3538.105", "70.0.3538.106", "70.0.3538.107", "70.0.3538.108", "70.0.3538.109", "70.0.3538.11", "70.0.3538.110", "70.0.3538.111", "70.0.3538.112", "70.0.3538.113", "70.0.3538.114", "70.0.3538.115", "70.0.3538.116", "70.0.3538.117", "70.0.3538.118", "70.0.3538.119", "70.0.3538.12", "70.0.3538.120", "70.0.3538.121", "70.0.3538.122", "70.0.3538.123", "70.0.3538.124", "70.0.3538.13", "70.0.3538.14", "70.0.3538.15", "70.0.3538.16", "70.0.3538.17", "70.0.3538.18", "70.0.3538.19", "70.0.3538.2", "70.0.3538.20", "70.0.3538.21", "70.0.3538.22", "70.0.3538.23", "70.0.3538.24", "70.0.3538.25", "70.0.3538.26", "70.0.3538.27", "70.0.3538.28", "70.0.3538.29", "70.0.3538.3", "70.0.3538.30", "70.0.3538.31", "70.0.3538.32", "70.0.3538.33", "70.0.3538.34", "70.0.3538.35", "70.0.3538.36", "70.0.3538.37", "70.0.3538.38", "70.0.3538.39", "70.0.3538.4", "70.0.3538.40", "70.0.3538.41", "70.0.3538.42", "70.0.3538.43", "70.0.3538.44", "70.0.3538.45", "70.0.3538.46", "70.0.3538.47", "70.0.3538.48", "70.0.3538.49", "70.0.3538.5", "70.0.3538.50", "70.0.3538.51", "70.0.3538.52", "70.0.3538.53", "70.0.3538.54", "70.0.3538.55", "70.0.3538.56", "70.0.3538.57", "70.0.3538.58", "70.0.3538.59", "70.0.3538.6", "70.0.3538.60", "70.0.3538.61", "70.0.3538.62", "70.0.3538.63", "70.0.3538.64", "70.0.3538.65", "70.0.3538.66", "70.0.3538.67", "70.0.3538.69", "70.0.3538.7", "70.0.3538.70", "70.0.3538.71", "70.0.3538.72", "70.0.3538.73", "70.0.3538.74", "70.0.3538.75", "70.0.3538.76", "70.0.3538.77", "70.0.3538.78", "70.0.3538.79", "70.0.3538.8", "70.0.3538.80", "70.0.3538.81", "70.0.3538.82", "70.0.3538.83", "70.0.3538.84", "70.0.3538.85", "70.0.3538.86", "70.0.3538.87", "70.0.3538.9", "70.0.3538.93", "70.0.3538.94", "70.0.3538.95", "70.0.3538.96", "70.0.3538.97", "70.0.3538.98", "70.0.3538.99", "71.0.3539.0", "71.0.3539.1", "71.0.3540.0", "71.0.3540.1", "71.0.3541.0", "71.0.3541.1", "71.0.3542.0", "71.0.3542.1", "71.0.3542.2", "71.0.3543.0", "71.0.3543.1", "71.0.3543.2", "71.0.3543.3", "71.0.3543.4", "71.0.3544.0", "71.0.3544.1", "71.0.3544.2", "71.0.3544.3", "71.0.3544.4", "71.0.3544.5", "71.0.3545.0", "71.0.3545.1", "71.0.3545.2", "71.0.3545.3", "71.0.3545.4", "71.0.3546.0", "71.0.3546.1", "71.0.3546.2", "71.0.3547.0", "71.0.3547.1", "71.0.3548.0", "71.0.3548.1", "71.0.3549.0", "71.0.3549.1", "71.0.3550.0", "71.0.3550.1", "71.0.3550.2", "71.0.3550.3", "71.0.3551.0", "71.0.3551.1", "71.0.3551.2", "71.0.3551.3", "71.0.3552.0", "71.0.3552.1", "71.0.3552.2", "71.0.3552.3", "71.0.3552.4", "71.0.3552.5", "71.0.3552.6", "71.0.3553.0", "71.0.3553.1", "71.0.3553.2", "71.0.3553.3", "71.0.3554.0", "71.0.3554.1", "71.0.3554.2", "71.0.3554.3", "71.0.3554.4", "71.0.3555.0", "71.0.3555.1", "71.0.3555.2", "71.0.3556.0", "71.0.3556.1", "71.0.3557.0", "71.0.3557.1", "71.0.3557.2", "71.0.3558.0", "71.0.3558.1", "71.0.3558.2", "71.0.3559.0", "71.0.3559.1", "71.0.3559.2", "71.0.3559.3", "71.0.3559.4", "71.0.3559.5", "71.0.3559.6", "71.0.3560.0", "71.0.3560.1", "71.0.3561.0", "71.0.3561.1", "71.0.3562.0", "71.0.3562.1", "71.0.3562.2", "71.0.3563.0", "71.0.3564.0", "71.0.3564.1", "71.0.3565.0", "71.0.3565.1", "71.0.3566.0", "71.0.3566.1", "71.0.3567.0", "71.0.3567.1", "71.0.3568.0", "71.0.3568.1", "71.0.3568.2", "71.0.3569.0", "71.0.3569.1", "71.0.3570.0", "71.0.3570.1", "71.0.3571.0", "71.0.3571.1", "71.0.3571.2", "71.0.3572.0", "71.0.3572.1", "71.0.3573.0", "71.0.3573.1", "71.0.3574.0", "71.0.3574.1", "71.0.3575.0", "71.0.3575.1", "71.0.3575.2", "71.0.3576.0", "71.0.3576.1", "71.0.3576.2", "71.0.3577.0", "71.0.3577.1", "71.0.3578.0", "71.0.3578.1", "71.0.3578.10", "71.0.3578.100", "71.0.3578.101", "71.0.3578.102", "71.0.3578.103", "71.0.3578.104", "71.0.3578.105", "71.0.3578.106", "71.0.3578.107", "71.0.3578.108", "71.0.3578.109", "71.0.3578.11", "71.0.3578.110", "71.0.3578.111", "71.0.3578.112", "71.0.3578.113", "71.0.3578.114", "71.0.3578.115", "71.0.3578.116", "71.0.3578.117", "71.0.3578.118", "71.0.3578.119", "71.0.3578.12", "71.0.3578.120", "71.0.3578.121", "71.0.3578.122", "71.0.3578.123", "71.0.3578.124", "71.0.3578.125", "71.0.3578.126", "71.0.3578.127", "71.0.3578.128", "71.0.3578.129", "71.0.3578.13", "71.0.3578.130", "71.0.3578.131", "71.0.3578.132", "71.0.3578.133", "71.0.3578.134", "71.0.3578.135", "71.0.3578.136", "71.0.3578.137", "71.0.3578.138", "71.0.3578.139", "71.0.3578.14", "71.0.3578.140", "71.0.3578.141", "71.0.3578.15", "71.0.3578.16", "71.0.3578.17", "71.0.3578.18", "71.0.3578.19", "71.0.3578.2", "71.0.3578.20", "71.0.3578.21", "71.0.3578.22", "71.0.3578.23", "71.0.3578.24", "71.0.3578.25", "71.0.3578.26", "71.0.3578.27", "71.0.3578.28", "71.0.3578.29", "71.0.3578.3", "71.0.3578.30", "71.0.3578.31", "71.0.3578.32", "71.0.3578.33", "71.0.3578.34", "71.0.3578.35", "71.0.3578.36", "71.0.3578.37", "71.0.3578.38", "71.0.3578.39", "71.0.3578.4", "71.0.3578.40", "71.0.3578.41", "71.0.3578.42", "71.0.3578.43", "71.0.3578.44", "71.0.3578.45", "71.0.3578.46", "71.0.3578.47", "71.0.3578.48", "71.0.3578.49", "71.0.3578.5", "71.0.3578.50", "71.0.3578.51", "71.0.3578.52", "71.0.3578.53", "71.0.3578.54", "71.0.3578.55", "71.0.3578.56", "71.0.3578.57", "71.0.3578.58", "71.0.3578.59", "71.0.3578.6", "71.0.3578.60", "71.0.3578.61", "71.0.3578.62", "71.0.3578.63", "71.0.3578.64", "71.0.3578.65", "71.0.3578.66", "71.0.3578.67", "71.0.3578.68", "71.0.3578.69", "71.0.3578.7", "71.0.3578.70", "71.0.3578.71", "71.0.3578.72", "71.0.3578.73", "71.0.3578.74", "71.0.3578.75", "71.0.3578.76", "71.0.3578.77", "71.0.3578.78", "71.0.3578.79", "71.0.3578.8", "71.0.3578.80", "71.0.3578.81", "71.0.3578.82", "71.0.3578.83", "71.0.3578.84", "71.0.3578.85", "71.0.3578.86", "71.0.3578.87", "71.0.3578.88", "71.0.3578.89", "71.0.3578.9", "71.0.3578.90", "71.0.3578.91", "71.0.3578.92", "71.0.3578.93", "71.0.3578.94", "71.0.3578.95", "71.0.3578.96", "71.0.3578.97", "71.0.3578.98", "71.0.3578.99", "72.0.3579.0", "72.0.3579.1", "72.0.3580.0", "72.0.3580.1", "72.0.3581.0", "72.0.3581.1", "72.0.3581.2", "72.0.3581.3", "72.0.3581.4", "72.0.3582.0", "72.0.3583.0", "72.0.3583.1", "72.0.3583.2", "72.0.3584.0", "72.0.3584.1", "72.0.3585.0", "72.0.3585.1", "72.0.3586.0", "72.0.3586.1", "72.0.3586.2", "72.0.3587.0", "72.0.3588.0", "72.0.3588.1", "72.0.3589.0", "72.0.3589.1", "72.0.3589.2", "72.0.3589.3", "72.0.3590.0", "72.0.3590.1", "72.0.3591.0", "72.0.3591.1", "72.0.3591.2", "72.0.3591.3", "72.0.3592.0", "72.0.3592.1", "72.0.3592.2", "72.0.3593.0", "72.0.3593.1", "72.0.3593.2", "72.0.3594.0", "72.0.3594.1", "72.0.3595.0", "72.0.3595.1", "72.0.3595.2", "72.0.3596.0", "72.0.3596.1", "72.0.3596.2", "72.0.3597.0", "72.0.3597.1", "72.0.3598.0", "72.0.3598.1", "72.0.3599.0", "72.0.3599.1", "72.0.3599.2", "72.0.3599.3", "72.0.3600.0", "72.0.3600.1", "72.0.3601.0", "72.0.3601.1", "72.0.3602.0", "72.0.3602.1", "72.0.3602.2", "72.0.3602.3", "72.0.3603.0", "72.0.3603.1", "72.0.3603.2", "72.0.3604.0", "72.0.3604.1", "72.0.3605.0", "72.0.3605.1", "72.0.3605.2", "72.0.3605.3", "72.0.3606.0", "72.0.3606.1", "72.0.3606.2", "72.0.3607.0", "72.0.3607.1", "72.0.3608.0", "72.0.3608.1", "72.0.3608.2", "72.0.3608.3", "72.0.3608.4", "72.0.3608.5", "72.0.3609.0", "72.0.3609.1", "72.0.3609.2", "72.0.3609.3", "72.0.3610.0", "72.0.3610.1", "72.0.3610.2", "72.0.3610.3", "72.0.3610.4", "72.0.3611.0", "72.0.3611.1", "72.0.3611.2", "72.0.3612.0", "72.0.3612.1", "72.0.3612.2", "72.0.3613.0", "72.0.3613.1", "72.0.3614.0", "72.0.3614.1", "72.0.3615.0", "72.0.3615.1", "72.0.3616.0", "72.0.3616.1", "72.0.3617.0", "72.0.3617.1", "72.0.3618.0", "72.0.3618.1", "72.0.3619.0", "72.0.3619.1", "72.0.3620.0", "72.0.3620.1", "72.0.3621.0", "72.0.3621.1", "72.0.3622.0", "72.0.3622.1", "72.0.3622.2", "72.0.3622.3", "72.0.3623.0", "72.0.3623.1", "72.0.3623.2", "72.0.3623.3", "72.0.3623.4", "72.0.3624.0", "72.0.3624.1", "72.0.3624.2", "72.0.3624.3", "72.0.3624.4", "72.0.3625.0", "72.0.3625.1", "72.0.3625.2", "72.0.3626.0", "72.0.3626.1", "72.0.3626.10", "72.0.3626.100", "72.0.3626.101", "72.0.3626.102", "72.0.3626.103", "72.0.3626.105", "72.0.3626.107", "72.0.3626.108", "72.0.3626.109", "72.0.3626.11", "72.0.3626.110", "72.0.3626.111", "72.0.3626.112", "72.0.3626.113", "72.0.3626.114", "72.0.3626.115", "72.0.3626.116", "72.0.3626.117", "72.0.3626.118", "72.0.3626.119", "72.0.3626.12", "72.0.3626.120", "72.0.3626.121", "72.0.3626.122", "72.0.3626.13", "72.0.3626.14", "72.0.3626.15", "72.0.3626.16", "72.0.3626.17", "72.0.3626.18", "72.0.3626.19", "72.0.3626.2", "72.0.3626.20", "72.0.3626.21", "72.0.3626.22", "72.0.3626.23", "72.0.3626.24", "72.0.3626.25", "72.0.3626.26", "72.0.3626.27", "72.0.3626.28", "72.0.3626.29", "72.0.3626.3", "72.0.3626.30", "72.0.3626.31", "72.0.3626.32", "72.0.3626.33", "72.0.3626.34", "72.0.3626.35", "72.0.3626.36", "72.0.3626.37", "72.0.3626.38", "72.0.3626.39", "72.0.3626.4", "72.0.3626.40", "72.0.3626.41", "72.0.3626.42", "72.0.3626.43", "72.0.3626.44", "72.0.3626.45", "72.0.3626.46", "72.0.3626.47", "72.0.3626.48", "72.0.3626.49", "72.0.3626.5", "72.0.3626.50", "72.0.3626.51", "72.0.3626.52", "72.0.3626.53", "72.0.3626.54", "72.0.3626.55", "72.0.3626.56", "72.0.3626.57", "72.0.3626.58", "72.0.3626.59", "72.0.3626.6", "72.0.3626.60", "72.0.3626.61", "72.0.3626.62", "72.0.3626.63", "72.0.3626.64", "72.0.3626.65", "72.0.3626.66", "72.0.3626.67", "72.0.3626.68", "72.0.3626.69", "72.0.3626.7", "72.0.3626.70", "72.0.3626.71", "72.0.3626.72", "72.0.3626.73", "72.0.3626.74", "72.0.3626.75", "72.0.3626.76", "72.0.3626.77", "72.0.3626.78", "72.0.3626.79", "72.0.3626.8", "72.0.3626.80", "72.0.3626.81", "72.0.3626.82", "72.0.3626.83", "72.0.3626.84", "72.0.3626.85", "72.0.3626.86", "72.0.3626.87", "72.0.3626.88", "72.0.3626.89", "72.0.3626.9", "72.0.3626.90", "72.0.3626.91", "72.0.3626.92", "72.0.3626.93", "72.0.3626.94", "72.0.3626.95", "72.0.3626.96", "72.0.3626.97", "72.0.3626.98", "72.0.3626.99", "73.0.3627.0", "73.0.3627.1", "73.0.3628.0", "73.0.3628.1", "73.0.3628.2", "73.0.3628.3", "73.0.3629.0", "73.0.3629.1", "73.0.3630.0", "73.0.3630.1", "73.0.3631.0", "73.0.3631.1", "73.0.3631.2", "73.0.3632.0", "73.0.3632.1", "73.0.3632.2", "73.0.3632.3", "73.0.3632.4", "73.0.3632.5", "73.0.3633.0", "73.0.3633.1", "73.0.3633.2", "73.0.3634.0", "73.0.3634.1", "73.0.3634.2", "73.0.3635.0", "73.0.3635.1", "73.0.3635.2", "73.0.3635.3", "73.0.3636.0", "73.0.3636.1", "73.0.3636.2", "73.0.3637.0", "73.0.3637.1", "73.0.3638.0", "73.0.3638.1", "73.0.3638.2", "73.0.3639.0", "73.0.3639.1", "73.0.3640.0", "73.0.3640.1", "73.0.3641.0", "73.0.3641.1", "73.0.3642.0", "73.0.3642.1", "73.0.3643.0", "73.0.3643.1", "73.0.3643.2", "73.0.3644.0", "73.0.3645.0", "73.0.3645.1", "73.0.3645.2", "73.0.3646.0", "73.0.3646.1", "73.0.3646.2", "73.0.3647.0", "73.0.3647.1", "73.0.3647.2", "73.0.3648.0", "73.0.3648.1", "73.0.3648.2", "73.0.3649.0", "73.0.3649.1", "73.0.3650.0", "73.0.3650.1", "73.0.3651.0", "73.0.3651.1", "73.0.3652.0", "73.0.3652.1", "73.0.3653.0", "73.0.3653.1", "73.0.3654.0", "73.0.3654.1", "73.0.3655.0", "73.0.3655.1", "73.0.3656.0", "73.0.3656.1", "73.0.3657.0", "73.0.3657.1", "73.0.3658.0", "73.0.3658.1", "73.0.3659.0", "73.0.3659.1", "73.0.3660.0", "73.0.3660.1", "73.0.3660.2", "73.0.3661.0", "73.0.3661.1", "73.0.3662.0", "73.0.3662.1", "73.0.3663.0", "73.0.3663.1", "73.0.3663.2", "73.0.3664.0", "73.0.3664.1", "73.0.3664.2", "73.0.3664.3", "73.0.3664.4", "73.0.3665.0", "73.0.3665.1", "73.0.3665.2", "73.0.3665.3", "73.0.3665.4", "73.0.3666.0", "73.0.3666.1", "73.0.3667.0", "73.0.3667.1", "73.0.3667.2", "73.0.3668.0", "73.0.3668.1", "73.0.3668.2", "73.0.3669.0", "73.0.3669.1", "73.0.3670.0", "73.0.3670.1", "73.0.3671.0", "73.0.3671.1", "73.0.3671.2", "73.0.3671.3", "73.0.3672.0", "73.0.3672.1", "73.0.3673.0", "73.0.3673.1", "73.0.3673.2", "73.0.3674.0", "73.0.3674.1", "73.0.3674.2", "73.0.3676.0", "73.0.3676.1", "73.0.3677.0", "73.0.3677.1", "73.0.3678.0", "73.0.3678.1", "73.0.3678.2", "73.0.3679.0", "73.0.3679.1", "73.0.3680.0", "73.0.3680.1", "73.0.3681.0", "73.0.3681.1", "73.0.3681.2", "73.0.3681.3", "73.0.3681.4", "73.0.3682.0", "73.0.3682.1", "73.0.3683.0", "73.0.3683.1", "73.0.3683.10", "73.0.3683.100", "73.0.3683.101", "73.0.3683.102", "73.0.3683.103", "73.0.3683.104", "73.0.3683.105", "73.0.3683.106", "73.0.3683.107", "73.0.3683.108", "73.0.3683.109", "73.0.3683.11", "73.0.3683.110", "73.0.3683.111", "73.0.3683.112", "73.0.3683.113", "73.0.3683.114", "73.0.3683.115", "73.0.3683.116", "73.0.3683.117", "73.0.3683.118", "73.0.3683.119", "73.0.3683.12", "73.0.3683.120", "73.0.3683.121", "73.0.3683.13", "73.0.3683.14", "73.0.3683.15", "73.0.3683.16", "73.0.3683.17", "73.0.3683.18", "73.0.3683.19", "73.0.3683.2", "73.0.3683.20", "73.0.3683.21", "73.0.3683.22", "73.0.3683.23", "73.0.3683.24", "73.0.3683.25", "73.0.3683.26", "73.0.3683.27", "73.0.3683.28", "73.0.3683.29", "73.0.3683.3", "73.0.3683.31", "73.0.3683.32", "73.0.3683.33", "73.0.3683.34", "73.0.3683.35", "73.0.3683.36", "73.0.3683.37", "73.0.3683.38", "73.0.3683.39", "73.0.3683.4", "73.0.3683.40", "73.0.3683.41", "73.0.3683.42", "73.0.3683.43", "73.0.3683.44", "73.0.3683.45", "73.0.3683.46", "73.0.3683.47", "73.0.3683.48", "73.0.3683.49", "73.0.3683.5", "73.0.3683.50", "73.0.3683.51", "73.0.3683.52", "73.0.3683.53", "73.0.3683.54", "73.0.3683.55", "73.0.3683.56", "73.0.3683.57", "73.0.3683.58", "73.0.3683.59", "73.0.3683.6", "73.0.3683.60", "73.0.3683.61", "73.0.3683.62", "73.0.3683.63", "73.0.3683.64", "73.0.3683.65", "73.0.3683.66", "73.0.3683.67", "73.0.3683.68", "73.0.3683.69", "73.0.3683.7", "73.0.3683.70", "73.0.3683.71", "73.0.3683.72", "73.0.3683.73", "73.0.3683.74", "73.0.3683.75", "73.0.3683.76", "73.0.3683.77", "73.0.3683.78", "73.0.3683.79", "73.0.3683.8", "73.0.3683.80", "73.0.3683.81", "73.0.3683.82", "73.0.3683.83", "73.0.3683.84", "73.0.3683.85", "73.0.3683.86", "73.0.3683.87", "73.0.3683.88", "73.0.3683.89", "73.0.3683.9", "73.0.3683.90", "73.0.3683.91", "73.0.3683.92", "73.0.3683.93", "73.0.3683.94", "73.0.3683.95", "73.0.3683.96", "73.0.3683.97", "73.0.3683.98", "73.0.3683.99", "74.0.3684.0", "74.0.3684.1", "74.0.3685.0", "74.0.3685.1", "74.0.3686.0", "74.0.3686.1", "74.0.3686.2", "74.0.3686.3", "74.0.3686.4", "74.0.3687.0", "74.0.3687.1", "74.0.3687.2", "74.0.3687.3", "74.0.3688.0", "74.0.3688.1", "74.0.3689.0", "74.0.3689.1", "74.0.3690.0", "74.0.3690.1", "74.0.3691.0", "74.0.3691.1", "74.0.3692.0", "74.0.3692.1", "74.0.3693.0", "74.0.3693.1", "74.0.3693.2", "74.0.3693.3", "74.0.3693.4", "74.0.3693.5", "74.0.3693.6", "74.0.3694.0", "74.0.3694.1", "74.0.3694.2", "74.0.3694.3", "74.0.3694.4", "74.0.3694.5", "74.0.3694.6", "74.0.3694.7", "74.0.3694.8", "74.0.3696.0", "74.0.3696.1", "74.0.3696.2", "74.0.3698.0", "74.0.3699.0", "74.0.3699.1", "74.0.3699.2", "74.0.3699.3", "74.0.3700.0", "74.0.3700.1", "74.0.3701.0", "74.0.3701.1", "74.0.3702.0", "74.0.3702.1", "74.0.3702.2", "74.0.3702.3", "74.0.3703.0", "74.0.3703.1", "74.0.3703.2", "74.0.3703.3", "74.0.3704.0", "74.0.3704.1", "74.0.3704.2", "74.0.3704.3", "74.0.3704.4", "74.0.3704.5", "74.0.3704.6", "74.0.3704.7", "74.0.3704.8", "74.0.3704.9", "74.0.3705.0", "74.0.3705.1", "74.0.3706.0", "74.0.3706.1", "74.0.3706.2", "74.0.3706.3", "74.0.3706.4", "74.0.3706.5", "74.0.3706.6", "74.0.3706.7", "74.0.3708.0", "74.0.3709.0", "74.0.3709.1", "74.0.3710.0", "74.0.3710.1", "74.0.3710.2", "74.0.3711.0", "74.0.3711.1", "74.0.3711.2", "74.0.3712.0", "74.0.3712.1", "74.0.3712.2", "74.0.3713.0", "74.0.3713.1", "74.0.3713.3", "74.0.3714.0", "74.0.3714.1", "74.0.3714.2", "74.0.3715.0", "74.0.3715.1", "74.0.3716.0", "74.0.3716.1", "74.0.3717.0", "74.0.3717.1", "74.0.3717.2", "74.0.3718.0", "74.0.3718.1", "74.0.3718.2", "74.0.3718.3", "74.0.3718.4", "74.0.3718.5", "74.0.3718.6", "74.0.3718.7", "74.0.3718.8", "74.0.3718.9", "74.0.3719.0", "74.0.3719.1", "74.0.3719.2", "74.0.3719.3", "74.0.3719.4", "74.0.3719.5", "74.0.3720.0", "74.0.3720.1", "74.0.3720.2", "74.0.3720.3", "74.0.3720.4", "74.0.3720.5", "74.0.3720.6", "74.0.3721.0", "74.0.3721.1", "74.0.3721.2", "74.0.3721.3", "74.0.3722.0", "74.0.3722.1", "74.0.3723.0", "74.0.3723.1", "74.0.3724.0", "74.0.3724.1", "74.0.3724.2", "74.0.3724.3", "74.0.3724.4", "74.0.3724.5", "74.0.3724.6", "74.0.3724.7", "74.0.3724.8", "74.0.3725.0", "74.0.3725.1", "74.0.3725.2", "74.0.3725.3", "74.0.3725.4", "74.0.3726.0", "74.0.3726.1", "74.0.3726.2", "74.0.3726.3", "74.0.3726.4", "74.0.3728.0", "74.0.3729.0", "74.0.3729.1", "74.0.3729.10", "74.0.3729.100", "74.0.3729.101", "74.0.3729.102", "74.0.3729.103", "74.0.3729.104", "74.0.3729.105", "74.0.3729.106", "74.0.3729.107", "74.0.3729.108", "74.0.3729.109", "74.0.3729.11", "74.0.3729.110", "74.0.3729.111", "74.0.3729.112", "74.0.3729.113", "74.0.3729.114", "74.0.3729.115", "74.0.3729.116", "74.0.3729.117", "74.0.3729.118", "74.0.3729.119", "74.0.3729.12", "74.0.3729.120", "74.0.3729.121", "74.0.3729.122", "74.0.3729.123", "74.0.3729.124", "74.0.3729.125", "74.0.3729.126", "74.0.3729.127", "74.0.3729.128", "74.0.3729.129", "74.0.3729.13", "74.0.3729.14", "74.0.3729.15", "74.0.3729.16", "74.0.3729.17", "74.0.3729.18", "74.0.3729.19", "74.0.3729.2", "74.0.3729.20", "74.0.3729.21", "74.0.3729.22", "74.0.3729.23", "74.0.3729.24", "74.0.3729.25", "74.0.3729.26", "74.0.3729.27", "74.0.3729.28", "74.0.3729.29", "74.0.3729.3", "74.0.3729.30", "74.0.3729.31", "74.0.3729.32", "74.0.3729.33", "74.0.3729.34", "74.0.3729.35", "74.0.3729.36", "74.0.3729.37", "74.0.3729.38", "74.0.3729.39", "74.0.3729.4", "74.0.3729.40", "74.0.3729.41", "74.0.3729.42", "74.0.3729.43", "74.0.3729.44", "74.0.3729.45", "74.0.3729.46", "74.0.3729.47", "74.0.3729.48", "74.0.3729.49", "74.0.3729.5", "74.0.3729.50", "74.0.3729.51", "74.0.3729.52", "74.0.3729.53", "74.0.3729.54", "74.0.3729.55", "74.0.3729.56", "74.0.3729.57", "74.0.3729.58", "74.0.3729.59", "74.0.3729.6", "74.0.3729.60", "74.0.3729.61", "74.0.3729.62", "74.0.3729.63", "74.0.3729.64", "74.0.3729.65", "74.0.3729.66", "74.0.3729.67", "74.0.3729.68", "74.0.3729.69", "74.0.3729.7", "74.0.3729.70", "74.0.3729.71", "74.0.3729.72", "74.0.3729.73", "74.0.3729.74", "74.0.3729.75", "74.0.3729.76", "74.0.3729.77", "74.0.3729.78", "74.0.3729.79", "74.0.3729.8", "74.0.3729.80", "74.0.3729.81", "74.0.3729.82", "74.0.3729.83", "74.0.3729.84", "74.0.3729.85", "74.0.3729.86", "74.0.3729.87", "74.0.3729.88", "74.0.3729.89", "74.0.3729.9", "74.0.3729.90", "74.0.3729.91", "74.0.3729.92", "74.0.3729.93", "74.0.3729.94", "74.0.3729.95", "74.0.3729.96", "74.0.3729.97", "74.0.3729.98", "74.0.3729.99", "75.0.3730.0", "75.0.3730.1", "75.0.3730.2", "75.0.3730.3", "75.0.3730.4", "75.0.3730.5", "75.0.3731.0", "75.0.3731.2", "75.0.3731.3", "75.0.3732.0", "75.0.3732.1", "75.0.3733.0", "75.0.3733.1", "75.0.3734.0", "75.0.3734.1", "75.0.3735.0", "75.0.3735.1", "75.0.3736.0", "75.0.3736.1", "75.0.3737.0", "75.0.3737.1", "75.0.3738.0", "75.0.3738.1", "75.0.3738.2", "75.0.3738.3", "75.0.3738.4", "75.0.3739.0", "75.0.3739.1", "75.0.3740.0", "75.0.3740.1", "75.0.3740.2", "75.0.3740.3", "75.0.3740.4", "75.0.3740.5", "75.0.3741.0", "75.0.3741.1", "75.0.3741.2", "75.0.3744.0", "75.0.3744.1", "75.0.3744.2", "75.0.3745.0", "75.0.3745.1", "75.0.3745.2", "75.0.3745.3", "75.0.3745.4", "75.0.3745.5", "75.0.3746.0", "75.0.3746.1", "75.0.3746.2", "75.0.3746.3", "75.0.3746.4", "75.0.3747.0", "75.0.3747.1", "75.0.3748.0", "75.0.3748.1", "75.0.3749.0", "75.0.3749.1", "75.0.3749.2", "75.0.3749.3", "75.0.3750.0", "75.0.3751.0", "75.0.3751.1", "75.0.3752.0", "75.0.3752.1", "75.0.3752.2", "75.0.3753.0", "75.0.3753.1", "75.0.3753.2", "75.0.3753.3", "75.0.3753.4", "75.0.3754.0", "75.0.3754.1", "75.0.3754.2", "75.0.3755.0", "75.0.3755.1", "75.0.3755.2", "75.0.3755.3", "75.0.3756.0", "75.0.3756.1", "75.0.3757.0", "75.0.3757.1", "75.0.3758.0", "75.0.3758.1", "75.0.3759.0", "75.0.3759.1", "75.0.3759.2", "75.0.3759.3", "75.0.3759.4", "75.0.3759.5", "75.0.3759.6", "75.0.3759.7", "75.0.3759.8", "75.0.3760.0", "75.0.3761.0", "75.0.3761.1", "75.0.3761.2", "75.0.3761.3", "75.0.3761.4", "75.0.3762.0", "75.0.3762.1", "75.0.3763.0", "75.0.3763.1", "75.0.3763.2", "75.0.3764.0", "75.0.3764.1", "75.0.3765.0", "75.0.3765.1", "75.0.3766.0", "75.0.3766.1", "75.0.3766.2", "75.0.3766.3", "75.0.3767.0", "75.0.3767.1", "75.0.3767.2", "75.0.3768.0", "75.0.3768.1", "75.0.3768.2", "75.0.3768.3", "75.0.3768.4", "75.0.3768.5", "75.0.3768.6", "75.0.3769.0", "75.0.3769.1", "75.0.3769.2", "75.0.3769.3", "75.0.3769.4", "75.0.3769.5", "75.0.3770.0", "75.0.3770.1", "75.0.3770.10", "75.0.3770.11", "75.0.3770.12", "75.0.3770.13", "75.0.3770.14", "75.0.3770.15", "75.0.3770.2", "75.0.3770.3", "75.0.3770.4", "75.0.3770.5", "75.0.3770.6", "75.0.3770.7", "75.0.3770.8", "75.0.3770.9", "76.0.3771.0", "76.0.3771.1", "76.0.3772.0", "76.0.3772.1", "76.0.3773.0", "76.0.3773.1", "76.0.3774.0", "76.0.3774.1", "76.0.3775.0", "76.0.3775.1", "76.0.3775.2", "76.0.3775.3", "76.0.3775.4", "76.0.3775.5", "76.0.3776.0", "76.0.3776.1", "76.0.3776.2", "76.0.3776.3", "76.0.3776.4", "76.0.3777.0", "76.0.3777.1", "76.0.3778.0", "76.0.3778.1", "76.0.3779.0", "76.0.3779.1", "76.0.3780.0", "76.0.3780.1", "76.0.3780.2", "76.0.3780.3", ] def random_user_agent return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{CHROME_VERSIONS[rand(CHROME_VERSIONS.size)]} Safari/537.36" end struct HTTPPool property! url : URI property! capacity : Int32 property! timeout : Float64 property pool : ConnectionPool(HTTPClient) def initialize(url : URI, @capacity = 5, @timeout = 5.0) @url = url @pool = build_pool end def client(region = nil, &block) conn = pool.checkout begin if region PROXY_LIST[region]?.try &.sample(40).each do |proxy| begin proxy = HTTPProxy.new(proxy_host: proxy[:ip], proxy_port: proxy[:port]) conn.set_proxy(proxy) break rescue ex end end end response = yield conn if region conn.unset_proxy end response rescue ex conn = HTTPClient.new(url) conn.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC conn.read_timeout = 10.seconds conn.connect_timeout = 10.seconds yield conn ensure pool.checkin(conn) end end private def build_pool ConnectionPool(HTTPClient).new(capacity: capacity, timeout: timeout) do client = HTTPClient.new(url) client.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC client.read_timeout = 10.seconds client.connect_timeout = 10.seconds client end end end # See http://www.evanmiller.org/how-not-to-sort-by-average-rating.html def ci_lower_bound(pos, n) if n == 0 return 0.0 end # z value here represents a confidence level of 0.95 z = 1.96 phat = 1.0*pos/n return (phat + z*z/(2*n) - z * Math.sqrt((phat*(1 - phat) + z*z/(4*n))/n))/(1 + z*z/n) end def elapsed_text(elapsed) millis = elapsed.total_milliseconds return "#{millis.round(2)}ms" if millis >= 1 "#{(millis * 1000).round(2)}µs" end def make_client(url : URI, region = nil) client = HTTPClient.new(url) client.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC client.read_timeout = 10.seconds client.connect_timeout = 10.seconds if region PROXY_LIST[region]?.try &.sample(40).each do |proxy| begin proxy = HTTPProxy.new(proxy_host: proxy[:ip], proxy_port: proxy[:port]) client.set_proxy(proxy) break rescue ex end end end return client end def decode_length_seconds(string) length_seconds = string.gsub(/[^0-9:]/, "").split(":").map &.to_i length_seconds = [0] * (3 - length_seconds.size) + length_seconds length_seconds = Time::Span.new(length_seconds[0], length_seconds[1], length_seconds[2]) length_seconds = length_seconds.total_seconds.to_i return length_seconds end def recode_length_seconds(time) if time <= 0 return "" else time = time.seconds text = "#{time.minutes.to_s.rjust(2, '0')}:#{time.seconds.to_s.rjust(2, '0')}" if time.total_hours.to_i > 0 text = "#{time.total_hours.to_i.to_s.rjust(2, '0')}:#{text}" end text = text.lchop('0') return text end end def decode_time(string) time = string.try &.to_f? if !time hours = /(?\d+)h/.match(string).try &.["hours"].try &.to_f hours ||= 0 minutes = /(?\d+)m(?!s)/.match(string).try &.["minutes"].try &.to_f minutes ||= 0 seconds = /(?\d+)s/.match(string).try &.["seconds"].try &.to_f seconds ||= 0 millis = /(?\d+)ms/.match(string).try &.["millis"].try &.to_f millis ||= 0 time = hours * 3600 + minutes * 60 + seconds + millis // 1000 end return time end def decode_date(string : String) # String matches 'YYYY' if string.match(/^\d{4}/) return Time.utc(string.to_i, 1, 1) end # Try to parse as format Jul 10, 2000 begin return Time.parse(string, "%b %-d, %Y", Time::Location.local) rescue ex end case string when "today" return Time.utc when "yesterday" return Time.utc - 1.day end # String matches format "20 hours ago", "4 months ago"... date = string.split(" ")[-3, 3] delta = date[0].to_i case date[1] when .includes? "second" delta = delta.seconds when .includes? "minute" delta = delta.minutes when .includes? "hour" delta = delta.hours when .includes? "day" delta = delta.days when .includes? "week" delta = delta.weeks when .includes? "month" delta = delta.months when .includes? "year" delta = delta.years else raise "Could not parse #{string}" end return Time.utc - delta end def recode_date(time : Time, locale) span = Time.utc - time if span.total_days > 365.0 span = translate(locale, "`x` years", (span.total_days.to_i // 365).to_s) elsif span.total_days > 30.0 span = translate(locale, "`x` months", (span.total_days.to_i // 30).to_s) elsif span.total_days > 7.0 span = translate(locale, "`x` weeks", (span.total_days.to_i // 7).to_s) elsif span.total_hours > 24.0 span = translate(locale, "`x` days", (span.total_days.to_i).to_s) elsif span.total_minutes > 60.0 span = translate(locale, "`x` hours", (span.total_hours.to_i).to_s) elsif span.total_seconds > 60.0 span = translate(locale, "`x` minutes", (span.total_minutes.to_i).to_s) else span = translate(locale, "`x` seconds", (span.total_seconds.to_i).to_s) end return span end def number_with_separator(number) number.to_s.reverse.gsub(/(\d{3})(?=\d)/, "\\1,").reverse end def short_text_to_number(short_text : String) : Int32 case short_text when .ends_with? "M" number = short_text.rstrip(" mM").to_f number *= 1000000 when .ends_with? "K" number = short_text.rstrip(" kK").to_f number *= 1000 else number = short_text.rstrip(" ") end number = number.to_i return number end def number_to_short_text(number) seperated = number_with_separator(number).gsub(",", ".").split("") text = seperated.first(2).join if seperated[2]? && seperated[2] != "." text += seperated[2] end text = text.rchop(".0") if number // 1_000_000_000 != 0 text += "B" elsif number // 1_000_000 != 0 text += "M" elsif number // 1000 != 0 text += "K" end text end def arg_array(array, start = 1) if array.size == 0 args = "NULL" else args = [] of String (start..array.size + start - 1).each { |i| args << "($#{i})" } args = args.join(",") end return args end def make_host_url(config, kemal_config) ssl = config.https_only || kemal_config.ssl port = config.external_port || kemal_config.port if ssl scheme = "https://" else scheme = "http://" end # Add if non-standard port if port != 80 && port != 443 port = ":#{kemal_config.port}" else port = "" end if !config.domain return "" end host = config.domain.not_nil!.lchop(".") return "#{scheme}#{host}#{port}" end def get_referer(env, fallback = "/", unroll = true) referer = env.params.query["referer"]? referer ||= env.request.headers["referer"]? referer ||= fallback referer = URI.parse(referer) # "Unroll" nested referrers if unroll loop do if referer.query params = HTTP::Params.parse(referer.query.not_nil!) if params["referer"]? referer = URI.parse(URI.decode_www_form(params["referer"])) else break end else break end end end referer = referer.full_path referer = "/" + referer.lstrip("\/\\") if referer == env.request.path referer = fallback end return referer end struct VarInt def self.from_io(io : IO, format = IO::ByteFormat::NetworkEndian) : Int32 result = 0_u32 num_read = 0 loop do byte = io.read_byte raise "Invalid VarInt" if !byte value = byte & 0x7f result |= value.to_u32 << (7 * num_read) num_read += 1 break if byte & 0x80 == 0 raise "Invalid VarInt" if num_read > 5 end result.to_i32 end def self.to_io(io : IO, value : Int32) io.write_byte 0x00 if value == 0x00 value = value.to_u32 while value != 0 byte = (value & 0x7f).to_u8 value >>= 7 if value != 0 byte |= 0x80 end io.write_byte byte end end end def sha256(text) digest = OpenSSL::Digest.new("SHA256") digest << text return digest.hexdigest end def subscribe_pubsub(topic, key, config) case topic when .match(/^UC[A-Za-z0-9_-]{22}$/) topic = "channel_id=#{topic}" when .match(/^(PL|LL|EC|UU|FL|UL|OLAK5uy_)[0-9A-Za-z-_]{10,}$/) # There's a couple missing from the above regex, namely TL and RD, which # don't have feeds topic = "playlist_id=#{topic}" else # TODO end client = make_client(PUBSUB_URL) time = Time.utc.to_unix.to_s nonce = Random::Secure.hex(4) signature = "#{time}:#{nonce}" host_url = make_host_url(config, Kemal.config) body = { "hub.callback" => "#{host_url}/feed/webhook/v1:#{time}:#{nonce}:#{OpenSSL::HMAC.hexdigest(:sha1, key, signature)}", "hub.topic" => "https://www.youtube.com/xml/feeds/videos.xml?#{topic}", "hub.verify" => "async", "hub.mode" => "subscribe", "hub.lease_seconds" => "432000", "hub.secret" => key.to_s, } return client.post("/subscribe", form: body) end def parse_range(range) if !range return 0_i64, nil end ranges = range.lchop("bytes=").split(',') ranges.each do |range| start_range, end_range = range.split('-') start_range = start_range.to_i64? || 0_i64 end_range = end_range.to_i64? return start_range, end_range end return 0_i64, nil end def convert_theme(theme) case theme when "true" "dark" when "false" "light" when "", nil nil else theme end end