<?php

namespace Hp;

//  PROJECT HONEY POT ADDRESS DISTRIBUTION SCRIPT
//  For more information visit: http://www.projecthoneypot.org/
//  Copyright (C) 2004-2020, Unspam Technologies, Inc.
//
//  This program is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
//  02111-1307  USA
//
//  If you choose to modify or redistribute the software, you must
//  completely disconnect it from the Project Honey Pot Service, as
//  specified under the Terms of Service Use. These terms are available
//  here:
//
//  http://www.projecthoneypot.org/terms_of_service_use.php
//
//  The required modification to disconnect the software from the
//  Project Honey Pot Service is explained in the comments below. To find the
//  instructions, search for:  *** DISCONNECT INSTRUCTIONS ***
//
//  Generated On: Mon, 27 Jan 2020 05:52:55 -0500
//  For Domain: www.brabix.nl
//
//

//  *** DISCONNECT INSTRUCTIONS ***
//
//  You are free to modify or redistribute this software. However, if
//  you do so you must disconnect it from the Project Honey Pot Service.
//  To do this, you must delete the lines of code below located between the
//  *** START CUT HERE *** and *** FINISH CUT HERE *** comments. Under the
//  Terms of Service Use that you agreed to before downloading this software,
//  you may not recreate the deleted lines or modify this software to access
//  or otherwise connect to any Project Honey Pot server.
//
//  *** START CUT HERE ***

define('__REQUEST_HOST', 'hpr8.projecthoneypot.org');
define('__REQUEST_PORT', '80');
define('__REQUEST_SCRIPT', '/cgi/serve.php');

//  *** FINISH CUT HERE ***

interface Response
{
    public function getBody();
    public function getLines(): array;
}

class TextResponse implements Response
{
    private $content;

    public function __construct(string $content)
    {
        $this->content = $content;
    }

    public function getBody()
    {
        return $this->content;
    }

    public function getLines(): array
    {
        return explode("\n", $this->content);
    }
}

interface HttpClient
{
    public function request(string $method, string $url, array $headers = [], array $data = []): Response;
}

class ScriptClient implements HttpClient
{
    private $proxy;
    private $credentials;

    public function __construct(string $settings)
    {
        $this->readSettings($settings);
    }

    private function getAuthorityComponent(string $authority = null, string $tag = null)
    {
        if(is_null($authority)){
            return null;
        }
        if(!is_null($tag)){
            $authority .= ":$tag";
        }
        return $authority;
    }

    private function readSettings(string $file)
    {
        if(!is_file($file) || !is_readable($file)){
            return;
        }

        $stmts = file($file);

        $settings = array_reduce($stmts, function($c, $stmt){
            list($key, $val) = \array_pad(array_map('trim', explode(':', $stmt)), 2, null);
            $c[$key] = $val;
            return $c;
        }, []);

        $this->proxy       = $this->getAuthorityComponent($settings['proxy_host'], $settings['proxy_port']);
        $this->credentials = $this->getAuthorityComponent($settings['proxy_user'], $settings['proxy_pass']);
    }

    public function request(string $method, string $uri, array $headers = [], array $data = []): Response
    {
        $options = [
            'http' => [
                'method' => strtoupper($method),
                'header' => $headers + [$this->credentials ? 'Proxy-Authorization: Basic ' . base64_encode($this->credentials) : null],
                'proxy' => $this->proxy,
                'content' => http_build_query($data),
            ],
        ];

        $context = stream_context_create($options);
        $body = file_get_contents($uri, false, $context);

        if($body === false){
            trigger_error(
                "Unable to contact the Server. Are outbound connections disabled? " .
                "(If a proxy is required for outbound traffic, you may configure " .
                "the honey pot to use a proxy. For instructions, visit " .
                "http://www.projecthoneypot.org/settings_help.php)",
                E_USER_ERROR
            );
        }

        return new TextResponse($body);
    }
}

trait AliasingTrait
{
    private $aliases = [];

    public function searchAliases($search, array $aliases, array $collector = [], $parent = null): array
    {
        foreach($aliases as $alias => $value){
            if(is_array($value)){
                return $this->searchAliases($search, $value, $collector, $alias);
            }
            if($search === $value){
                $collector[] = $parent ?? $alias;
            }
        }

        return $collector;
    }

    public function getAliases($search): array
    {
        $aliases = $this->searchAliases($search, $this->aliases);
    
        return !empty($aliases) ? $aliases : [$search];
    }

    public function aliasMatch($alias, $key)
    {
        return $key === $alias;
    }

    public function setAlias($key, $alias)
    {
        $this->aliases[$alias] = $key;
    }

    public function setAliases(array $array)
    {
        array_walk($array, function($v, $k){
            $this->aliases[$k] = $v;
        });
    }
}

abstract class Data
{
    protected $key;
    protected $value;

    public function __construct($key, $value)
    {
        $this->key = $key;
        $this->value = $value;
    }

    public function key()
    {
        return $this->key;
    }

    public function value()
    {
        return $this->value;
    }
}

class DataCollection
{
    use AliasingTrait;

    private $data;

    public function __construct(Data ...$data)
    {
        $this->data = $data;
    }

    public function set(Data ...$data)
    {
        array_map(function(Data $data){
            $index = $this->getIndexByKey($data->key());
            if(is_null($index)){
                $this->data[] = $data;
            } else {
                $this->data[$index] = $data;
            }
        }, $data);
    }

    public function getByKey($key)
    {
        $key = $this->getIndexByKey($key);
        return !is_null($key) ? $this->data[$key] : null;
    }

    public function getValueByKey($key)
    {
        $data = $this->getByKey($key);
        return !is_null($data) ? $data->value() : null;
    }

    private function getIndexByKey($key)
    {
        $result = [];
        array_walk($this->data, function(Data $data, $index) use ($key, &$result){
            if($data->key() == $key){
                $result[] = $index;
            }
        });

        return !empty($result) ? reset($result) : null;
    }
}

interface Transcriber
{
    public function transcribe(array $data): DataCollection;
    public function canTranscribe($value): bool;
}

class StringData extends Data
{
    public function __construct($key, string $value)
    {
        parent::__construct($key, $value);
    }
}

class CompressedData extends Data
{
    public function __construct($key, string $value)
    {
        parent::__construct($key, $value);
    }

    public function value()
    {
        $url_decoded = base64_decode(str_replace(['-','_'],['+','/'],$this->value));
        if(substr(bin2hex($url_decoded), 0, 6) === '1f8b08'){
            return gzdecode($url_decoded);
        } else {
            return $this->value;
        }
    }
}

class FlagData extends Data
{
    private $data;

    public function setData($data)
    {
        $this->data = $data;
    }

    public function value()
    {
        return $this->value ? ($this->data ?? null) : null;
    }
}

class CallbackData extends Data
{
    private $arguments = [];

    public function __construct($key, callable $value)
    {
        parent::__construct($key, $value);
    }

    public function setArgument($pos, $param)
    {
        $this->arguments[$pos] = $param;
    }

    public function value()
    {
        ksort($this->arguments);
        return \call_user_func_array($this->value, $this->arguments);
    }
}

class DataFactory
{
    private $data;
    private $callbacks;

    private function setData(array $data, string $class, DataCollection $dc = null)
    {
        $dc = $dc ?? new DataCollection;
        array_walk($data, function($value, $key) use($dc, $class){
            $dc->set(new $class($key, $value));
        });
        return $dc;
    }

    public function setStaticData(array $data)
    {
        $this->data = $this->setData($data, StringData::class, $this->data);
    }

    public function setCompressedData(array $data)
    {
        $this->data = $this->setData($data, CompressedData::class, $this->data);
    }

    public function setCallbackData(array $data)
    {
        $this->callbacks = $this->setData($data, CallbackData::class, $this->callbacks);
    }

    public function fromSourceKey($sourceKey, $key, $value)
    {
        $keys = $this->data->getAliases($key);
        $key = reset($keys);
        $data = $this->data->getValueByKey($key);

        switch($sourceKey){
            case 'directives':
                $flag = new FlagData($key, $value);
                if(!is_null($data)){
                    $flag->setData($data);
                }
                return $flag;
            case 'email':
            case 'emailmethod':
                $callback = $this->callbacks->getByKey($key);
                if(!is_null($callback)){
                    $pos = array_search($sourceKey, ['email', 'emailmethod']);
                    $callback->setArgument($pos, $value);
                    $this->callbacks->set($callback);
                    return $callback;
                }
            default:
                return new StringData($key, $value);
        }
    }
}

class DataTranscriber implements Transcriber
{
    private $template;
    private $data;
    private $factory;

    private $transcribingMode = false;

    public function __construct(DataCollection $data, DataFactory $factory)
    {
        $this->data = $data;
        $this->factory = $factory;
    }

    public function canTranscribe($value): bool
    {
        if($value == '<BEGIN>'){
            $this->transcribingMode = true;
            return false;
        }

        if($value == '<END>'){
            $this->transcribingMode = false;
        }

        return $this->transcribingMode;
    }

    public function transcribe(array $body): DataCollection
    {
        $data = $this->collectData($this->data, $body);

        return $data;
    }

    public function collectData(DataCollection $collector, array $array, $parents = []): DataCollection
    {
        foreach($array as $key => $value){
            if($this->canTranscribe($value)){
                $value = $this->parse($key, $value, $parents);
                $parents[] = $key;
                if(is_array($value)){
                    $this->collectData($collector, $value, $parents);
                } else {
                    $data = $this->factory->fromSourceKey($parents[1], $key, $value);
                    if(!is_null($data->value())){
                        $collector->set($data);
                    }
                }
                array_pop($parents);
            }
        }
        return $collector;
    }

    public function parse($key, $value, $parents = [])
    {
        if(is_string($value)){
            if(key($parents) !== NULL){
                $keys = $this->data->getAliases($key);
                if(count($keys) > 1 || $keys[0] !== $key){
                    return \array_fill_keys($keys, $value);
                }
            }

            end($parents);
            if(key($parents) === NULL && false !== strpos($value, '=')){
                list($key, $value) = explode('=', $value, 2);
                return [$key => urldecode($value)];
            }

            if($key === 'directives'){
                return explode(',', $value);
            }

        }

        return $value;
    }
}

interface Template
{
    public function render(DataCollection $data): string;
}

class ArrayTemplate implements Template
{
    public $template;

    public function __construct(array $template = [])
    {
        $this->template = $template;
    }

    public function render(DataCollection $data): string
    {
        $output = array_reduce($this->template, function($output, $key) use($data){
            $output[] = $data->getValueByKey($key) ?? null;
            return $output;
        }, []);
        ksort($output);
        return implode("\n", array_filter($output));
    }
}

class Script
{
    private $client;
    private $transcriber;
    private $template;
    private $templateData;
    private $factory;

    public function __construct(HttpClient $client, Transcriber $transcriber, Template $template, DataCollection $templateData, DataFactory $factory)
    {
        $this->client = $client;
        $this->transcriber = $transcriber;
        $this->template = $template;
        $this->templateData = $templateData;
        $this->factory = $factory;
    }

    public static function run(string $host, int $port, string $script, string $settings = '')
    {
        $client = new ScriptClient($settings);

        $templateData = new DataCollection;
        $templateData->setAliases([
            'doctype'   => 0,
            'head1'     => 1,
            'robots'    => 8,
            'nocollect' => 9,
            'head2'     => 1,
            'top'       => 2,
            'legal'     => 3,
            'style'     => 5,
            'vanity'    => 6,
            'bottom'    => 7,
            'emailCallback' => ['email','emailmethod'],
        ]);

        $factory = new DataFactory;
        $factory->setStaticData([
            'doctype' => '<!DOCTYPE html>',
            'head1'   => '<html><head>',
            'head2'   => '<title>Shier</title></head>',
            'top'     => '<body><div align="center">',
            'bottom'  => '</div></body></html>',
        ]);
        $factory->setCompressedData([
            'robots'    => 'H4sIAAAAAAAAA7PJTS1JVMhLzE21VSrKT8ovKVZSSM7PK0nNK7FVysvPzEtJrVCys8GnKi0_Jye_nICivPzEouSMzLJUJTsAPBwkfHMAAAA',
            'nocollect' => 'H4sIAAAAAAAAA7PJTS1JVMhLzE21VcrL103NTczM0U3Oz8lJTS7JzM9TUkjOzytJzSuxVdJXsgMAKsBXli0AAAA',
            'legal'     => 'H4sIAAAAAAAAA61aWXPbOBJ-31-BcrY8SZXjI-P4WHpcpdiaRFuJ7JVkT-URIiERE5LQAKAUza_fPgAdMcmZh3nwIR44ur_--uuGbrycFkqkqigWMst0Nf_l4PRATI3NlKV_8ZZbyDTcuv3Xjbf4K7u9gcuVcH5dqF8OZqbyb2ey1MX6PyI1tdXKHonSVAZfVsnB7WE1dYvkZnp7g8_CM4Wxv6xy7dWtuznBa7c3J9Pbw1dnF6eJ-Nt_wofGcRcvx72Z2s1K7O0kV2Klpg4eFjN44uw8MaVY5fDv6Xt6wpuXw8ow7NrUL2-m4aarp7-r1AtvhM9xJONzZYVXtnRivme7TLtFIcFulanUwe1USQvWFjOpCydn6uYEH741S2UrXlhFu3h1dZmEtcNKhExTtcA9XJBp4A8-ZdXhq-vLJAuXclXCf9fXibRqVuNoV0mxPsYn5VxVHp96nwiDd94lsHIldJVpvHyVaDIIDHEs0HA4oXPC6jleh7W_9VZWbqbYkDQvgmulPT7wG6-V5uL17zqz0X_pX-GiG00v7syb8HA77nJGXcE2TV1xnDhvcct_1LLQM60y4SBoCjWV6Tf4MC3q6KzH_t0AZ9mH2xgt8y5RqZaFsGjjs4Qt7q1OPZn5LKkcPjs0Vde6XK6UD5O9_VSXEt-F_TxrMLKx7vDV-QWj3S00xLI7gqAO7j16aZlvwTK6c86FttrD3uHVao6WCAuoMvUdp1rYrtdzBeA32bpSotQOeUVWytROSA9wB-t6IzMnAIXKeqmrEv6L2J9bCWGTKafnlYpgNgTb2psSRkhlEYDM4Lq4TkoIICEztPNpEsztnHLCVDsRcvjq8ufEC44s99I0WTCNVamZs5X1n7AGNObpeSJpEQXs8Fh8hTAk2KffKrPi6FI8PT6VS9irWEqACZiEp4QHHPnbAdN0GK-Q5RTsIaTOBASqsuCFeuFyE01kIX6PhKyyE0aRFTDCdpc8q5nFZSsHAZxlVoW5kXHamS6Qh24wTx4e-Y3tO2WIwR22LRhjHkyvOrEFIAUjzoWDYIO4SmEnsMXSwNJWci3wntdljC_EBpu6ytp5Q31f2M5ZkdtSAA_EGo_rmtmpi250K0k1Pi4bOehv5a4fEt4us_QZdrlYyMi-6LG1kHP-rAL8QzKScwgw54ngTUwNFrgeb74--G8NdtE0ZiF6KRro4A1N6bvMOat9bYElF-CstZgVtcuDXQPoIunNO3mmXnizqgTZYQbiIRPlIlKNA3LYECfElejx31KHpIjoq1OeTxRyBSEHS5KLRaEJkoArseAR7MzYEkYHLGkOBIiPGd_LKMJkE7pmMcN76cOQYGc0UuBgsNtVYk09zyFeQ6r-OaF1Yxal_Ltli-skvOeQ78Ie0B1CTg2_otpZSQIPK4yGlrza9acRd9nfxGe7ZttHJu4S0gU7hqMWt8ckJXK53JE0JQQ6eIoliwUqwHvXCXtkBQDdkgrZuHaKpciAQYCOnPF49OQzMSB88oETAQx44ecEjNYecsDN7XHbGQDzWheFAtJqTmPRRc-D8WDyMBqL3sdRvy8mn3oTstpjbzT5Kh5GYtwf3g-GH0Vv-HWDn6cP4_7_nvrDifgwgnC_eJ_cfRIPv9KYYfgTUOX_sDRvlWBbbMDqzpP-qJPdgWMdCSYMubqQQv1Ra78OC_9CG6Qp4kp6Q9ji1f61u4dh1FT4k-btLoyCmGHnMF1j9oK3gtA_S4rCrFBm74Ygw4gxwzjVJDLmUeySmlcCtSxldEyj_CDpeiQXHg8SyzYOetW6PXGC0AMBx0iXVXt-QWW3zedZzez82nXZ3aoFKK6aCBzCyfqNcgN8LrU1hE5ZBD-8ESsmThND9gJ4rGAj0n4B2CGAuqcFoQzQh_xCshnIGS3t1lVmTakEVDJum3MlREqGlkWn1YHCcBE15yfK4rDildXR9fxz2_u8h4_Pg7v-cEzSb-86oOtd0ieMTUaDu8lgF0XtVULARDvIQMuh2g7c8pMThU6Jd4ZByO_4VTwHgUnqXNBOSJVbMw0JGDU75KyUE7ZcFcpuIcT4OxIhm8uIVHrDlN0iB6oVVaEngsUXnel3pgufr3-gLPK-doLKTRlSMKIEhRsJA_BV0BjgspLQSfIbNCbFylxReGDCCm-HRCdZCZ-xlObt4lgo7uDO1ftkLP79_pQrmq9s2pqj-JJrXD2tCeEob3NWtiRrQevzWwOAWNXJ3Fh0CwiWpa6wOgu7h0Elq3R2yxnN91ODDI6iQGHR0Y4pLsbRJC4KMoKCK9aCi0Nrcj2FV7LjHaC3s0ej6uw9gtkQHZcXyeCu9-Fzv2vrCw31LAyf6T__3Li9NRF8ptRDzYfdIOOlytB_QEUUpJj2DeWmjxHEzLT1OwCqUsSgdGOlQ7kijOViNg_-aLBxrGGnHamdyYtaKapB2kWrTtc4mQYWI4d5vVTiLgS1h0WL11GpoQQF6pKbIocDXjF3-AakbJfpVzgIeH6zTV0hgDudBdCBiKvSNbJqBsRZGMhOAN9SpFaZTYyHzJPBU3v2rS1z-Nl1sp213WCdQfO7XAnqFMIegIRgbbkCQljGNeQNnvAbT1xwToFKJOhfL3JdtitS2AjBI22mbRNX3NCxi5OqQqWdO9JIFC6uH_KjTkWIVLvcSz8vgm7Uv3sY3Y_3Mg_Is92PpPt2kw_DEROfJY7iBt9Z4sWjNX7rNlMFdoUEAiUeUOnrTZVwQBQoNMebYFqsIKYVeKWUPs1VrCqAc0EykxQSIYMQFbVH-yyu9FOPsuhzfzwBYXokPvYmn_oj0N2XV8l2nV_643HvI2VgIN7TpLO1JpdAlTtZ6Y2YwHDXuAUQlJ9oFDHYDg4TjkEs92khX8biAZ4G04_7o-d_QgSDf-4Hk8HDcPyDeIAl7bvxadx_SX0hTWM5tlu1VA2lRMwVrw-ClqT-qaNSBt2DUrK94MJyNmIHKhuogD6sWYigxnq9rYNRvFZuFymT5pE3goe8bVhi7GrdTU9HUCY_ErL2OcqY8KxgcMHT_Hl1uOmfA0V1SsVSVlqme5zl864X1Pe0qJFjQIVYvYQiXX03HsK0VFbHQkuJlq2azVYFF-UkXSDmxYL7CsCKzkUt8YPcbIDGafJAcNy7PiTMUGi8hd_vkqcvvWE7rz3v6dEKEWBivRF812UQGLIuYf0QyKnVC5b6K6W8KHwGqcVCots2YYACftvwwWkCtszUkZgya3jqlWBrknLtkWAVZpcK2y5BnxrbXhxLAl-hAiBsKBY4iWKDCQjchzZH_IH1ofBaWL3p68CWpV0LJGNaSCjjaHULy2OHvkHGNSXXg6A7JV8u_oLfNtV8aEzRQmiFm4ZZQ-5KtypiK1wptqgks8qFNkdHn9TV1LpwHiQXCM2CDHYYW8VB-IDlJVkdu7JoAUHd54oazzJaQyxfFETD-x8Rep48jQbjeyx7CJbDl9RlSPmmSmUhEzd0gmPgTK1hrMy5j2iBeJo6x2ZHcKGoLYlLJrslDV4oCBqroNyDZvSMFy6wxQEpBdIxYy87s7eZzRQSjphKLPjrcioq6Wu70fOMsIM3ABkqwCDuWSERGYR51f7RDNkYZ1bH7V4NXS5q4XVoKUTJdjockrqAademKupPA8-BSqjmGIjxUIQPiqJQzsXUKtk51NL4XXEG_E1xQ-cChADX2U0wkDz3mDpEylza7EeqHHVlzNtQQwBB7uO19-GJTPOihg9ABauGipIjwnLtOch2O3-8KnCynnE_AziPLBWbDFFrAUU-BvxjwQLWc9j1OL_YTPiRKW88eRgNkNXPkiNWJ6PecPxrf4TP3HdqnKmrbSYyU0_9rC5Qsxu7ASNscjgZ_DqAgVrT_R1kHQxdmPRp0qfd3vWP_xnBw5vEkh6t5agvHs4OGP1XCdQa5FsAbTxJ04Q4zFGoVt9xTdzet-JCvqMBBhKgUvZNe6Xkg4IlLIwVCPEUFnwsHgvwGN3iPFUUYqq4J7Ft5EEW4h1AXi3lNwB97Xb6D2fJLGbD82QZevPta5XcgsZTkxUsentQ3tlQobMEPOL9tsYjZJ3VBZ57ZtwWW-hqp2DajyPuE3efDsXH-asAcsF9BBD_nsK70CW2E_b67kf4rQe8ud6c_gRbUR0X1MAuWW-_HcE8vfnuwe6CCyyvatlRm2OiDwHq-bSWh895yniM3Z5PljqKUdCfzcCLuiqeSMYzgAa3xlHTTW0fa9HmoaMAQCNB7RJP7PmdIzZoxtNhz5OXmkf5EnB8FFSRRL3BD1dzProNeppIqeBzya4zYTPzayFR-Kayau3cuK3m3RSR-zDjn4bMpTb9EOFqOl20nlojpcOcwbHIZqZ8GkNK2LBnalVgfuEi9UU9IZmYgb4bJJPa0RDgHAZqZ3cEu84ADAiuWMED8EFGUiBQOdNunt9rGxyWaWpL0Y5CHwfpblNHLVVVq3BWGjuOk1g-uF1aCecLlwkO2OlKqNd1hqUfiMIKMjl_W2g3XUApV1M11eC67Fj0KqHCFx5Y88Ll2oWTztSLRQh01QmpP2o5n6-hpEqJM1bGZMCa7ltYg2f4SFKtsMZNQg7NTHe8u6oRHmFNHkQvVPSDzjJmndJ3hUD3l6VwucGv1IRpR_ekwURvKHp3d_3HSW9418eTXxIQcca9dHhC31I7ofMH-Afu_x_eUaQP6yYAAA',
            'style'     => 'H4sIAAAAAAAAAyXMQQqDQAwAwK8IXru2Xnelx_1HukYIxESSgFvEv_fQecAsHl_GN0w7nAaMnfykqymr5bHWWjaVyB_ldZhfRx_ACPjhIJ4cjbYS2COt2NQgSCWLCpZ7ef7fHz-UrKZfAAAA',
            'vanity'    => 'H4sIAAAAAAAAA22S207DMAyGX8XKbmEdp0nL2goxDSEk2MThgsu0ydpAFkeOWbe3Jy3jBlBkyVbi7__jJGdVOQO1cS4GVVvfFGIi-jIorY9lhaQN9VnkgzOFqFT90RB-ei1Hs9ls3lnNrTy_mIT9XJQ5UwoNO-Vs4wvBGH4aj1AJZ2EP5ymuUlymrm-JU7JNyzKis3o4MlosFj0xefNwZGzQs6zQaej1QJFV7iQqH0-jIbuZ1-iQ5Gg6nc6Tsuw9BYyWLXpJxim2O5OY13nWU8s8Y_3HLhxzZzYs4Jf5i6Q6Sevy-7YKWjKbQrTMQWZZ13XjQPhuam7Rm0NAHiM1mYDaqRgLsVUdKWf2NnZWlA_Lh5vlE6xuYf20ul8uXuBu9bh8g_XqJc9UmVf0r8KnT-a34xq34l_sc9qFO0U7E9kQrAk5GUojgEfDHdJHD042d1YbDdUBXgfgIDkMJOsfMRt-R_kFLjRDsiUCAAA',
        ]);
        $factory->setCallbackData([
            'emailCallback' => function($email, $style = null){
                $value = $email;
                $display = 'style="display:' . ['none',' none'][random_int(0,1)] . '"';
                $style = $style ?? random_int(0,5);
                $props[] = "href=\"mailto:$email\"";
        
                $wrap = function($value, $style) use($display){
                    switch($style){
                        case 2: return "<!-- $value -->";
                        case 4: return "<span $display>$value</span>";
                        case 5:
                            $id = 's6sp1uam';
                            return "<div id=\"$id\">$value</div>\n<script>document.getElementById('$id').innerHTML = '';</script>";
                        default: return $value;
                    }
                };
        
                switch($style){
                    case 0: $value = ''; break;
                    case 3: $value = $wrap($email, 2); break;
                    case 1: $props[] = $display; break;
                }
        
                $props = implode(' ', $props);
                $link = "<a $props>$value</a>";
        
                return $wrap($link, $style);
            }
        ]);

        $transcriber = new DataTranscriber($templateData, $factory);

        $template = new ArrayTemplate([
            'doctype',
            'injDocType',
            'head1',
            'injHead1HTMLMsg',
            'robots',
            'injRobotHTMLMsg',
            'nocollect',
            'injNoCollectHTMLMsg',
            'head2',
            'injHead2HTMLMsg',
            'top',
            'injTopHTMLMsg',
            'actMsg',
            'errMsg',
            'customMsg',
            'legal',
            'injLegalHTMLMsg',
            'altLegalMsg',
            'emailCallback',
            'injEmailHTMLMsg',
            'style',
            'injStyleHTMLMsg',
            'vanity',
            'injVanityHTMLMsg',
            'altVanityMsg',
            'bottom',
            'injBottomHTMLMsg',
        ]);

        $hp = new Script($client, $transcriber, $template, $templateData, $factory);
        $hp->handle($host, $port, $script);
    }

    public function handle($host, $port, $script)
    {
        $data = [
            'tag1' => '733fd86c589646d2a40671e7d1712ac4',
            'tag2' => '0b31520d1576c493f3f9e84ab8cd97fa',
            'tag3' => '3649d4e9bcfd3422fb4f9d22ae0a2a91',
            'tag4' => md5_file(__FILE__),
            'version' => "php-".phpversion(),
            'ip'      => $_SERVER['REMOTE_ADDR'],
            'svrn'    => $_SERVER['SERVER_NAME'],
            'svp'     => $_SERVER['SERVER_PORT'],
            'sn'      => $_SERVER['SCRIPT_NAME']     ?? '',
            'svip'    => $_SERVER['SERVER_ADDR']     ?? '',
            'rquri'   => $_SERVER['REQUEST_URI']     ?? '',
            'phpself' => $_SERVER['PHP_SELF']        ?? '',
            'ref'     => $_SERVER['HTTP_REFERER']    ?? '',
            'uagnt'   => $_SERVER['HTTP_USER_AGENT'] ?? '',
        ];

        $headers = [
            "User-Agent: PHPot {$data['tag2']}",
            "Content-Type: application/x-www-form-urlencoded",
            "Cache-Control: no-store, no-cache",
            "Accept: */*",
            "Pragma: no-cache",
        ];

        $subResponse = $this->client->request("POST", "http://$host:$port/$script", $headers, $data);
        $data = $this->transcriber->transcribe($subResponse->getLines());
        $response = new TextResponse($this->template->render($data));

        $this->serve($response);
    }

    public function serve(Response $response)
    {
        header("Cache-Control: no-store, no-cache");
        header("Pragma: no-cache");

        print $response->getBody();
    }
}

Script::run(__REQUEST_HOST, __REQUEST_PORT, __REQUEST_SCRIPT, __DIR__ . '/phpot_settings.php');

