detain/parallels-licensing

View on GitHub
src/Parallels.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php
/**
 * Parallels Functionality
 *
 * API Documentation at: .. ill fill this in later from forum posts
 *
 * @author Joe Huss <detain@interserver.net>
 * @copyright 2019
 * @package MyAdmin
 * @category Licenses
 */

namespace Detain\Parallels;

require_once __DIR__.'/../../../workerman/statistics/Applications/Statistics/Clients/StatisticClient.php';

use XML_RPC2_Client;

/**
 * Parallels
 *
 * @access public
 */
class Parallels
{
    public $licenseType = 'billing'; // billing or purchase
    private $xmlOptions = ['sslverify' => false];
    private $defaultUrl = 'https://ka.parallels.com:7050/';
    private $defaultDemoUrl = 'https://kademo.parallels.com:7050/';
    public $url = '';
    public $response;
    private $client = '';
    private $login = '';
    private $password = '';
    public $xml;

    /**
     * @param NULL|string $login api login, NULL(default) to use the PARALLELS_KA_LOGIN setting
     * @param NULL|string $password api password, NULL(default) to use the PARALLELS_KA_PASSWORD setting
     * @param NULL|string $client api client, NULL(default) to use the PARALLELS_KA_CLIENT setting
     * @param bool $demo defaults to FALSE, whether or not to use the demo interface instae dof the normal one
     * @param NULL|array $xmlOptions array of optoins ot pass to xmlrpc2 client
     */
    public function __construct($login = null, $password = null, $client = null, $demo = false, $xmlOptions = null)
    {
        if (null === $login && defined('PARALLELS_KA_LOGIN')) {
            $this->login = constant('PARALLELS_KA_LOGIN');
        } else {
            $this->login = $login;
        }
        if (null === $password && defined('PARALLELS_KA_PASSWORD')) {
            $this->password = constant('PARALLELS_KA_PASSWORD');
        } else {
            $this->password = $password;
        }
        if (null !== $client) {
            $this->client = $client;
        } elseif (defined('PARALLELS_KA_CLIENT')) {
            $this->client = constant('PARALLELS_KA_CLIENT');
        }
        if ($demo === true) {
            $this->url = $this->defaultDemoUrl;
        } elseif ($demo === false) {
            $this->url = $this->defaultUrl;
        } else {
            $this->url = $demo;
        }
        if (null !== $xmlOptions) {
            $this->xmlOptions = $xmlOptions;
        }
        require_once 'XML/RPC2/Client.php';
        $this->xml = \XML_RPC2_Client::create($this->url, $this->xmlOptions);
    }

    /**
     * @return array
     */
    public function authInfo()
    {
        return ['login' => $this->login, 'password' => $this->password];
    }

    /**
     * @param array $ips
     * @param array $macs
     * @return array
     */
    public function serverAddress($ips = [], $macs = [])
    {
        if (!is_array($ips) && $ips != '') {
            $ips = [$ips];
        }
        if (!is_array($macs) && $macs != '') {
            $macs = [$macs];
        }
        return [
            'ips' => $ips,
            'macs' => $macs
        ];
    }

    /**
     * @param $key
     * @return mixed
     */
    public function terminateKey($key)
    {
        \StatisticClient::tick('Parallels', 'terminateKey');
        $this->response = $this->xml->__call('partner10.terminateKey', [$this->authInfo(), $key]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'terminateKey', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'terminateKey', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param $key
     * @return mixed
     */
    public function resetKey($key)
    {
        \StatisticClient::tick('Parallels', 'resetKey');
        $this->response = $this->xml->__call('partner10.resetKey', [$this->authInfo(), $key]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'resetKey', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'resetKey', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param $key
     * @return mixed
     */
    public function activateKey($key)
    {
        \StatisticClient::tick('Parallels', 'activateKey');
        $this->response = $this->xml->__call('partner10.activateKey', [$this->authInfo(), $key]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'activateKey', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'activateKey', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param $key
     * @param $note
     * @return mixed
     */
    public function addNoteToKey($key, $note)
    {
        \StatisticClient::tick('Parallels', 'addNoteToKey');
        $this->response = $this->xml->__call('partner10.addNoteToKey', [$this->authInfo(), $key, $note]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'addNoteToKey', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'addNoteToKey', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param      $key
     * @param bool $email
     * @return mixed
     */
    public function sendKeyByEmail($key, $email = false)
    {
        \StatisticClient::tick('Parallels', 'sendKeyByEmail');
        if ($email === false) {
            $this->response = $this->xml->__call('partner10.sendKeyByEmail', [$this->authInfo(), $key]);
        } else {
            $this->response = $this->xml->__call('partner10.sendKeyByEmail', [$this->authInfo(), $key, $email]);
        }
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'sendKeyByEmail', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'sendKeyByEmail', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param       $keyType
     * @param array $upgradePlans
     * @param array $ips
     * @param array $macs
     * @param bool  $licenseType
     * @param bool  $client
     * @return mixed
     */
    public function createKey($keyType, $upgradePlans = [], $ips = [], $macs = [], $licenseType = false, $client = false)
    {
        if (!is_array($ips) && $ips != '') {
            $ips = [$ips];
        }
        \StatisticClient::tick('Parallels', 'createKey');
        $this->response = $this->xml->__call(
            'partner10.createKey',
            [
                                                                      $this->authInfo(),
                                                                      $this->serverAddress($ips, $macs), $client === false ? $this->client : $client,
                                                                      $keyType,
                                                                      $upgradePlans, $licenseType === false ? $this->licenseType : $licenseType
        ]
        );
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'createKey', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'createKey', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
        /* Success:
        Array
        (
        [mainKeyNumber] => PLSK.00004266.0000
        [expirationDate] => stdClass Object
        (
        [scalar] => 20131209T00:00:00
        [xmlrpc_type] => datetime
        [timestamp] => 1386547200
        )

        [productKey] => DETAIN-2TVB02-ZT1R57-AY2442-6WN966
        [additionalKeysNumbers] => Array
        (
        )

        [resultCode] => 100
        [resultDesc] => PLSK.00004266.0000 has been successfully created.
        [updateDate] => stdClass Object
        (
        [scalar] => 20131129T00:00:00
        [xmlrpc_type] => datetime
        [timestamp] => 1385683200
        )

        )
        */
    }

    /**
     * @param $key
     * @return mixed
     */
    public function retrieveKey($key)
    {
        \StatisticClient::tick('Parallels', 'retrieveKey');
        $this->response = $this->xml->__call('partner10.retrieveKey', [$this->authInfo(), $key]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'retrieveKey', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'retrieveKey', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
        /* Success
        Array
        (
        [keyExtension] => xml
        [resultCode] => 100
        [resultDesc] => PLSK.00005819.0000 has been successfully retrieved
        [keyNumber] => PLSK.00005819.0000
        [key] => stdClass Object
        (
        [scalar] => <?xml version="1.0" encoding="UTF-8"?><plesk-windows:key xmlns:plesk-windows="http://parallels.com/schemas/keys/products/plesk/windows/multi" core:format="openfusion-3" xmlns:core="http://parallels.com/schemas/keys/core/3">
        <!--Unique product Key number-->
        <core:key-number core:type="string">PLSK.00005819</core:key-number>
        <!--Key version-->
        <core:key-version core:type="string">0000</core:key-version>
        <!--Key description-->
        <core:description>
        <core:keytype>Parallels Plesk Panel 10.x/11.x and Later for Windows</core:keytype>
        <core:feature>Unlimited Domains w/1 yr SUS</core:feature>
        <core:feature>Parallels Web Presence Builder - 100 Sites</core:feature>
        <core:feature>Parallels PowerPack for Plesk (Windows)</core:feature>
        </core:description>
        <!--Product which this license is intended to work on-->
        <core:product core:type="string">plesk-win</core:product>
        <!--Supported product version-->
        <core:versions>
        <core:from core:type="string">10.0</core:from>
        <core:to core:type="string">any</core:to>
        </core:versions>
        <!--Date after which this license becomes usable (inclusive)-->
        <core:start-date core:type="date">instant</core:start-date>
        <!--Date before which this license is usable (exclusive)-->
        <core:expiration-date core:type="date">2013-12-02</core:expiration-date>
        <!--URL of the service endpoint to use when performing an autoupdate-->
        <core:license-server-url core:type="string">https://ka.parallels.com:5224/xmlrpc</core:license-server-url>
        <!--Date when product will try to perform an autoupdate-->
        <core:update-date core:type="date">2013-11-22</core:update-date>
        <core:update-ticket core:hidden="true" core:type="string">k0uj75wmlfa1a5hwmk-k43gy2ji0p2y1</core:update-ticket>
        <!--Number of domains-->
        <plesk-windows:domains core:type="integer">unlimited</plesk-windows:domains>
        <!--Number of clients-->
        <plesk-windows:clients core:type="integer">unlimited</plesk-windows:clients>
        <!--Number of webusers-->
        <plesk-windows:webusers core:type="integer">unlimited</plesk-windows:webusers>
        <!--Number of mailnames-->
        <plesk-windows:mailnames core:type="integer">unlimited</plesk-windows:mailnames>
        <!--Number of additional language pack(s)-->
        <plesk-windows:language-packs core:type="integer">0</plesk-windows:language-packs>
        <plesk-windows:mpc-id core:hidden="true" core:type="integer">0</plesk-windows:mpc-id>
        <plesk-windows:mpc-disabled core:hidden="true" core:type="boolean">false</plesk-windows:mpc-disabled>
        <!--Google tools-->
        <plesk-windows:google-tools core:type="boolean">true</plesk-windows:google-tools>
        <plesk-windows:mpc-mng-disabled core:hidden="true" core:type="boolean">false</plesk-windows:mpc-mng-disabled>
        <!--Number of slaves-->
        <plesk-windows:slaves core:type="integer">0</plesk-windows:slaves>
        <!--EventManager-->
        <plesk-windows:event-manager core:type="boolean">true</plesk-windows:event-manager>
        <!--Domains backup-->
        <plesk-windows:domains-backup core:type="boolean">true</plesk-windows:domains-backup>
        <!--Tomcat support-->
        <plesk-windows:tomcat-support core:type="boolean">true</plesk-windows:tomcat-support>
        <!--Subdomains-->
        <plesk-windows:subdomains-support core:type="boolean">true</plesk-windows:subdomains-support>
        <!--Backward key compatibility restriction-->
        <plesk-windows:backward-restriction core:type="integer">0</plesk-windows:backward-restriction>
        <!--Work Inside Virtuozzo-->
        <plesk-windows:vps-only core:type="boolean">false</plesk-windows:vps-only>
        <!--Work Inside Hyper-V-->
        <plesk-windows:hyper-v core:type="boolean">false</plesk-windows:hyper-v>
        <!--Work Inside VMware-->
        <plesk-windows:vmware core:type="boolean">false</plesk-windows:vmware>
        <!--Work Inside Xen-->
        <plesk-windows:xen core:type="boolean">false</plesk-windows:xen>
        <!--Work Inside KVM-->
        <plesk-windows:kvm core:type="boolean">false</plesk-windows:kvm>
        <!--Work Inside Parallels Hypervisor-->
        <plesk-windows:hypervisor core:type="boolean">false</plesk-windows:hypervisor>
        <!--Global changes-->
        <plesk-windows:global-changes core:type="boolean">true</plesk-windows:global-changes>
        <!--Shell access-->
        <plesk-windows:shell-access core:type="boolean">true</plesk-windows:shell-access>
        <!--Detailed traffic-->
        <plesk-windows:detailed-traffic core:type="boolean">true</plesk-windows:detailed-traffic>
        <!--Notification manager-->
        <plesk-windows:notification-manager core:type="boolean">true</plesk-windows:notification-manager>
        <!--Action log manager-->
        <plesk-windows:action-manager core:type="boolean">true</plesk-windows:action-manager>
        <!--Clients and Domains Expirations management-->
        <plesk-windows:expirations-manager core:type="boolean">true</plesk-windows:expirations-manager>
        <!--Client templates-->
        <plesk-windows:client-templates core:type="boolean">true</plesk-windows:client-templates>
        <!--Ability to use Application Vault-->
        <plesk-windows:appvault-support core:type="boolean">true</plesk-windows:appvault-support>
        <!--Ability to use SpamAssassin-->
        <plesk-windows:spamassasin-support core:type="boolean">true</plesk-windows:spamassasin-support>
        <!--Ability to use Trouble Ticketing System-->
        <plesk-windows:tts-support core:type="boolean">true</plesk-windows:tts-support>
        <!--Ability to use ColdFusion-->
        <plesk-windows:coldfusion-support core:type="boolean">true</plesk-windows:coldfusion-support>
        <plesk-windows:ask-update core:hidden="true" core:type="boolean">false</plesk-windows:ask-update>
        <plesk-windows:autoinstaller-config core:hidden="true" core:type="string">true</plesk-windows:autoinstaller-config>
        <!--Ability to use DrWeb-->
        <plesk-windows:drweb-support core:type="boolean">true</plesk-windows:drweb-support>
        <plesk-windows:store-id core:hidden="true" core:type="integer">1</plesk-windows:store-id>
        <!--Ability to use Migration Manager-->
        <plesk-windows:migration-manager core:type="boolean">true</plesk-windows:migration-manager>
        <!--Ability to use MS SQL-->
        <plesk-windows:mssql core:type="boolean">true</plesk-windows:mssql>
        <!--Allowed locales-->
        <plesk-windows:allowed-locales core:type="string">any</plesk-windows:allowed-locales>
        <!--Allows feature upgrades for this version-->
        <plesk-windows:feature-upgrades core:type="boolean">true</plesk-windows:feature-upgrades>
        <!--Parallels Plesk Billing accounts count-->
        <plesk-windows:modernbill-accounts core:type="integer">0</plesk-windows:modernbill-accounts>
        <!--Number of sites-->
        <plesk-windows:sitebuilder-sites core:type="integer">100</plesk-windows:sitebuilder-sites>
        <!--Enable Parallels Plesk Mobile Server Manager-->
        <plesk-windows:mobile-server-manager-support core:type="boolean">true</plesk-windows:mobile-server-manager-support>
        <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://parallels.com/schemas/keys/core/3#canonicalize"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
        <ds:Reference URI="">
        <ds:Transforms>
        <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
        <ds:Transform Algorithm="http://parallels.com/schemas/keys/core/3#transform"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>ENCODED HASH HERE</ds:DigestValue>
        </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
        ENCODED DATA HERE
        </ds:SignatureValue>
        <ds:KeyInfo>
        <ds:X509Data>
        <ds:X509Certificate>
        ENCODED DATA HERE
        </ds:X509Certificate>
        </ds:X509Data>
        </ds:KeyInfo>
        </ds:Signature>
        </plesk-windows:key>

        [xmlrpc_type] => base64
        )

        )

        */
    }

    /**
     * Returns an array with keys 'resultCode', 'resultDesc', and 'upgradePlans'.  the last one being an array of plan names, one time i wrote down the output it looked like:
     * 3_LANGUAGE_PACKS FOTOLIA_OFF 5_LANGUAGE_PACKS  NEWSFEED_OFF VIRTUOZZO_PROMO_OFF ADDITIONAL_LANGUAGE_PACK were some of the packqage types, there wer eothers
     *
     * @param $key
     * @return mixed
     */
    public function getAvailableUpgrades($key)
    {
        \StatisticClient::tick('Parallels', 'getAvailableUpgrades');
        $this->response = $this->xml->__call('partner10.getAvailableUpgrades', [$this->authInfo(), $key]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'getAvailableUpgrades', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'getAvailableUpgrades', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * Success
     * Array
     * (
     * [keyInfo] => Array
     * (
     * [expirationDate] => stdClass Object
     * (
     * [scalar] => 20131202T00:00:00
     * [xmlrpc_type] => datetime
     * [timestamp] => 1385942400
     * )
     * )
     * [features] => Array
     * (
     * [0] => Array
     * (
     * [apiName] => PLESK_7X_FOR_WIN_POWER_PACK
     * [name] => Parallels PowerPack for Plesk (Windows) (Monthly Lease)
     * )
     * [1] => Array
     * (
     * [apiName] => PLESK-100-SITES
     * [name] => Parallels Web Presence Builder - 100 Sites (Monthly Lease)
     * )
     * [2] => Array
     * (
     * [apiName] => UNLIMITED_DOMAINS
     * [name] => Unlimited Domains w/1 yr SUS (Lease)
     * )
     * )
     * [billingType] => LEASE
     * [productFamily] => plesk
     * [createDate] => stdClass Object
     * (
     * [scalar] => 20131023T18:02:11
     * [xmlrpc_type] => datetime
     * [timestamp] => 1382551331
     * )
     * [trial] =>
     * [lastReportingDate] => stdClass Object
     * (
     * [scalar] => 20131029T06:27:31
     * [xmlrpc_type] => datetime
     * [timestamp] => 1383028051
     * )
     * [additionalKeys] => Array
     * (
     * [0] => Array
     * (
     * [expirationDate] => stdClass Object
     * (
     * [scalar] => 20131202T00:00:00
     * [xmlrpc_type] => datetime
     * [timestamp] => 1385942400
     * )
     * [lastReportingIp] => 206.72.205.242, 206.72.205.243, 206.72.205.244, 206.72.205.245, 206.72.205.246
     * [apiKeyType] => N/A
     * [boundIPAddress] =>
     * [problem] =>
     * [keyNumber] => KAV.00005821.0001
     * [properties] => Array
     * (
     * )
     * [type] => ADDITIONAL
     * [updateDate] => stdClass Object
     * (
     * [scalar] => 20131122T00:00:00
     * [xmlrpc_type] => datetime
     * [timestamp] => 1385078400
     * )
     * [clientId] => 19282468
     * [parentKeyNumber] => PLSK.00005819.0000
     * [lastReportingVersion] => 11.5.3
     * [keyType] => Parallels Plesk Panel Antivirus Powered by Kaspersky, 5 Mailboxes (Parallels PowerPack for Plesk) (Windows) (Monthly Lease)
     * [terminated] =>
     * [susAndSupportInfo] => Array
     * (
     * )
     * [features] => Array
     * (
     * )
     * [billingType] => LEASE
     * [productFamily] => kav
     * [createDate] => stdClass Object
     * (
     * [scalar] => 20131023T18:02:12
     * [xmlrpc_type] => datetime
     * [timestamp] => 1382551332
     * )
     * [trial] =>
     * [lastReportingDate] => stdClass Object
     * (
     * [scalar] => 20131023T18:05:24
     * [xmlrpc_type] => datetime
     * [timestamp] => 1382551524
     * )
     * [additionalKeys] => Array
     * (
     * )
     * )
     * [1] => Array
     * (
     * [expirationDate] => stdClass Object
     * (
     * [scalar] => 20131202T00:00:00
     * [xmlrpc_type] => datetime
     * [timestamp] => 1385942400
     * )
     * [lastReportingIp] => 206.72.205.242, 206.72.205.243, 206.72.205.244, 206.72.205.245, 206.72.205.246
     * [apiKeyType] => N/A
     * [boundIPAddress] =>
     * [problem] =>
     * [keyNumber] => APS.00005820.0001
     * [properties] => Array
     * (
     * )
     * [type] => ADDITIONAL
     * [updateDate] => stdClass Object
     * (
     * [scalar] => 20131122T00:00:00
     * [xmlrpc_type] => datetime
     * [timestamp] => 1385078400
     * )
     * [clientId] => 19282468
     * [parentKeyNumber] => PLSK.00005819.0000
     * [lastReportingVersion] => 11.5.3
     * [keyType] => UNITY One, 2 Domains (Parallels PowerPack for Plesk) (Windows) (Monthly Lease)
     * [terminated] =>
     * [susAndSupportInfo] => Array
     * (
     * )
     * [features] => Array
     * (
     * )
     * [billingType] => LEASE
     * [productFamily] => unity-one
     * [createDate] => stdClass Object
     * (
     * [scalar] => 20131023T18:02:11
     * [xmlrpc_type] => datetime
     * [timestamp] => 1382551331
     * )
     * [trial] =>
     * [lastReportingDate] => stdClass Object
     * (
     * [scalar] => 20131023T18:05:26
     * [xmlrpc_type] => datetime
     * [timestamp] => 1382551526
     * )
     * [additionalKeys] => Array
     * (
     * )
     * )
     * )
     * )
     *[resultCode] => 100
     * [resultDesc] => Key info for PLSK.00005819.0000 key returned successfully
     * [keyNumber] => PLSK.00005819.0000
     * )
     *
     * @param $key
     * @return mixed
     */
    public function getKeyInfo($key)
    {
        \StatisticClient::tick('Parallels', 'getKeyInfo');
        $this->response = $this->xml->__call('partner10.getKeyInfo', [$this->authInfo(), $key]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'getKeyInfo', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'getKeyInfo', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param string $ipAddress the ip address
     * @return false|string false if no key , or a string w/ the key
     */
    public function getMainKeyFromIp($ipAddress)
    {
        $response = $this->getKeyNumbers($ipAddress);
        //$response = $this->getKeysInfoByIP($ipAddress);
        $return = false;
        if (isset($response['keyInfos'])) {
            $responseValues = array_values($response['keyInfos']);
            foreach ($responseValues as $data) {
                if ($return === false) {
                    $return = $data['keyNumber'];
                }
                if ($data['type'] == 'MAIN') {
                    $return = $data['keyNumber'];
                }
            }
            return $return;
        } else {
            return false;
        }
    }

    /**
     * @param $ipAddress
     * @return mixed
     */
    public function getKeysInfoByIP($ipAddress)
    {
        \StatisticClient::tick('Parallels', 'getKeysInfoByIP');
        $this->response = $this->xml->__call('partner10.getKeysInfoByIP', [$this->authInfo(), $ipAddress]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'getKeysInfoByIP', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'getKeysInfoByIP', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
    }

    /**
     * @param array|string $ips
     * @param array        $macs
     * @return mixed
     */
    public function getKeyNumbers($ips = [], $macs = [])
    {
        myadmin_log('licenses', 'info', json_encode($this->serverAddress($ips, $macs)), __LINE__, __FILE__);
        \StatisticClient::tick('Parallels', 'getKeyNumbers');
        $this->response = $this->xml->__call('partner10.getKeyNumbers', [$this->authInfo(), $this->serverAddress($ips, $macs)]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'getKeyNumbers', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'getKeyNumbers', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
        /* Success
        Array
        (
        [keyInfos] => Array
        (
        [0] => Array
        (
        [keyType] => Parallels Plesk Panel 10.x/11.x and Later for Windows for Virtual Machines (Lease)
        Lease)
        [lastReportingIp] => 206.72.205.242
        [terminated] => 1
        [keyNumber] => KAV.00004873.0002
        [billingType] => LEASE
        [type] => ADDITIONAL
        [createDate] => stdClass Object
        (
        [scalar] => 20131014T16:44:40
        [xmlrpc_type] => datetime
        [timestamp] => 1381769080
        )

        [lastReportingDate] => stdClass Object
        (
        [scalar] => 20131023T17:35:45
        [xmlrpc_type] => datetime
        [timestamp] => 1382549745
        )

        )

        [3] => Array
        (
        [keyType] => Parallels Plesk Panel 10.x/11.x and Later for Windows (Lease)
        [lastReportingIp] => 206.72.205.242, 206.72.205.243, 206.72.205.244, 206.72.205.245, 206.72.205.246
        [terminated] =>
        [keyNumber] => PLSK.00005819.0000
        [billingType] => LEASE
        [type] => MAIN
        [createDate] => stdClass Object
        (
        [scalar] => 20131023T18:02:11
        [xmlrpc_type] => datetime
        [timestamp] => 1382551331
        )

        [lastReportingDate] => stdClass Object
        (
        [scalar] => 20131029T06:27:31
        [xmlrpc_type] => datetime
        [timestamp] => 1383028051
        )

        )

        [4] => Array
        (
        [keyType] => UNITY One, 2 Domains (Parallels PowerPack for Plesk) (Windows) (Monthly Lease)
        [lastReportingIp] => 206.72.205.242, 206.72.205.243, 206.72.205.244, 206.72.205.245, 206.72.205.246
        [terminated] =>
        [keyNumber] => APS.00005820.0001
        [billingType] => LEASE
        [type] => ADDITIONAL
        [createDate] => stdClass Object
        (
        [scalar] => 20131023T18:02:11
        [xmlrpc_type] => datetime
        [timestamp] => 1382551331
        )

        [lastReportingDate] => stdClass Object
        (
        [scalar] => 20131023T18:05:26
        [xmlrpc_type] => datetime
        [timestamp] => 1382551526
        )

        )

        [5] => Array
        (
        [keyType] => Parallels Plesk Panel Antivirus Powered by Kaspersky, 5 Mailboxes (Parallels PowerPack for Plesk) (Windows) (Monthly Lease)
        [lastReportingIp] => 206.72.205.242, 206.72.205.243, 206.72.205.244, 206.72.205.245, 206.72.205.246
        [terminated] =>
        [keyNumber] => KAV.00005821.0001
        [billingType] => LEASE
        [type] => ADDITIONAL
        [createDate] => stdClass Object
        (
        [scalar] => 20131023T18:02:12
        [xmlrpc_type] => datetime
        [timestamp] => 1382551332
        )

        [lastReportingDate] => stdClass Object
        (
        [scalar] => 20131023T18:05:24
        [xmlrpc_type] => datetime
        [timestamp] => 1382551524
        )

        )

        )

        [resultCode] => 100
        [resultDesc] => Found: PLSK.02554871.0001, APS.02554872.0002, KAV.02554873.0002, PLSK.00005819.0000, APS.00005820.0001, KAV.00005821.0001
        [keyNumbers] => Array
        (
        [0] => PLSK.02554871.0001
        [1] => APS.02554872.0002
        [2] => KAV.02554873.0002
        [3] => PLSK.00005819.0000
        [4] => APS.00005820.0001
        [5] => KAV.00005821.0001
        )

        [detailResultCode] => 0
        )
        */
    }

    /**
     * @param bool $client
     * @return mixed
     */
    public function getAvailableKeyTypesAndFeatures($client = false)
    {
        \StatisticClient::tick('Parallels', 'getAvailableKeyTypesAndFeatures');
        $this->response = $this->xml->__call('partner10.getAvailableKeyTypesAndFeatures', [$this->authInfo(), $client === false ? $this->client : $client]);
        if ($this->response === false) {
            \StatisticClient::report('Parallels', 'getAvailableKeyTypesAndFeatures', false, 1, 'XML Call Error', STATISTICS_SERVER);
        } else {
            \StatisticClient::report('Parallels', 'getAvailableKeyTypesAndFeatures', true, 0, '', STATISTICS_SERVER);
        }
        return $this->response;
        /* My Output:
        Array
        (
        [resultCode] => 100
        [features] => Array
        (
        [0] => ADDON-CT-OAS-L-1Y
        [1] => ADDON-HMP-L-M
        [2] => SB10X-500
        [3] => ADDON-WPB-12500-M
        [4] => MEDIUM
        [5] => 30_DOMAINS_FOR_VZ
        [6] => PLESK-100-SITES
        [7] => SB10X-35000
        [8] => STORE_BUTTON_OFF
        [9] => 2CPU_90CT_PIM
        [10] => 4CPU_1CT_PIM
        [11] => SB10X-300
        [12] => SB10X-25000
        [13] => 3_LANGUAGE_PACKS_FOR_VMM
        [14] => UNLIMITED_DOMAINS_1000_BILLING_ACCOUNTS_100_SITES_FOR_VZ
        [15] => 8CPU_15HV_PVA
        [16] => ADDITIONAL_LANGUAGE_PACK
        [17] => SB10X-100
        [18] => 4CPU_UNLIMITEDVC_PVA
        [19] => PLESK_SWSOFT_SERVICES_OFF
        [20] => 8CPU_100CT_PVA
        [21] => PLESK_POWER_PACK_FOR_VMM
        [22] => 4CPU_20CT_PIM
        [23] => PLESK-UNLIMITED-PB-ACCOUNTS-FOR-VMM
        [24] => HSPHERE_7500_ACCOUNTS
        [25] => CLDF-PLUS-M
        [26] => 7500_SITES_MULTI_SERVER
        [27] => 4-LANGUAGE-PACKS-FOR-PPA
        [28] => MONTHLY_AMPS
        [29] => 300_SITES
        [30] => UO-UNL-L-1Y
        [31] => 2CPU_20CT_PIM
        [32] => 8CPU_6HV_PVA
        [33] => 4_LANGUAGE_PACKS
        [34] => 8CPU_40CT_PVA
        [35] => 8CPU_1CT_PVA
        [36] => 2CPU_4HV_PVA
        [37] => 8CPU_200CT_PVA
        [38] => 4CPU_60CT_PIM
        [39] => 100_EXT_WHITELABEL
        [40] => 8CPU_50CT_PVA
        [41] => PLESK-UNLIMITED-PB-ACCOUNTS
        [42] => SB10X-40000
        [43] => PLESK_HOSTING_SUITE_FOR_VZ
        [44] => HSPHERE_3750_ACCOUNTS
        [45] => 2CPU_7HV_PVA
        [46] => 4CPU_5CT_PIM
        [47] => UNLIMITED_USERS_FOR_VPS
        [48] => PLESK-100-SITES-FOR-VZ
        [49] => PLESK_RELOADED_FOR_VZ_POWER_PACK
        [50] => 8CPU_10HV_PVA
        [51] => ADDONVZ-CT-OAS-L-1Y
        [52] => PLESK_7X_FOR_WIN_FOR_VZ_POWER_PACK
        [53] => SB10X-2500
        [54] => 2CPU_3CT_PIM
        [55] => ADDITIONAL_LANGUAGE_PACK_FOR_VZ
        [56] => 8CPU_80CT_PVA
        [57] => 4CPU_30VC_PVA
        [58] => 1000_SITES_MULTI_SERVER
        [59] => 1_UNITY_MOBILE_SITE
        [60] => 2CPU_40CT_PIM
        [61] => EXTRAS_BUTTONS_OFF
        [62] => UNLIMITED_DOMAINS_FOR_VMM
        [63] => 8CPU_450CT_PVA
        [64] => HSPHERE_500_ACCOUNTS
        [65] => 4CPU_5VC_PVA
        [66] => HSPHERE_1750_ACCOUNTS
        [67] => FOTOLIA_OFF
        [68] => SB10X-50000
        [69] => HSPHERE_1000_ACCOUNTS
        [70] => 1000_EXT
        [71] => SB10X-7500
        [72] => 100_EXTENSIONS
        [73] => 2CPU_1CT_PIM
        [74] => 1000_EXT_WHITELABEL
        [75] => 8CPU_9HV_PVA
        [76] => UO-1-L-1Y
        [77] => 8CPU_5VC_PVA
        [78] => 8CPU_8HV_PVA
        [79] => 4_LANGUAGE_PACKS_FOR_VZ
        [80] => 4CPU_70CT_PIM
        [81] => 30_DOMAINS
        [82] => 2_LANGUAGE_PACKS_FOR_VMM
        [83] => ADDON-CT-OAS-L-M
        [84] => UO-1-W-M
        [85] => UNLIMITED-LANGUAGE-PACKS-FOR-PPA
        [86] => 100_DOMAINS_FOR_VZ
        [87] => ADDON-WPB-1000-M
        [88] => STH-WMP-BUSP-M
        [89] => UNLIMITED_DOMAINS
        [90] => 2CPU_100CT_PIM
        [91] => ADDONVZ-HMP-W-M
        [92] => DISABLE_SITEBUILDER
        [93] => 8CPU_1CT
        [94] => HSPHERE_2500_ACCOUNTS
        [95] => STH-WMP-BUS-M
        [96] => PLESK_POWER_PACK_FOR_WIN
        [97] => 8CPU_30VC_PVA
        [98] => 8CPU_150CT_PVA
        [99] => HSPHERE_5000_ACCOUNTS
        [100] => 4CPU_90CT_PIM
        [101] => PLESK-UNLIMITED-PB-ACCOUNTS-FOR-VZ
        [102] => ADDON-WPB-45000-M
        [103] => PLESK_POWER_PACK_FOR_VZ
        [104] => 8CPU_250CT_PVA
        [105] => 1-LANGUAGE-PACK-FOR-PPA
        [106] => UO-UNL-W-M
        [107] => 2CPU_5VC_PVA
        [108] => ADDON-WPB-15000-M
        [109] => PLESK_RELOADED_POWER_PACK
        [110] => ADDON-WPB-7500-M
        [111] => PLESK-1000-SITES-FOR-VZ
        [112] => 10_UNITY_MOBILE_SITES
        [148] => 3_LANGUAGE_PACKS_FOR_VZ
        [149] => 2CPU_30CT_PIM
        [150] => ENTERPRISE
        [151] => 2CPU_50CT_PIM
        [152] => ADDON-HMP-W-M
        [153] => 2_LANGUAGE_PACKS_FOR_VZ
        [154] => 4_LANGUAGE_PACKS_FOR_VMM
        [155] => UO-UNL-L-M
        [156] => SB10X-12500
        [157] => 4CPU_50CT_PIM
        [158] => ADDON-WPB-20000-M
        [159] => HSPHERE_10000_ACCOUNTS
        [160] => 4CPU_3CT_PIM
        [161] => 3_LANGUAGE_PACKS
        [162] => 8CPU_90CT_PVA
        [163] => 5000_SITES
        [164] => 100_SITES
        [165] => PLESK_POWER_PACK
        [166] => 8CPU_400CT_PVA
        [167] => 500_EXT
        [168] => 5000_SITES_MULTI_SERVER
        [169] => 5_LANGUAGE_PACKS_FOR_VMM
        [170] => UNLIMITED_BATTLEFIELD_SERVERS
        [171] => ADDON-WPB-35000-M
        [172] => PLESK-100-SITES-FOR-VMM
        [173] => ADDON-WPB-50000-M
        [174] => 8CPU_4HV_PVA
        [175] => 8CPU_5HV_PVA
        [176] => 2CPU_10HV_PVA
        [177] => ADDON-WPB-300-M
        [178] => 2CPU_2HV_PVA
        [179] => 300_SITES_MULTI_SERVER
        [180] => 10_DOMAINS_FOR_VZ
        [181] => 1_LANGUAGE_PACK
        [182] => 4CPU_10CT_PIM
        [183] => ADDON-WPB-700-M
        [184] => 2CPU_30VC_PVA
        [185] => 2CPU_1HV_PVA
        [186] => 5_USERS_FOR_VPS
        [187] => 2CPU_10CT_PIM
        [188] => 500_SITES_MULTI_SERVER
        [189] => 300_DOMAINS
        [190] => 10000_SITES
        [191] => 8CPU_2HV_PVA
        [192] => ADDON-WPB-10000-M
        [193] => PLESK_POWER_PACK_FOR_WIN_FOR_VMM
        [194] => PLESK-1000-SITES-FOR-VMM
        [195] => 5_LANGUAGE_PACKS
        [196] => 1_LANGUAGE_PACK_FOR_VZ
        [197] => 2CPU_200CT_PIM
        [198] => VIRTUOZZO_PROMO_OFF
        [199] => SB10X-5000
        [200] => 8CPU_7HV_PVA
        [201] => 10_DOMAINS
        [202] => PRO
        [203] => 500_SITES
        [204] => 2CPU_70CT_PIM
        [205] => 1_BATTLEFIELD_SERVER
        [206] => 2CPU_150CT_PIM
        [207] => 2CPU_80CT_PIM
        [208] => ADDONVMM-HMP-L-M
        [209] => UNLIMITED_USERS
        [210] => 4CPU_30CT_PIM
        [211] => PLESK_POWER_PACK_FOR_WIN_FOR_VZ
        [212] => 8CPU_300CT_PVA
        [213] => 5_USERS
        [214] => 4CPU_150CT_PIM
        [215] => 10_BATTLEFIELD_SERVERS
        [216] => ADDON-WPB-100-M
        [217] => 8CPU_3HV_PVA
        [218] => ADDON-WPB-2500-M
        [219] => 5_LANGUAGE_PACKS_FOR_VZ
        [220] => 5_BATTLEFIELD_SERVERS
        [221] => DISABLE_GOOGLE_TOOLS
        [222] => 500_EXT_WHITELABEL
        [223] => UNLIMITED_DOMAINS_FOR_VZ
        [224] => SB10X-15000
        [225] => UNLIMITED_MAILBOXES_FOR_VZ
        [226] => 2CPU_5HV_PVA
        [227] => PLESK_7X_FOR_WIN_POWER_PACK
        [228] => PLESK-1000-SITES
        [229] => DISABLE_FEATURE_UPGRADES
        [230] => SB10X-20000
        [231] => ENTRY
        [232] => 2CPU_6HV_PVA
        [233] => 8CPU_30CT_PVA
        [234] => UO-UNL-W-1Y
        [235] => 2_LANGUAGE_PACKS
        [236] => 8CPU_UNLIMITEDVC_PVA
        [237] => 100_DOMAINS
        [238] => 8CPU_20CT_PVA
        [239] => 2CPU_3HV_PVA
        [240] => ADD_1_MANAGED_MSSQL
        [241] => 100_EXT
        [242] => 100_EXTENSIONS_FOR_VZ
        [243] => ADDON-WPB-500-M
        [244] => 8CPU_3CT_PVA
        [245] => 2CPU_9HV_PVA
        [246] => 1_LANGUAGE_PACK_FOR_VMM
        [247] => 8CPU_10CT_PVA
        [248] => 2CPU_15HV_PVA
        [249] => 2CPU_8HV_PVA
        [250] => STARTER
        [251] => ADDONVMM-HMP-W-M
        [252] => 7500_SITES
        [253] => 4CPU_40CT_PIM
        [254] => SB10X-30000
        [255] => PROFESSIONAL
        [256] => 1000_SITES
        [257] => 8CPU_350CT_PVA
        [258] => 2CPU_60CT_PIM
        [259] => HSPHERE_200_ACCOUNTS
        [260] => 8CPU_500CT_PVA
        [261] => SB10X-10000
        [262] => STH-WMP-BSC-M
        [263] => ADDON-WPB-25000-M
        )

        [resultDesc] => Key types available: GLOBAL_MENTORING_LIVE_EXPERT_STANDARD_CARE, PSBM_45_SPE, PLESK-10-AND-LATER-FOR-VMM, PLESK_ANTIVIRUS_BY_KAV_FOR_WIN_FOR_VZ, PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-L-M, MYLITTLEADMIN_2000, MYLITTLEADMIN_2005, PLESK_ANTIVIRUS_BY_DRWEB_FOR_WIN, CRT-5-UNL-L, GLOBAL_MENTORING_TOTAL_CARE, LINUXMAGIC_MAGICSPAM, PLESK_ANTIVIRUS_BY_KAV_FOR_VZ, PINNACLE_CART_ECOMMERCE_SHOPPING_CART, SYMANTEC_NORTON_INTERNET_SECURITY_10SEATS_MONTHLY, ATI_PRO_FOR_WIN, STOPTHEHACKER-M, PARALLELS_PREMIUM_ANTIVIRUS_FOR_WIN_FOR_VZ, SB10X-PA, ATI_PRO, CRT-30-UNL-L, 4PSA_VOIPNOW_25_PROFESSIONAL, CLOUDLINUX-L-M, ATMAIL_WEBMAIL, PLESK_10_AND_LATER_FOR_WIN, CRT-5-100-L, PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-FOR-VZ-L-1Y, UNITY-ONE-W-M, PLESK-10-AND-LATER-FOR-WIN-FOR-VMM, GLOBAL_MENTORING_LIVE_EXPERT_BASIC, CRT-50-UNL-L, VIRTUOZZO_CONTAINERS_4, PARALLELS_PREMIUM_ANTIVIRUS_FOR_VZ, PLESK_10_AND_LATER_FOR_VZ, PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-FOR-VZ-L-M, CRT-50-100-L, UNITY-ONE-L-M, PLESK_ANTIVIRUS_BY_DRWEB, SYMANTEC_NORTON_INTERNET_SECURITY_MONTHLY, CRT-100-UNL-L, PARALLELS-CLOUD-SERVER, PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-L-1Y, CRT-100-100-L, PLESK_10_AND_LATER_FOR_WIN_FOR_VZ, PPA-L-M, PARALLELS_PREMIUM_ANTIVIRUS_FOR_WIN, PARALLELS-PREMIUM-ANTIVIRUS-FOR-VMM, PLESK_ANTIVIRUS_BY_KAV_FOR_WIN, PLESK_ANTIVIRUS_BY_DRWEB_FOR_VZ, SYMANTEC_NORTON_INTERNET_SECURITY_5SEATS_MONTHLY, UNITY_MOBILE, PLESK_ANTIVIRUS_BY_DRWEB_FOR_WIN_FOR_VZ, SB10X, UNITY_MOBILE_FOR_WIN, PARALLELS-CLOUD-STORAGE, CRT-30-100-L, CLOUDFLARE-M, VIRTUOZZO_CONTAINERS_4_FOR_WIN, PLESK_10_AND_LATER, PARALLELS_PREMIUM_ANTIVIRUS, SYMANTEC_NORTON_INTERNET_SECURITY_3SEATS_MONTHLY, PLESK_ANTIVIRUS_BY_KAV, KEEPIT_ONLINE_BACKUP. Features available: ADDON-CT-OAS-L-1Y, ADDON-HMP-L-M, SB10X-500, ADDON-WPB-12500-M, MEDIUM, 30_DOMAINS_FOR_VZ, PLESK-100-SITES, SB10X-35000, STORE_BUTTON_OFF, 2CPU_90CT_PIM, 4CPU_1CT_PIM, SB10X-300, SB10X-25000, 3_LANGUAGE_PACKS_FOR_VMM, UNLIMITED_DOMAINS_1000_BILLING_ACCOUNTS_100_SITES_FOR_VZ, 8CPU_15HV_PVA, ADDITIONAL_LANGUAGE_PACK, SB10X-100, 4CPU_UNLIMITEDVC_PVA, PLESK_SWSOFT_SERVICES_OFF, 8CPU_100CT_PVA, PLESK_POWER_PACK_FOR_VMM, 4CPU_20CT_PIM, PLESK-UNLIMITED-PB-ACCOUNTS-FOR-VMM, HSPHERE_7500_ACCOUNTS, CLDF-PLUS-M, 7500_SITES_MULTI_SERVER, 4-LANGUAGE-PACKS-FOR-PPA, MONTHLY_AMPS, 300_SITES, UO-UNL-L-1Y, 2CPU_20CT_PIM, 8CPU_6HV_PVA, 4_LANGUAGE_PACKS, 8CPU_40CT_PVA, 8CPU_1CT_PVA, 2CPU_4HV_PVA, 8CPU_200CT_PVA, 4CPU_60CT_PIM, 100_EXT_WHITELABEL, 8CPU_50CT_PVA, PLESK-UNLIMITED-PB-ACCOUNTS, SB10X-40000, PLESK_HOSTING_SUITE_FOR_VZ, HSPHERE_3750_ACCOUNTS, 2CPU_7HV_PVA, 4CPU_5CT_PIM, UNLIMITED_USERS_FOR_VPS, PLESK-100-SITES-FOR-VZ, PLESK_RELOADED_FOR_VZ_POWER_PACK, 8CPU_10HV_PVA, ADDONVZ-CT-OAS-L-1Y, PLESK_7X_FOR_WIN_FOR_VZ_POWER_PACK, SB10X-2500, 2CPU_3CT_PIM, ADDITIONAL_LANGUAGE_PACK_FOR_VZ, 8CPU_80CT_PVA, 4CPU_30VC_PVA, 1000_SITES_MULTI_SERVER, 1_UNITY_MOBILE_SITE, 2CPU_40CT_PIM, EXTRAS_BUTTONS_OFF, UNLIMITED_DOMAINS_FOR_VMM, 8CPU_450CT_PVA, HSPHERE_500_ACCOUNTS, 4CPU_5VC_PVA, HSPHERE_1750_ACCOUNTS, FOTOLIA_OFF, SB10X-50000, HSPHERE_1000_ACCOUNTS, 1000_EXT, SB10X-7500, 100_EXTENSIONS, 2CPU_1CT_PIM, 1000_EXT_WHITELABEL, 8CPU_9HV_PVA, UO-1-L-1Y, 8CPU_5VC_PVA, 8CPU_8HV_PVA, 4_LANGUAGE_PACKS_FOR_VZ, 4CPU_70CT_PIM, 30_DOMAINS, 2_LANGUAGE_PACKS_FOR_VMM, ADDON-CT-OAS-L-M, UO-1-W-M, UNLIMITED-LANGUAGE-PACKS-FOR-PPA, 100_DOMAINS_FOR_VZ, ADDON-WPB-1000-M, STH-WMP-BUSP-M, UNLIMITED_DOMAINS, 2CPU_100CT_PIM, ADDONVZ-HMP-W-M, DISABLE_SITEBUILDER, 8CPU_1CT, HSPHERE_2500_ACCOUNTS, STH-WMP-BUS-M, PLESK_POWER_PACK_FOR_WIN, 8CPU_30VC_PVA, 8CPU_150CT_PVA, HSPHERE_5000_ACCOUNTS, 4CPU_90CT_PIM, PLESK-UNLIMITED-PB-ACCOUNTS-FOR-VZ, ADDON-WPB-45000-M, PLESK_POWER_PACK_FOR_VZ, 8CPU_250CT_PVA, 1-LANGUAGE-PACK-FOR-PPA, UO-UNL-W-M, 2CPU_5VC_PVA, ADDON-WPB-15000-M, PLESK_RELOADED_POWER_PACK, ADDON-WPB-7500-M, PLESK-1000-SITES-FOR-VZ, 10_UNITY_MOBILE_SITES, 8CPU_70CT_PVA, UNLIMITED_MAILBOXES, STH-WMP-PRO-M, SB10X-45000, 8CPU_1HV_PVA, NEWSFEED_OFF, 4CPU_80CT_PIM, UO-1-W-1Y, 10000_SITES_MULTI_SERVER, 8CPU_UNLIMITEDHV_PVA, 2_BATTLEFIELD_SERVERS, CLNX-M, 8CPU_60CT_PVA, 100_SITES_MULTI_SERVER, 2CPU_UNLIMITEDVC_PVA, 2CPU_UNLIMITED_HV_PVA, 10_EXT_WHITELABEL, REINSTATE_SUS, ADDONVZ-HMP-L-M, UO-1-L-M, 8CPU_5CT_PVA, 4CPU_100CT_PIM, SB10X-1000, ADDON-WPB-5000-M, 2CPU_5CT_PIM, 10_EXT, 5_UNITY_MOBILE_SITES, 4CPU_200CT_PIM, ADDON-WPB-40000-M, ADDON-WPB-30000-M, 5-LANGUAGE-PACKS-FOR-PPA, 3-LANGUAGE-PACKS-FOR-PPA, PCS-RKU, ADDONVZ-CT-OAS-L-M, 2-LANGUAGE-PACKS-FOR-PPA, 3_LANGUAGE_PACKS_FOR_VZ, 2CPU_30CT_PIM, ENTERPRISE, 2CPU_50CT_PIM, ADDON-HMP-W-M, 2_LANGUAGE_PACKS_FOR_VZ, 4_LANGUAGE_PACKS_FOR_VMM, UO-UNL-L-M, SB10X-12500, 4CPU_50CT_PIM, ADDON-WPB-20000-M, HSPHERE_10000_ACCOUNTS, 4CPU_3CT_PIM, 3_LANGUAGE_PACKS, 8CPU_90CT_PVA, 5000_SITES, 100_SITES, PLESK_POWER_PACK, 8CPU_400CT_PVA, 500_EXT, 5000_SITES_MULTI_SERVER, 5_LANGUAGE_PACKS_FOR_VMM, UNLIMITED_BATTLEFIELD_SERVERS, ADDON-WPB-35000-M, PLESK-100-SITES-FOR-VMM, ADDON-WPB-50000-M, 8CPU_4HV_PVA, 8CPU_5HV_PVA, 2CPU_10HV_PVA, ADDON-WPB-300-M, 2CPU_2HV_PVA, 300_SITES_MULTI_SERVER, 10_DOMAINS_FOR_VZ, 1_LANGUAGE_PACK, 4CPU_10CT_PIM, ADDON-WPB-700-M, 2CPU_30VC_PVA, 2CPU_1HV_PVA, 5_USERS_FOR_VPS, 2CPU_10CT_PIM, 500_SITES_MULTI_SERVER, 300_DOMAINS, 10000_SITES, 8CPU_2HV_PVA, ADDON-WPB-10000-M, PLESK_POWER_PACK_FOR_WIN_FOR_VMM, PLESK-1000-SITES-FOR-VMM, 5_LANGUAGE_PACKS, 1_LANGUAGE_PACK_FOR_VZ, 2CPU_200CT_PIM, VIRTUOZZO_PROMO_OFF, SB10X-5000, 8CPU_7HV_PVA, 10_DOMAINS, PRO, 500_SITES, 2CPU_70CT_PIM, 1_BATTLEFIELD_SERVER, 2CPU_150CT_PIM, 2CPU_80CT_PIM, ADDONVMM-HMP-L-M, UNLIMITED_USERS, 4CPU_30CT_PIM, PLESK_POWER_PACK_FOR_WIN_FOR_VZ, 8CPU_300CT_PVA, 5_USERS, 4CPU_150CT_PIM, 10_BATTLEFIELD_SERVERS, ADDON-WPB-100-M, 8CPU_3HV_PVA, ADDON-WPB-2500-M, 5_LANGUAGE_PACKS_FOR_VZ, 5_BATTLEFIELD_SERVERS, DISABLE_GOOGLE_TOOLS, 500_EXT_WHITELABEL, UNLIMITED_DOMAINS_FOR_VZ, SB10X-15000, UNLIMITED_MAILBOXES_FOR_VZ, 2CPU_5HV_PVA, PLESK_7X_FOR_WIN_POWER_PACK, PLESK-1000-SITES, DISABLE_FEATURE_UPGRADES, SB10X-20000, ENTRY, 2CPU_6HV_PVA, 8CPU_30CT_PVA, UO-UNL-W-1Y, 2_LANGUAGE_PACKS, 8CPU_UNLIMITEDVC_PVA, 100_DOMAINS, 8CPU_20CT_PVA, 2CPU_3HV_PVA, ADD_1_MANAGED_MSSQL, 100_EXT, 100_EXTENSIONS_FOR_VZ, ADDON-WPB-500-M, 8CPU_3CT_PVA, 2CPU_9HV_PVA, 1_LANGUAGE_PACK_FOR_VMM, 8CPU_10CT_PVA, 2CPU_15HV_PVA, 2CPU_8HV_PVA, STARTER, ADDONVMM-HMP-W-M, 7500_SITES, 4CPU_40CT_PIM, SB10X-30000, PROFESSIONAL, 1000_SITES, 8CPU_350CT_PVA, 2CPU_60CT_PIM, HSPHERE_200_ACCOUNTS, 8CPU_500CT_PVA, SB10X-10000, STH-WMP-BSC-M, ADDON-WPB-25000-M.
        [keyTypes] => Array
        (
        [0] => GLOBAL_MENTORING_LIVE_EXPERT_STANDARD_CARE
        [1] => PSBM_45_SPE
        [2] => PLESK-10-AND-LATER-FOR-VMM
        [3] => PLESK_ANTIVIRUS_BY_KAV_FOR_WIN_FOR_VZ
        [4] => PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-L-M
        [5] => MYLITTLEADMIN_2000
        [6] => MYLITTLEADMIN_2005
        [7] => PLESK_ANTIVIRUS_BY_DRWEB_FOR_WIN
        [8] => CRT-5-UNL-L
        [9] => GLOBAL_MENTORING_TOTAL_CARE
        [10] => LINUXMAGIC_MAGICSPAM
        [11] => PLESK_ANTIVIRUS_BY_KAV_FOR_VZ
        [12] => PINNACLE_CART_ECOMMERCE_SHOPPING_CART
        [13] => SYMANTEC_NORTON_INTERNET_SECURITY_10SEATS_MONTHLY
        [14] => ATI_PRO_FOR_WIN
        [15] => STOPTHEHACKER-M
        [16] => PARALLELS_PREMIUM_ANTIVIRUS_FOR_WIN_FOR_VZ
        [17] => SB10X-PA
        [18] => ATI_PRO
        [19] => CRT-30-UNL-L
        [20] => 4PSA_VOIPNOW_25_PROFESSIONAL
        [21] => CLOUDLINUX-L-M
        [22] => ATMAIL_WEBMAIL
        [23] => PLESK_10_AND_LATER_FOR_WIN
        [24] => CRT-5-100-L
        [25] => PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-FOR-VZ-L-1Y
        [26] => UNITY-ONE-W-M
        [27] => PLESK-10-AND-LATER-FOR-WIN-FOR-VMM
        [28] => GLOBAL_MENTORING_LIVE_EXPERT_BASIC
        [29] => CRT-50-UNL-L
        [30] => VIRTUOZZO_CONTAINERS_4
        [31] => PARALLELS_PREMIUM_ANTIVIRUS_FOR_VZ
        [32] => PLESK_10_AND_LATER_FOR_VZ
        [33] => PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-FOR-VZ-L-M
        [34] => CRT-50-100-L
        [35] => UNITY-ONE-L-M
        [36] => PLESK_ANTIVIRUS_BY_DRWEB
        [37] => SYMANTEC_NORTON_INTERNET_SECURITY_MONTHLY
        [38] => CRT-100-UNL-L
        [39] => PARALLELS-CLOUD-SERVER
        [40] => PARALLELS-PREMIUM-OUTBOUND-ANTISPAM-L-1Y
        [41] => CRT-100-100-L
        [42] => PLESK_10_AND_LATER_FOR_WIN_FOR_VZ
        [43] => PPA-L-M
        [44] => PARALLELS_PREMIUM_ANTIVIRUS_FOR_WIN
        [45] => PARALLELS-PREMIUM-ANTIVIRUS-FOR-VMM
        [46] => PLESK_ANTIVIRUS_BY_KAV_FOR_WIN
        [47] => PLESK_ANTIVIRUS_BY_DRWEB_FOR_VZ
        [48] => SYMANTEC_NORTON_INTERNET_SECURITY_5SEATS_MONTHLY
        [49] => UNITY_MOBILE
        [50] => PLESK_ANTIVIRUS_BY_DRWEB_FOR_WIN_FOR_VZ
        [51] => SB10X
        [52] => UNITY_MOBILE_FOR_WIN
        [53] => PARALLELS-CLOUD-STORAGE
        [54] => CRT-30-100-L
        [55] => CLOUDFLARE-M
        [56] => VIRTUOZZO_CONTAINERS_4_FOR_WIN
        [57] => PLESK_10_AND_LATER
        [58] => PARALLELS_PREMIUM_ANTIVIRUS
        [59] => SYMANTEC_NORTON_INTERNET_SECURITY_3SEATS_MONTHLY
        [60] => PLESK_ANTIVIRUS_BY_KAV
        [61] => KEEPIT_ONLINE_BACKUP
        )

        )
        */
    }
}